2012-06-07 2 views
6

Можно ли иметь два mysqli_queries как так ?:Два MySQLi запросов

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()); 

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

+1

можно запустить 2 запроса, ну конечно. –

+0

Вы говорите, что это возможно, но выше не работает. Это только вставка в изображения, но не в images_history. – PartisanEntity

+0

хорошо, возможно, вам стоит проверить конкретный запрос на проблемы, это не имеет никакого отношения к какому-либо другому запросу. –

ответ

23

Возможно с 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

+0

Отлично, спасибо, это именно то направление, которое я хотел бы получить. – PartisanEntity

+2

Я так устал, но тем, кто все еще использует mysqli_multi_query, как @ dre010 объясняет: _ По соображениям безопасности mysqli_query не будет выполнять несколько запросов для предотвращения SQL-инъекций_.Поэтому я думаю, вы должны рассмотреть возможность разделить ваш запрос на несколько отдельных запросов и использовать подготовленное заявление – David

+0

Я в замешательстве об этом. Я пытаюсь адаптировать это, чтобы я мог сказать: «Если строка найдена путем поиска в первой таблице, верните результаты. Если он не найден путем поиска в первой таблице, и он не найден путем поиска во второй таблице, тогда вставьте его во вторую таблицу. ' Поэтому запустите первый оператор SELECT, но запустите только второй, если первый не возвращает никаких результатов. Есть ли способ различать, какой оператор SELECT вы хотите использовать в mysqli_multi_query? –

0

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

Функция:

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

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); 

Выход

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

if(isset($output['error'][2]) && $output['error'][2] !== ""){ 
    echo $output['error'][2]; 
}else{ 
    while($row = $output['result'][2]->fetch_assoc()) { 
    print_r($row); 
    } 
} 
Смежные вопросы