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']}')");
};

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

Другие вопросы по тегам