Gewusst wie: einfügen von array in mysql mit PDO und bindParam?
Ich bin mit dem folgenden code. Der code funktioniert, aber ich will es ändern, so dass es verwendet bindparam
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$stqid=array();
for ($i=0; $i<$array_count; $i++){
$stqid[$i][0]=$lastInsertValue;
$stqid[$i][1]=$qid[$i][0];
$stqid[$i][2]=$qid[$i][1];
}
$values = array();
foreach ($stqid as $rowValues) {
foreach ($rowValues as $key => $rowValue) {
$rowValues[$key] = $rowValues[$key];
}
$values[] = "(" . implode(', ', $rowValues) . ")";
}
$count = $dbh->exec("INSERT INTO qresults(instance, qid, result) VALUES ".implode (', ', $values));
$dbh = null;
}
catch(PDOException $e){
echo $e->getMessage();
}
Ersetzte ich die folgende
$count = $dbh->exec("INSERT INTO qresults(instance, qid, result) VALUES ".implode (', ', $values));
mit
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:an_array)";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':an_array', implode(',', $values),PDO::PARAM_STR);
$stmt->execute();
aber das einfügen nicht mehr funktioniert (ich bekam keine Fehlermeldungen, obwohl).
FRAGE: Was mache ich falsch? Wie kann ich den code neu schreiben zu verwenden bindParam?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie versuchen, erstellen Sie eine Anweisung, und binden Sie ein param.
Anweisung sind groß, weil es potenziell zunichte machen jede Art von SQL-injection. Und Sie tut es, indem Sie entfernen das Konzept einer Abfrage nur als string. Die SQL-Abfrage wird als string mit einer Parameterliste und die dazugehörigen Daten wie die gebundenen Variablen.
Also die Abfrage ist nicht nur text, sondern text + Daten.
Ich meine:
Diese einfache Abfrage:
Es ist nicht sicher, da die Abfrage nur betrachtet als ein string. Und wenn $param wird nicht geprüft, es ist eine SQLi Loch.
Aber beim erstellen einer Anweisung, Ihre Abfrage wird:
Dann verwenden Sie bindparam geben Sie den Wert ein :param. Was bedeutet der Wert nicht angehängt, um die Abfrage-string, aber die Abfrage ist bereits analysiert und die Daten zur Verfügung gestellt.
In Ihrem Fall, Sie binden an die param :array-ein array implodiert (ich nehme an, "data1", "data2", etc..). Das ist nur ein parameter mit dem Wert als string ( "data1, data2, data3..." ), so wird es nur in einer Folge einfügen und nicht mehrere Einfügungen.
Können Sie Ihre Anweisung generation durch die Erzeugung einer Abfrage mit genug Parameter, um Ihre array
Dann Schleife auf das array und rufen Sie die Methode bindparam für jeden Parameter.
Dies funktionieren wird.
Bearbeiten: Diese Lösung zeigt, wie es funktioniert für ein ein-dimensionales array, kann aber leicht erweitert werden, um Ihr problem durch anpassen der Anweisung query generation und ändern Sie die bindparam-Schleife.
Ihre Anweisung sollte wie folgt aussieht:
Müssen Sie nur die Anzahl der Elemente einer Basis-array.