Вставьте несколько строк в MySQL с помощью PHP, используя массивы foreach - PullRequest
1 голос
/ 30 ноября 2009

Я застрял, пытался понять это уже 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($_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);

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

Несколько вещей здесь не так:

  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, попробуйте написать, как, по вашему мнению, должен выглядеть запрос, а затем опубликуйте оба здесь Тогда, возможно, кто-то поможет вам перейти от одного к другому.

1 голос
/ 30 ноября 2009

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

$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, и в этом случае вам придется разделить вставку на несколько меньших запросов.

0 голосов
/ 30 ноября 2009
// 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);
}
0 голосов
/ 30 ноября 2009

Во-первых, экранируйте $ _POST [project_id] с помощью mysql_real_esape_string.

Тогда синтаксис вставляется в значения таблицы (...), (...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...