MySQL несколько запросов в одном выражении - PullRequest
1 голос
/ 29 октября 2009

Я посмотрел на stackoverflow для похожего вопроса, но не нашел именно то, что искал, так что здесь. В phpMyAdmin у вас может быть несколько запросов в одном операторе, и он выполняет его для вас, например: '

UPDATE `test` WHERE `test2` = 4;
UPDATE `test` WHERE `test4` = 8;
UPDATE `test` WHERE `test8` = 1;

Теперь, если я попытаюсь сделать что-то подобное в PHP, это вообще не сработает. например:

 $test = 'UPDATE `test` SET `value` = "123" WHERE `test2` = 4;
             UPDATE `test` SET `value` = "321" WHERE `test4` = 8;
             UPDATE `test` SET `value` = "533" WHERE `test8` = 1;';
    mysql_query($test);

дает и ошибка:

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом с '; ОБНОВИТЬ test SET value = "123" WHERE test2 = 4; ОБНОВЛЕНИЕ test SE 'в строке 1

Можно ли даже объединить, скажем, несколько запросов, как указано выше, в одном выражении? Я хочу сделать это в следующей ситуации: (Логика этого, вероятно, очень плохая, но у меня мало опыта работы с MySQL, поэтому, пожалуйста, дайте мне знать, если есть лучший способ сделать это)

Следующие циклы за пару раз:

function SaveConfig($name, $value)
{
        global $sql_save_query;
    $sql = 'SELECT * FROM `config` WHERE `name` = "'.$name.'"';
    $res = mysql_query($sql);

    if($res)
    {
        $sql_save_query .= 'UPDATE `config` SET value = "'.$value.'" WHERE `name` = "' .$name. '"; '."\n";
    }
    else
    {
            $sql_save_query .= 'INSERT INTO `config`(`id`,`name`,`value`) VALUES("","' .$name. '","' .$value. '"); '."\n";
    }
}

Затем после завершения цикла он запускается:

mysql_query($sql_save_query);

Что выдает ошибку:

В вашем синтаксисе SQL есть ошибка; проверьте руководство, которое соответствует ваша версия сервера MySQL для правильный синтаксис для использования рядом с '; ОБНОВИТЬ config SET value = "" WHERE name = "Fcolour2"; ОБНОВЛЕНИЕ config SE 'в строка 1

Теперь мой другой вариант (на мой взгляд) - просто выполнять SQL-запрос после каждого цикла, по одному запросу за раз. Но разве это не было бы плохо / медленно / плохо?

Ответы [ 5 ]

3 голосов
/ 29 октября 2009

API php запрещает вам выполнять несколько запросов за один вызов, чтобы уменьшить вероятность атаки SQL инъекцией на ваш код (подумайте, что произойдет, если я передам '; UPDATE users SET admin=1 WHERE username='hacker' в ваш скрипт входа как имя пользователя). Вам нужно либо выполнить несколько операторов, либо обернуть логику своих утверждений в одно утверждение (что в вашем случае невозможно).

1 голос
/ 29 октября 2009

возможно, вы можете использовать INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

Некоторые другие полезные ссылки

http://dev.mysql.com/doc/refman/5.0/en/replace.html

http://www.mysqlperformanceblog.com/2007/01/18/insert-on-duplicate-key-update-and-replace-into/

1 голос
/ 29 октября 2009

Цикл, который вы имеете в своем примере, указывает на архитектурную проблему.

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

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

1 голос
/ 29 октября 2009

Невозможно выполнить несколько запросов, используя mysql_query.

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

INSERT INTO table (col1, col2) VALUES (0, 1), (2, 3), (4, 5); -- Insert 3 rows

Как правило, меньше запросов = лучше, но для обновлений вам просто нужно их сделать.

0 голосов
/ 15 марта 2013
$sqls = explode(";",$test);
foreach ($sqls as $key=>$sql) {
  if (strlen(trim($sql))>0) {
       mysql_query(trim($sql));
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...