Вставьте неизвестное количество строк в MySQL, используя PHP - PullRequest
1 голос
/ 20 декабря 2010

Я пытаюсь вставить неизвестное количество строк в MySQL, используя PHP.Вот как это должно работать:

  1. Javascript анализирует HTML DOM для создания многомерного массива на основе класса CSS.Массив будет иметь определенное количество строк (или подмассивов), соответствующее количеству элементов этого класса.(Это может быть любое целое число 0 или больше ... очевидно).

  2. Затем при событии JavaScript массив отправляется в сценарий PHP.

  3. PHP-скрипт вставит данные из массива в MySQL.

Моя проблема в том, что я не знаю, как сообщить моему PHP-скрипту, сколько значений вмассив.И я не знаю, как написать mysql_query (), не зная количества значений (или строк), которые должны быть вставлены.

Ответы [ 4 ]

3 голосов
/ 20 декабря 2010

Вы можете вставить более одной строки одновременно в MySQL:

INSERT INTO table1 (column1, column2, ...) VALUES (value_col1, value_col2), (value2_col1, value2_col2), ...;

В PHP вы можете построить свой запрос, просматривая строки и добавляя их в строку SQL:

$sql = "INSERT INTO table1 (col1, col2) VALUES ";
foreach($rows as $i=>$row) {
    if ($i>0) {
        $sql .= sprintf(",(%s,%s)", $row["col1_value"], $row["col2_value"]);
    } else {
        $sql .= sprintf("(%s,%s)", $row["col1_value"], $row["col2_value"]);
    }
}
mysql_query($sql);

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

1 голос
/ 20 декабря 2010

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

РЕДАКТИРОВАТЬ - вау, я положил explode, где я имел в виду implode несколько раз.исправлено.

Предполагается, что это так, и что каждый 'sub' массив является ассоциативным массивом в форме

[0]
     'id' => 1
     'name' => 'Billy'
     'DOB'  => .....
[1]
    etc.

И кодом для построения одного запроса, вставляющего все строки, например INSERT INTO table ('f1','f2',f3') VALUES ('v11', 'v22', 'v33'), ('v21', 'v22', 'v23'), ......

 $escapeAndQuote = function($x) {return "'".mysql_real_escape_string($x)."'";};
 $rowwise = function($x) {return '('. implode(', ', array_map($escapeAndQuote, $x)) .')'; 

 $fieldString = $rowwise(array_keys($arr[0]));
 $valString = implode(', ', array_map($rowwise, $arr));

 $sql = "INSERT INTO table $fieldString VALUES $valString";
 mysql_query($sql, $conn);
1 голос
/ 20 декабря 2010

Почему бы вам не подготовить двумерный массив при поиске с идентификатором класса css, как этот?

//This is jquery code - you can write javascript to do the same
$(`.class`).each(function(i,e){resultsArray.push($(this).val());}); 

Это избавит вас от головной боли при обходе многомерного массива в бэкэнде, и вы можете просто сделать count() в своем PHP-коде и выполнить следующую подготовку запроса.

Подготовка запроса
Предполагая, что у вас есть двумерный массив, вы можете использовать массовый запрос вставки, например так: -

INSERT INTO tablename (a,b)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three')

И подготовить запрос динамически, используя PHP следующим образом -

$counter = 0;
$valuesPart = NULL;
foreach($_POST as $each)
{
  if($counter > 0)
     $appendComma = ",";
  else
     $appendComma ="";
  $valuesPart .= $appendComma."(".$each['key1'].",".$each['key2'].")";
  $counter++;
}

if(!empty($valuesPart))
    $mysql_query = "INSERT INTO tablename (a,b)  VALUES ".$valuesPart;

Итак, вам не нужно знать, сколько результатов нужно вставить.

Если вы останетесь с многомерным массивом, вам, вероятно, потребуется код или поиск кода для обхода многомерного массива, который, вероятно, потребует рекурсии и большого количества сложного кода. Вероятность ошибок будет много, и она будет медленнее (может быть небольшой, но конечное количество не является обязательным).

0 голосов
/ 20 декабря 2010

Используйте цикл foreach для циклического перемещения по массиву.

//  Example:
    foreach($submitted_array as $insert_array)
    {
         //php and mysql insert query here
    }

Возможно, подготовленные выражения помогут вам в ваших начинаниях.По сути, вы будете объявлять универсальный оператор вставки, а затем «привязывать» значения к каждому входу.Подробнее на PHP PDO Подготовленные заявления .

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