Mysql запрос внутри цикла php
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 ответа
Я предполагаю, что проблема здесь в том, что 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
цикл для этого (отредактированный, чтобы помочь вам отладить проблему):
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();
}
Я думаю, что проще использовать 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']}')");
}
Я надеюсь, что это решит вашу проблему!
Я постараюсь угадать, что 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);
}
И не забывайте об экранировании данных, которые вы передаете в базу данных!
Почему вы используете $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']}')");
};
Я надеюсь, вот и все!