2016-09-19 3 views
1

Ich arbeite zum ersten Mal mit vorbereiteten Anweisungen, aber ich blieb bei diesem Fehler stecken. Aus irgendeinem Grund kann ich die Bindetypen nicht als Parameter übergeben?Probleme beim Binden von Werten

Mein Code:

function insert($table, $columns = array(), $bindTypes, $values = array()) { 
// Store connection. 
$connection = connection(); 
$columnValues = null; 
$index = 1; 

// Prepare unassigned value string. 
foreach ($columns as $column) { 
    $columnValues .= '?'; 
    if ($index < count($columns)) { 
     $columnValues .= ', '; 
    } 
    $index++; 
} 

// Debugg purpose: echo query example: 
echo "INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"; 

// Prepare statement. 
$statement = $connection->prepare("INSERT INTO {$table} (" . implode(', ', $columns) . ") VALUES ({$columnValues})"); 
$statement->bind_param($bindTypes, implode(', ', $values)); 
} 


insert('test', array('name'), 'i', array(1)); 

Wenn ich die Abfrage Beispiel erhalte ich "INSERT INTO-Test (Name) VALUES (?)" Echo.

Bitte verschonen Sie mich Ich bin immer noch ein lernender Noob.

Antwort

1

PHP> 5.6 Version:

function insert($connection, $table, $columns, $values) { 
    $columnStr = "`".implode("`,`",$columns); 
    $valueStr = str_repeat('?,', count($values) - 1) . '?'; 
    $types = str_repeat('s', count($values)); 
    $statement = $connection->prepare("INSERT INTO `$table` ($columnStr) VALUES ($valueStr)"); 
    $statement->bind_param($types, ...$values); 
    $statement->execute(); 
} 

insert($conn, 'test', ['name'], [1]); 

Beachten Sie, dass Sie sollten nie Tabellen- oder Spaltennamen aus Benutzereingaben nehmen, aber immer haben sie hart codiert in Ihrem Skript. Das macht eine eindeutige Funktion für den Einsatz ziemlich nutzlos.

+0

Hinweis: PHP/5.6 + wird wegen der Syntax [... $ values] (http://php.net/functions.arguments#functions.variable-arg-list) benötigt. –

0

Ich sehe, dass Sie Ihren Beitrag mit MySQLi markiert haben, was ich ziemlich sicher bin, ist das Problem hier.

Stattdessen würde ich mit PDO auf diesem gehen, wie es für eine variable Anzahl von Parametern in einer viel einfacheren Weise ermöglicht. Erlauben Sie etwas, das dem example 5 aus dem PHP Handbuch ziemlich ähnlich ist.

1

die bei the docs Werfen wir einen Blick:

Bool mysqli_stmt :: bind_param (string $ Arten, Misch & var1 $ [, mixed & $ ...])

Mit anderen Worten, zuerst Argument bestimmt Datentypen und Sie übergeben die Werte als einzelne Parameter ausgehend vom zweiten Parameter. Jedoch Sie diese haben:

$statement->bind_param($bindTypes, implode(', ', $values)); 

Sie die Kombination aller Einzelwerte in einem einzigen kommagetrennte Zeichenfolge, die, besonders nicht den geringsten Sinn. Wenn Sie berücksichtigen, dass die Funktion Argumente von Referenz erwartet.

+0

Danke. Ich sehe das Problem jetzt, obwohl ich keine Lösung finden kann. –

+0

@DennisCastelijns Welche PHP-Version verwenden Sie? –

+0

@YourCommonSense 5.5.9 –

Verwandte Themen