Legen Sie mehrere Zeilen in MySQL mit PHP unter Verwendung von foreach-Arrays
Frage
Im stecken, versucht, dies jetzt für 2 Stunden, um herauszufinden. Ich habe die foreach-Schleife herausgefunden, aber kann nicht herausfinden, wie die Daten nun eingefügt werden soll.
Hier ist mein php, was mache ich falsch?
$query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ";
foreach($_POST as $key => $value) {
$query .= "$thumb_path,$image_path,$main_image,$_POST[project_id])";
$result = mysql_query($query, $connection);
}
Danke!
Soll ich es liege wie dies aus, sorry noch ein Neuling auf foreach und wie es funktioniert.
foreach($_POST as $key => $value) {
$query = "INSERT INTO images VALUES (thumb_path, image_path, main_image, project_id),";
$query .= "$value[thumb_path], $value[$image_path], $value[$main_image], '$_POST[project_id'])";
}
$result = mysql_query($query, $connection);
Lösung
Mehrere Dinge falsch hier:
- Sie fehlt eine öffnende Klammer auf der Liste der Werte (nach
VALUES
) - Sie führen
mysql_query
bei jeder Iteration desforeach
. Stattdessen möchten Sie wahrscheinlich zuerst die Zeichenfolge bauen (mehrere Wertelisten verwenden), undmysql_query
außerhalb der Schleife ausgeführt werden. - Sie können nicht die
$_POST['project_id']
Variable in einen String auf diese Weise interpolieren - Sie müssen die
$_POST
Daten zu entkommen, bevor sie in die Datenbank setzen! - Sie sind nicht wirklich mit dem
$key
oder$value
von Ihrem foreach in Ihrer Anfrage, sie ist nur zu verwerfen es. - Die Variablen innerhalb der Schleife (
$thumb_path
etc.) wird das gleiche für jede Iteration der sein schlaufen so wirst du die gleichen Daten jedes Mal einzufügen. - Die Logik der Schleife macht einfach keinen Sinn machen. Sie wissen nicht, wie lange
$_POST
ist, oder was es sein könnte, also warum sind Looping Sie über$_POST
?
Einige Hinweise, um Ihnen all dies zu beheben:
- Überprüfen Sie die Fehlerprotokoll.
- die Zeichenfolge von SQL
var_dump
, bevor Sie die Abfrage ausführen, um zu überprüfen, ob es syntaktisch und logisch korrekt ist.
Wenn Sie weitere Hilfe benötigen, würde ich vorschlagen, dass Sie var_dump
was in $_POST
ist, versuchen zu schreiben, was Sie denken, die Abfrage aussehen sollte, und dann beide hier posten. Dann vielleicht jemand helfen Ihnen, von einem zum anderen gehen.
Andere Tipps
Ich finde so etwas wie dies viel einfacher ist eine wiederholte String-Verkettung zu halten, als wie Sie tun:
$values = array();
foreach ($_POST as $key => $value) {
$qvalue = mysql_real_escape_string($value);
$values[] = "($field1, $field2, $field3, $qvalue)"; // quoted value, not the raw value
}
$query_values = implode(',', $values);
$query = "INSERT INTO images (field1, field2, field3, field4) VALUES $query_values";
$result = mysql_query($query, $connection);
Denken Sie daran, dass, wenn eine Abfrage wie diese bauen, ist es durchaus möglich ist, eine Abfrage groß genug, um beim Aufbau der max_packet Länge auszunehmen, in dem Fall, dass Sie würde den Einsatz in mehrere kleinere Abfragen aufzuteilen.
Zuerst entkommen $ _POST [project_id] mit mysql_real_esape_string.
Dann wird die Syntax in Tabelle VALUES INSERT (...) (...)
// escape your input
$_POST = array_map('addslashes', $_POST);
// rather than recursively calling mysql_query, you can insert all your rows with one query
// INSERT INTO table (columns) VALUES (data), (data), (data), ...
$values = array();
foreach($_POST as $key => $value) {
$values[] = "('{$_POST['thumb_path']}', '{$_POST['image_path']}', '{$_POST['main_image']}', '{$_POST['project_id']}')";
}
if(sizeof($values)) {
$query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ".implode(',', $values);
$result = mysql_query($query, $connection);
}