2012-06-07 23 views
6

Czy można mieć dwa mysqli_queries jak tak ?:Dwa mysqli odpytuje

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

Zasadniczo chcę zaktualizować dwie tabele w moim DB. Czy jest lepszy sposób to zrobić?

+1

możliwe uruchomienie 2 zapytań, oczywiście, że tak. –

+0

Mówisz, że to możliwe, ale powyższe nie działa. Wstawia się tylko do zdjęć, ale nie do images_history. – PartisanEntity

+0

Cóż, może powinieneś sprawdzić konkretne zapytanie dotyczące problemów, które nie ma nic wspólnego z żadnym innym zapytaniem. –

Odpowiedz

23

Jest to możliwe z mysqli_multi_query().

Przykład:

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

Kluczem jest to, że koniecznością użycie mysqli_multi_query jeśli chcesz wykonać więcej niż jedno zapytanie w jednym połączeniu. Ze względów bezpieczeństwa, mysqli_query nie będzie wykonywać wielu zapytań, aby zapobiec zastrzykom SQL.

Należy również pamiętać o zachowaniu się mysqli_store_result. Zwraca FALSE, jeśli zapytanie nie zawiera zestawu wyników (które nie są dostępne w zapytaniach INSERT), więc należy również sprawdzić, czy mysqli_error zwraca pusty łańcuch, co oznacza, że ​​pomyślnie zakończyło się INSERT.

Patrz:
mysqli_multi_query
mysqli_more_results
mysqli_next_result
mysqli_store_result

+0

Doskonałe dzięki, tak właśnie chciałbym to zrobić. – PartisanEntity

+2

I khow to jest stare, ale dla każdego, kto nadal używa mysqli_multi_query, jak @ dre010 wyjaśnia: _ Ze względów bezpieczeństwa mysqli_query nie będzie wykonywać wielu zapytań, aby zapobiec iniekcji SQL_.Więc myślę, że powinieneś rozważyć oddzielenie zapytania na kilka indywidualnych zapytań i użycie przygotowanego oświadczenia – David

+0

Jestem zdezorientowany na ten temat. Próbuję to zaadaptować, aby móc powiedzieć: "jeśli łańcuch zostanie znaleziony przez przeszukiwanie pierwszej tabeli, zwróć wyniki. Jeśli nie zostanie znaleziony, przeszukując pierwszą tabelę i nie zostanie znaleziony, przeszukując drugą tabelę, a następnie wstaw ją do drugiej tabeli. " Więc uruchom pierwszą instrukcję SELECT, ale uruchom drugą, jeśli pierwsza nie zwróci żadnych wyników. Czy istnieje sposób na rozróżnienie, która instrukcja SELECT ma być używana w mysqli_multi_query? –

0

Raz na zawsze! Użyj tej funkcji, aby uzyskać wyniki nieograniczonej liczby zapytań w dowolnym miejscu skryptu.

Funkcja:

Wystarczy przejść wyjścia wielofunkcyjnego zapytania do funkcji i zwraca wszystkie wyniki i błędy znalezione w każdym zapytaniu.

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

Zastosowanie:

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

Wyjście

$ wyjście obejmuje 2 tablice "Wynik" i "ERROR" zamówione przez zapytania. Na przykład, jeśli chcesz sprawdzić, czy wystąpiły błędy podczas wykonywania trzeciego zapytania i pobrać jego wynik, możesz wykonać następujące czynności: