2012-06-07 19 views
6

¿Es posible tener dos mysqli_queries como así ?:Dos mysqli consulta

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

Básicamente quiero actualizar dos tablas en mi base de datos. ¿Hay una mejor manera de hacer esto?

+1

posible ejecutar 2 consultas, bueno, por supuesto que sí. –

+0

Usted dice que es posible, pero lo anterior no está funcionando. Solo se está insertando en imágenes pero no en images_history. – PartisanEntity

+0

bueno, tal vez debería comprobar la consulta en particular para los problemas, no tiene nada que ver con ninguna otra consulta. –

Respuesta

23

Es posible con mysqli_multi_query().

Ejemplo:

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

La clave es que imprescindible el uso mysqli_multi_query si se desea ejecutar más de una consulta en una sola llamada. Por razones de seguridad, mysqli_query no ejecutará múltiples consultas para evitar inyecciones de SQL.

También tenga en cuenta el comportamiento de mysqli_store_result. Devuelve FALSE si la consulta no tiene un conjunto de resultados (lo que no ocurre con las consultas INSERT), por lo que también debe marcar mysqli_error para ver si devuelve una cadena vacía, lo que significa que el INSERT fue exitoso.

Ver:
mysqli_multi_query
mysqli_more_results
mysqli_next_result
mysqli_store_result

+0

Perfecto muchas gracias, esta es exactamente la dirección en la que me gustaría tomar esto. – PartisanEntity

+2

I khow esto es viejo, pero para quien todavía está usando mysqli_multi_query, como @ dre010 explicar: _Por razones de seguridad, mysqli_query no ejecutará varias consultas para evitar inyecciones de SQL_.Así que creo que debería considerar separar su consulta en varias consultas individuales y usar la declaración preparada – David

+0

. Estoy confundido acerca de esto. Intento adaptar esto para poder decir, 'si se encuentra una cadena buscando en la primera tabla, devuelve los resultados. Si no se encuentra buscando en la primera tabla, y no se encuentra buscando en la segunda tabla, insértelo en la segunda tabla. ' Por lo tanto, ejecute la primera instrucción SELECT, pero solo ejecute la segunda si la primera no arroja resultados. ¿Existe alguna manera de diferenciar entre la instrucción SELECT que desea usar dentro de la mysqli_multi_query? –

0

una vez por todas! Utilice esta función para obtener resultados de un número ilimitado de consultas en cualquier parte de su secuencia de comandos.

Función:

Simplemente pasa el resultado de la consulta de varios a la función y devuelve todos los resultados y los errores encontrados en cada consulta.

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

Uso:

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

salida

$ salida incluye 2 arrays "número" y "error" ordenados por consulta. Por ejemplo, si necesita verificar si ha ocurrido algún error al ejecutar la tercera consulta y obtener su resultado, puede hacer:

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