Mysql запрос внутри цикла php - PullRequest
2 голосов
/ 05 января 2012
mysql_query("INSERT INTO fatture_servizi (id, rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES ('NULL', '$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')");

Мне нужно поместить его в цикл php, как

$c=count($services);
for($i=0;$i<$c;$i++){
mysql_query("INSERT INTO fatture_servizi (id, rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES ('NULL', '$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')");
};

Проблема в том, что он вставляет в БД только первое значение массива, а не каждое значение.

Массив $ services_global выглядит следующим образом, но он может измениться, поскольку он поступает из некоторых динамически генерируемых входных данных (на главной странице вы можете добавить столько служб, сколько пожелаете).

Array ( [0] => Array ( [service] => Hostess [amount] => 1 [unit_price] => Eu 120,00 [service_price] => Eu 120,00 [service_vat] => 21 ) [1] => Array ( [service] => Pullman [amount] => 4 [unit_price] => Eu 122,00 [service_price] => Eu 488,00 [service_vat] => 21 ) [2] => Array ( [service] => Cena [amount] => 100 [unit_price] => Eu 100,00 [service_price] => Eu 10.000,00 [service_vat] => 10 ))

Ответы [ 4 ]

5 голосов
/ 05 января 2012

Я предполагаю, что проблема в том, что id - это ваш автоинкрементный первичный ключ, и вы пытаетесь присвоить ему статическую строку 'NULL' на каждой итерации.

Попробуйте это:

mysql_query("INSERT INTO fatture_servizi (id, rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES (NULL, '$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')");

... или еще лучше, удалите id запрос все вместе:

mysql_query("INSERT INTO fatture_servizi (rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES ('$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')");

Кроме того, для этого лучше использовать цикл foreach ( EDITED , чтобы помочь вам отладить проблему):

foreach ($services_global as $service) {
  $query = "INSERT INTO fatture_servizi
              (rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) 
            VALUES
              ('$invoice_rif', '{$service['service']}', '{$service['amount']}', '{$service['unit_price']}', '{$service['service_price']}', '{$service['service_vat']}')";
  echo "Attempting query: $query\n";
  if (!mysql_query($query)) echo "MySQL Error: ".mysql_error();
}
2 голосов
/ 05 января 2012

Я думаю, что проще использовать foreach:

foreach($services as $row){
    mysql_query("INSERT INTO fatture_servizi (id, rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES (NULL, '$invoice_rif', '{$row['service']}', '{$row['amount']}', '{$row['unit_price']}', '{$row['service_price']}', '{$row['service_vat']}')");
}

Я надеюсь, это решит вашу проблему!

0 голосов
/ 05 января 2012

Я попытаюсь угадать, что id - ваш первичный ключ, и вы пытаетесь вставить все свои записи с одинаковым id = 'NULL'.Обычно первичный ключ является целым числом, поэтому странно, что вы не получаете исключение вместо вставки данных.Наиболее распространенным решением является использование целочисленного автоинкрементного первичного ключа, тогда вам не нужно беспокоиться о его вставке:

SQL:

CREATE TABLE `fatture_servizi` (
  `id` int(11) NOT NULL auto_increment,
  /* other columns */
);

PHP:

$c=count($services);
for($i=0;$i<$c;$i++){
    $sql = "INSERT INTO fatture_servizi 
(rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) 
VALUES 
('$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')";
    mysql_query($sql);
};

Кроме того, INSERT довольно тяжелая операция.Если это возможно, я бы использовал массовые вставки:

$c=count($services);
$rows = array();
for($i=0;$i<$c;$i++){
    $rows[] = "('$invoice_rif', '{$services_global[$i]['service']}', '{$services_global[$i]['amount']}', '{$services_global[$i]['unit_price']}', '{$services_global[$i]['service_price']}', '{$services_global[$i]['service_vat']}')";
}
if(!empty($rows)) {
    $sql = "INSERT INTO fatture_servizi (rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES " . implode(',', $rows) . ";";
    mysql_query($sql);
}

И не забывайте об экранировании данных, передаваемых в базу данных!

0 голосов
/ 05 января 2012

Почему вы используете $ services_global в VALUES () и используете count ($ services) ... Они одинаковы? Это может быть ваша ошибка ...

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

foreach($services_global as $service){
    mysql_query("INSERT INTO fatture_servizi (id, rif_fattura, servizio, quantita, prezzo_unitario, prezzo_servizio, iva) VALUES ('NULL', '$invoice_rif', '{$service['service']}', '{$service['amount']}', '{$service['unit_price']}', '{$service['service_price']}', '{$service['service_vat']}')");
};

Я надеюсь, вот и все!

...