Подтвердить что ты не робот

Выполнение нескольких SQL-запросов в одном выражении с помощью PHP

Как присоединить эти несколько запросов к одному (может я?)

$query = "DELETE FROM aktywne_kody WHERE kodsms ='$kodSMSgracza' AND typkodu ='$id'";
mysql_query($query) or die(mysql_error());

$query = "INSERT INTO uzyte_kody (gracz, kodsms, typkodu) VALUES ('$nickGracza', '$kodSMSgracza', '$id')";
mysql_query($query) or die("Błąd MySQL X04");

$query = "INSERT INTO do_odebrania (gracz, itemDATA, itemQTY) VALUES ('$nickGracza', '$itemDATA', '$itemQTY')";
mysql_query($query) or die("Błąd MySQL X05");

Кстати, лучше ли я делать mysql_close ($ db) после выполнения всех запросов?

4b9b3361

Ответ 1

Передать 65536 в mysql_connect в качестве 5-го параметра.

Пример:

$conn = mysql_connect('localhost','username','password', true, 65536 /* here! */) 
    or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    INSERT INTO table1 (field1,field2) VALUES(1,2);

    INSERT INTO table2 (field3,field4,field5) VALUES(3,4,5);

    DELETE FROM table3 WHERE field6 = 6;

    UPDATE table4 SET field7 = 7 WHERE field8 = 8;

    INSERT INTO table5
       SELECT t6.field11, t6.field12, t7.field13
       FROM table6 t6
       INNER JOIN table7 t7 ON t7.field9 = t6.field10;

    -- etc
");

Когда вы работаете с mysql_fetch_ * или mysql_num_rows или mysql_affected_rows, действителен только первый оператор.

Например, следующие коды, первый оператор INSERT, вы не можете выполнить mysql_num_rows и mysql_fetch_ *. Можно использовать mysql_affected_rows для возврата количества вставленных строк.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    INSERT INTO table1 (field1,field2) VALUES(1,2);
    SELECT * FROM table2;
");

Другой пример: следующие коды, первый оператор - SELECT, вы не можете выполнить mysql_affected_rows. Но вы можете выполнить mysql_fetch_assoc, чтобы получить пару значений ключа из строки, полученную из первого оператора SELECT, или вы можете выполнить mysql_num_rows, чтобы получить количество строк на основе первого оператора SELECT.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    SELECT * FROM table2;
    INSERT INTO table1 (field1,field2) VALUES(1,2);
");

Ответ 2

Это может быть вызвано SQL-точкой инъекции "SQL Injection Piggy-backed Queries". злоумышленники могут добавлять несколько вредоносных операторов sql. поэтому не добавляйте пользовательские входы непосредственно к запросам.

Вопросы безопасности

     

Функции API mysqli_query() и mysqli_real_query() не устанавливают флаг соединения, необходимый для активации нескольких запросов на сервере. Дополнительный вызов API используется для нескольких операторов, чтобы уменьшить вероятность случайных атак SQL-инъекций. Злоумышленник может попытаться добавить такие заявления, как; DROP DATABASE mysql или; SELECT SLEEP (999). Если злоумышленнику удается добавить SQL в строку оператора, но mysqli_multi_query не используется, сервер не будет выполнять второй, инъецированный и вредоносный SQL-запрос.

PHP Doc

Ответ 3

Вы можете просто добавить слово JOIN или добавить a; после каждой строки (как сказал @pictchubbate). Лучше это из-за удобочитаемости, и вы не должны мешать DELETE с INSERT; легко идти на юг.

Последний вопрос - вопрос дебатов, но насколько я знаю, вы должны закрыть после набора запросов. Это относится в основном к старым простым mysql/php, а не PDO, mysqli. В этих случаях ситуация становится более сложной (и подогревается в дебатах).

Наконец, я бы предложил использовать PDO или какой-либо другой метод.