Как присоединить эти несколько запросов к одному (может я?)
$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 .