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?

È stato utile?

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.

è 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top