Вставьте несколько строк в MySQL с помощью PHP, используя массивы foreach.

StackOverflow https://stackoverflow.com/questions/1816979

Вопрос

Я застрял, пытаюсь понять это уже 2 часа.Я разобрался с циклом foreach, но не могу понять, как теперь вставить данные.

вот мой php, что я делаю не так?

    $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);
}

Спасибо!

Стоит ли выкладывать вот так, извините еще новичок в foreach и как это работает.

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);
Это было полезно?

Решение

Здесь несколько ошибок:

  1. В списке значений отсутствует открывающая скобка (после VALUES)
  2. Ты бегаешь mysql_query на каждой итерации foreach.Вместо этого вы, вероятно, захотите сначала создать строку (используя списки с несколькими значениями) и запустить mysql_query вне цикла.
  3. Вы не можете интерполировать $_POST['project_id'] переменная в строку таким образом
  4. Вам нужно сбежать из $_POST данные перед помещением их в базу данных!
  5. Вы на самом деле не используете $key или $value из вашего foreach в вашем запросе вы просто отбрасываете его.
  6. Переменные внутри цикла ($thumb_path и т. д.) будет одинаковым для каждой итерации цикла, поэтому вы будете каждый раз вставлять одни и те же данные.
  7. Логика цикла просто не имеет смысла.Вы не знаете, как долго $_POST есть или что в нем может быть, так почему вы зацикливаетесь $_POST?

Несколько советов, которые помогут вам все это исправить:

  1. Проверьте журнал ошибок.
  2. var_dump строку SQL перед выполнением запроса, чтобы проверить, является ли он синтаксически и логически правильным.

Если вам нужна дополнительная помощь, я бы посоветовал вам var_dump что в $_POST, попробуйте написать, как, по вашему мнению, должен выглядеть запрос, а затем опубликуйте и то, и другое здесь.Тогда, возможно, кто-то поможет вам перейти от одного к другому.

Другие советы

Я считаю, что что-то подобное гораздо проще поддерживать, чем повторяющуюся конкатенацию строк, как вы это делаете:

$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);

Просто имейте в виду, что при построении такого запроса вполне возможно создать запрос, достаточно большой, чтобы исключить длину max_packet, и в этом случае вам придется разделить вставку на несколько меньших запросов.

Сначала экранируйте $_POST[project_id] с помощью mysql_real_esape_string.

Затем синтаксис это INSERT INTO table VALUES (...), (...)

// 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top