Два запроса mysqli

Возможно ли иметь два mysqli_queries:

mysqli_query($dblink, "INSERT INTO images (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName')") or die(mysql_error()); mysqli_query($dblink, "INSERT INTO images_history (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName', '$day', '$month', '$year')") or die(mysql_error()); 

В основном я хочу обновить две таблицы в моей БД. Есть лучший способ сделать это?

Related of "Два запроса mysqli"

Это возможно с помощью mysqli_multi_query () .

Пример:

 <?php $mysqli = new mysqli($host, $user, $password, $database); // create string of queries separated by ; $query = "INSERT INTO images (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName');"; $query .= "INSERT INTO images_history (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName', '$day', '$month', '$year');"; // execute query - $result is false if the first query failed $result = mysqli_multi_query($mysqli, $query); if ($result) { do { // grab the result of the next query if (($result = mysqli_store_result($mysqli)) === false && mysqli_error($mysqli) != '') { echo "Query failed: " . mysqli_error($mysqli); } } while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); // while there are more results } else { echo "First query failed..." . mysqli_error($mysqli); } 

Ключ в том, что вы должны использовать mysqli_multi_query если вы хотите выполнить несколько запросов в одном вызове. По соображениям безопасности mysqli_query не будет выполнять несколько запросов для предотвращения инъекций SQL.

Также имейте в виду поведение mysqli_store_result . Он возвращает FALSE если запрос не имеет набора результатов (в запросах INSERT нет), поэтому вы также должны проверить mysqli_error чтобы увидеть, что он возвращает пустую строку, что означает, что INSERT был успешным.

Видеть:
mysqli_multi_query
mysqli_more_results
mysqli_next_result
mysqli_store_result

Однажды и на всегда! Используйте эту функцию для получения результатов неограниченного количества запросов в любом месте вашего скрипта.

Функция:

Вы просто передаете результат мультипроцесса функции и возвращаете все результаты и ошибки, обнаруженные в каждом запросе.

  function loop_multi($result){ //use the global variable $conn in this function global $conn; //an array to store results and return at the end $returned = array("result"=>array(),"error"=>array()); //if first query doesn't return errors if ($result){ //store results of first query in the $returned array $returned["result"][0] = mysqli_store_result($conn); //set a variable to loop and assign following results to the $returned array properly $count = 0; // start doing and keep trying until the while condition below is not met do { //increase the loop count by one $count++; //go to the next result mysqli_next_result($conn); //get mysqli stored result for this query $result = mysqli_store_result($conn); //if this query in the loop doesn't return errors if($result){ //store results of this query in the $returned array $returned["result"][$count] = $result; //if this query in the loop returns errors }else{ //store errors of this query in the $returned array $returned["error"][$count] = mysqli_error($conn); } } // stop if this is false while (mysqli_more_results($conn)); }else{ //if first query returns errors $returned["error"][0] = mysqli_error($conn); } //return the $returned array return $returned; } 

Применение:

 $query = "INSERT INTO table1 (attribute1) VALUES ('value1');"; $query .= "INSERT INTO table2 (attribute2) VALUES ('value2');"; $query .= "SELECT * FROM table3;"; //execute query $result = mysqli_multi_query($conn, $query); //pass $result to the loop_multi function $output = loop_multi($result); 

Вывод

$ output включает в себя 2 массива «результат» и «ошибка», упорядоченные по запросу. Например, если вам нужно проверить, произошли ли какие-либо ошибки при выполнении третьего запроса и извлечении его результата, вы можете:

 if(isset($output['error'][2]) && $output['error'][2] !== ""){ echo $output['error'][2]; }else{ while($row = $output['result'][2]->fetch_assoc()) { print_r($row); } }