2013-07-10 6 views
-2

Пытается выполнить следующий PHP-код, однако только первый оператор успешно выполняется, а остальные - нет.PHP с использованием MySQL 'mysqli_multi_query' более одного раза?

<?php 

$link = mysqli_connect('localhost', 'root', ''); 
mysqli_select_db($link, 'database_name'); 


$update = " UPDATE `temp` SET `price` = 1000 WHERE `id` = 1; 
      UPDATE `temp` SET `price` = 2000 WHERE `id` = 2; 
      UPDATE `temp` SET `price` = 3000 WHERE `id` = 3; 
      UPDATE `temp` SET `price` = 4000 WHERE `id` = 4; 
      UPDATE `temp` SET `price` = 5000 WHERE `id` = 5;"; 

mysqli_multi_query($link, $update); 

$update2 = "UPDATE `temp` SET `price` = 6000 WHERE `id` = 6; 
      UPDATE `temp` SET `price` = 7000 WHERE `id` = 7; 
      UPDATE `temp` SET `price` = 8000 WHERE `id` = 8; 
      UPDATE `temp` SET `price` = 9000 WHERE `id` = 9; 
      UPDATE `temp` SET `price` = 10000 WHERE `id` = 10;"; 

mysqli_multi_query($link, $update2); 

?> 

mysqli_multi_query ($ ссылка, $ обновление); - успешно выполнен

mysqli_multi_query ($ ссылка, $ Update2); - Не выполнено.

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

+0

Почему бы не проверить наличие ошибок и посмотреть, не работают ли запросы? http://php.net/manual/en/mysqli.error.php –

+0

Запрос работает, если я свяжу их с одной переменной и выполняю именно это. –

+0

'Не выполняются' и' запросы работают' довольно противоречивые заявления –

ответ

0

Вы должны принести все результаты - например:

// here: first multi query 

// fetch all results 
while(mysqli_more_results($link)){ 
    $result = mysqli_store_result($link); 
    mysqli_next_result($link); 
} 

// here: second multi query 

Некоторых системы SQL в некоторых языках являются «ленивыми». Они отправляют запрос только тогда, когда вы запрашиваете результаты (например, LINQ в C#). Возможно, PHP делает то же самое. Он блокирует соединение, ожидающее получения результатов.

+0

Для «не ленивых» языков я прочитал в комментариях @ http://php.net/manual/en/mysqli.multi-query.php, что одна строка адекватна: while (mysqli_next_result ($ link)) { ;} // flush multi_queries – mickmackusa

1

Как насчет использования только один запрос

UPDATE `temp` 
SET `price` = case when id = 1 then 1000 
        when id = 2 then 2000 
        when id = 3 then 3000 
        when id = 4 then 4000 
        when id = 5 then 5000 
        when id = 6 then 6000 
        when id = 7 then 7000 
        when id = 8 then 8000 
        when id = 9 then 9000 
        when id = 10 then 10000 
        else price 
       end 
+0

Я бы сделал это, но мой вышеприведенный оператор находится в цикле, поэтому на финише каждого цикла будет выполнять эту партию, а затем работать дальше. –

+0

Этот ответ является наилучшим рекомендуемым решением для вашей ошибки. По правде говоря, лучшая практика означает выполнение минимального количества вызовов базы данных. Неважно, сколько циклов вы используете. Создайте единый массив значений «id» и «price», после чего завершите завершение итерации, постройте свой единственный запрос и отправьте данные в базу данных. – mickmackusa

-2

ли вы попробовать объединить все свои обновления в одну, а затем запустить его?

$link = mysqli_connect('localhost', 'root', ''); 
mysqli_select_db($link, 'database_name'); 


$update = " UPDATE `temp` SET `price` = 1000 WHERE `id` = 1; 
     UPDATE `temp` SET `price` = 2000 WHERE `id` = 2; 
     UPDATE `temp` SET `price` = 3000 WHERE `id` = 3; 
     UPDATE `temp` SET `price` = 4000 WHERE `id` = 4; 
     UPDATE `temp` SET `price` = 5000 WHERE `id` = 5; 
     UPDATE `temp` SET `price` = 6000 WHERE `id` = 6; 
     UPDATE `temp` SET `price` = 7000 WHERE `id` = 7; 
     UPDATE `temp` SET `price` = 8000 WHERE `id` = 8; 
     UPDATE `temp` SET `price` = 9000 WHERE `id` = 9; 
     UPDATE `temp` SET `price` = 10000 WHERE `id` = 10;"; 

    mysqli_multi_query($link, $update); 
+0

Расскажите мне, почему это полезно? –

0
$sql = "UPDATE temp SET price = ? WHERE id = ?"; 
$stm = $link->prepare($sql); 
$link->autocommit(FALSE); 
$stm->bind_param("ii" $row['price'], $row['id']); 
foreach ($array as $row) { 
    $stm->execute(); 
} 
$link->commit(); 

что-то подобное, но не проверял. Я всегда презирал Mysqli способа борьбы с подготовленным заявлением