Come eseguire due query mysql come una in PHP / MYSQL?
Domanda
Ho due query, come segue:
SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();
Voglio eseguire entrambe queste query in un solo tentativo.
$result = mysql_query($query);
Ma poi dimmi come gestirò ogni set di tabelle separatamente. In realtà in ASP.NET utilizziamo un set di dati che gestisce due query come
ds.Tables[0];
ds.Tables[1]; .. etc
Come posso fare lo stesso usando PHP / MYSQL?
Soluzione
Aggiornamento: apparentemente possibile passando una bandiera a mysql_connect ()
. Vedi Esecuzione di più query SQL in un'unica istruzione con PHP Tuttavia, qualsiasi lettore corrente dovrebbe evitare di usare la classe di funzioni mysql_
e preferire DOP.
Non puoi farlo usando il normale mysql-api in PHP. Esegui solo due query. Il secondo sarà così veloce che non avrà importanza. Questo è un tipico esempio di micro ottimizzazione. Non preoccuparti.
Per la cronaca, si può fare usando mysqli e mysqli_multi_query -funzione.
Altri suggerimenti
Come altri hanno risposto, l'API mysqli può eseguire più query con la funzione msyqli_multi_query ().
Per quello che vale, PDO supporta le query multiple per impostazione predefinita e puoi scorrere i set di risultati multipli delle tue query multiple:
$stmt = $dbh->prepare("
select sql_calc_found_rows * from foo limit 1 ;
select found_rows()");
$stmt->execute();
do {
while ($row = $stmt->fetch()) {
print_r($row);
}
} while ($stmt->nextRowset());
Tuttavia, per motivi di sicurezza, la multi-query è considerata ampiamente una cattiva idea . Se non stai attento a come costruire le stringhe di query, puoi effettivamente ottenere il tipo esatto di vulnerabilità dell'iniezione SQL mostrata nella classico " Tavolini Bobby " Cartone animato XKCD . Quando si utilizza un'API che ti limita alla query singola, ciò non può accadere.
Usando SQL_CALC_FOUND_ROWS
non puoi.
Il conteggio delle righe disponibile tramite FOUND_ROWS () è temporaneo e non deve essere disponibile oltre l'istruzione che segue l'istruzione SELECT SQL_CALC_FOUND_ROWS.
Come qualcuno ha notato nella tua precedente domanda, l'utilizzo di SQL_CALC_FOUND_ROWS
è spesso più lento del semplice conteggio.
Forse sarebbe meglio farlo come sottoquery:
SELECT
(select count(*) from my_table WHERE Name LIKE '%prashant%')
as total_rows,
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
Dovrai usare l'estensione MySQLi se non vuoi eseguire una query due volte:
if (mysqli_multi_query($link, $query))
{
$result1 = mysqli_store_result($link);
$result2 = null;
if (mysqli_more_results($link))
{
mysqli_next_result($link);
$result2 = mysqli_store_result($link);
}
// do something with both result sets.
if ($result1)
mysqli_free_result($result1);
if ($result2)
mysqli_free_result($result2);
}
Devi usare MySQLi, sotto il codice funziona bene
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
In questo modo:
$result1 = mysql_query($query1);
$result2 = mysql_query($query2);
// do something with the 2 result sets...
if ($result1)
mysql_free_result($result1);
if ($result2)
mysql_free_result($result2);
Sul sito PHP si afferma che NON sono consentite più query (EDIT: questo vale solo per l'estensione mysql. mysqli e PDO consentono più query) . Quindi non puoi farlo in PHP, MA, perché non puoi semplicemente eseguire quella query in un'altra chiamata mysql_query (come nell'esempio di Jon)? Dovresti comunque darti il ??risultato corretto se usi la stessa connessione. Inoltre, mysql_num_rows può essere di aiuto.
Sì è possibile senza utilizzare l'estensione MySQLi.
Usa semplicemente CLIENT_MULTI_STATEMENTS
nel quinto argomento di mysql_connect
.
Fai riferimento ai commenti di seguito Post di Husni per ulteriori informazioni.