Выполнение нескольких 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) после выполнения всех запросов?

Передайте 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); "); 

Это может быть создано 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

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

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

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

С mysqli вы можете использовать несколько операторов для реального использования mysqli_multi_query() .

Подробнее о нескольких операторах в Документах по PHP .