Comment exécuter deux requêtes mysql comme une seule dans PHP / MYSQL?

j'ai deux requêtes, comme suit:

SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();

je veux exécuter ces deux requêtes en une seule tentative.

$result = mysql_query($query);

mais alors dites-moi comment je vais gérer chaque table séparément. En fait, ASP.NET nous utilisons un ensemble de données qui traite deux requêtes comme

ds.Tables[0];
ds.Tables[1]; .. etc

Comment puis-je faire la même chose en utilisant PHP/MYSQL?

28
demandé sur Luiggi Mendoza 2009-04-29 17:47:28

8 réponses

mise à jour: apparemment possible en passant un drapeau à mysql_connect() . Voir exécuter plusieurs requêtes SQL dans une seule instruction avec PHP néanmoins, tout lecteur courant devrait éviter d'utiliser la classe mysql_ -de fonctions et de préférer PDO.

vous ne pouvez pas faire cela en utilisant l'api mysql régulière en PHP. Juste exécuter deux requêtes. La seconde sera si rapide que ça n'aura plus d'importance. C'est un exemple typique de micro optimisation. Ne vous inquiétez pas à ce sujet.

Pour l'enregistrement, il peut être fait à l'aide de mysqli et le mysqli_multi_query -fonction.

32
répondu Emil H 2017-05-23 11:55:04

comme d'autres ont répondu, l'API mysqli peut exécuter des requêtes multiples avec la fonction msyqli_multi_query ().

pour ce que cela vaut, PDO prend en charge la multi-requête par défaut, et vous pouvez itérer sur les ensembles de résultats multiples de vos requêtes multiples:

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

cependant, multi-query est assez largement considéré comme une mauvaise idée pour des raisons de sécurité. Si vous n'êtes pas prudent sur la façon dont vous construisez vos chaînes de requête, vous pouvez en fait obtenir le type exact de vulnérabilité D'injection SQL indiqué dans le classic "Little Bobby Tables" xkcd cartoon . Lorsque vous utilisez une API qui vous restreint à une seule requête, cela ne peut pas se produire.

7
répondu Bill Karwin 2013-04-04 05:48:40

en utilisant SQL_CALC_FOUND_ROWS vous ne pouvez pas.

le nombre de lignes disponible par le biais de FOUND_ROWS() est transitoire et n'est pas destiné à être disponible après la déclaration suivant la déclaration SELECT SQL_CALC_FOUND_ROWS.

comme quelqu'un l'a noté dans votre question précédente, l'utilisation de SQL_CALC_FOUND_ROWS est souvent plus lente qu'un simple comptage.

peut-être que vous feriez mieux de le faire en tant que subquery:

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;
3
répondu tpdi 2009-04-29 14:03:40

vous devrez utiliser L'extension MySQLi si vous ne voulez pas exécuter une requête deux fois:

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);
}
3
répondu Jon Benedicto 2009-04-29 14:09:24

comme ceci:

$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);
2
répondu Jon Benedicto 2009-04-29 13:51:50

vous devez utiliser MySQLi, ci-dessous le code fonctionne bien

<?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();
?>
2
répondu 2013-04-04 05:11:57

il est dit sur le site PHP que les requêtes multiples ne sont pas autorisées (EDIT: ceci n'est vrai que pour l'extension mysql. mysqli et PDO permettent des requêtes multiples) . Donc, vous ne pouvez pas le faire en PHP, mais, pourquoi ne pouvez-vous pas simplement exécuter cette requête dans un autre appel mysql_query, (comme L'exemple de Jon)? Il devrait tout de même vous donner le bon résultat si vous utilisez la même connexion. Aussi, mysql_num_rows peut aider aussi.

0
répondu Michael Pryor 2009-04-29 20:32:03

Oui est possible sans utiliser l'extension MySQLi.

il suffit D'utiliser CLIENT_MULTI_STATEMENTS dans mysql_connect cinquième argument.

se Référer aux commentaires ci-dessous Husni post pour plus d'informations.

0
répondu Pacerier 2017-05-23 11:47:23