web-dev-qa-db-fra.com

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

J'ai deux questions, 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 dites-moi ensuite comment je vais gérer chaque jeu de tables séparément. En fait, dans 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 de même avec PHP/MYSQL?

29
Prashant

Update: Apparemment possible en passant un indicateur à mysql_connect(). Voir Exécution de plusieurs requêtes SQL dans une seule instruction avec PHP Néanmoins, tout lecteur actuel doit éviter d'utiliser la classe de fonctions mysql_- et préférer les fonctions PDO.

Vous ne pouvez pas faire cela en utilisant le mysql-api habituel en PHP. Il suffit d'exécuter deux requêtes. Le second sera si rapide que cela n'aura pas d'importance. Ceci est un exemple typique d'optimisation micro. Ne t'inquiète pas pour ça.

Pour mémoire, cela peut être fait avec mysqli et la fonction mysqli_multi_query -.

32
Emil H

Vous devez utiliser MySQLi, le code ci-dessous 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();
?>
3
user2155518

En utilisant SQL_CALC_FOUND_ROWS vous ne pouvez pas.

Le nombre de lignes disponibles via FOUND_ROWS () est transitoire et n'est pas destiné à être disponible après l'instruction qui suit l'instruction SELECT SQL_CALC_FOUND_ROWS.

Comme quelqu'un l'a souligné dans votre question précédente, l'utilisation de SQL_CALC_FOUND_ROWS est souvent plus lente que le simple calcul du nombre.

Vous feriez peut-être mieux de le faire comme sous-requête:

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
tpdi

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
Jon Benedicto

Comme ça:

$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
Jon Benedicto

Il est indiqué sur le site PHP que plusieurs requêtes ne sont PAS autorisées (EDIT: cela n’est vrai que pour l’extension mysql. Mysqli et PDO autorisent plusieurs requêtes). en PHP, MAIS, pourquoi ne pouvez-vous pas exécuter cette requête dans un autre appel mysql_query (comme dans l'exemple de Jon)? Il devrait quand même vous donner le bon résultat si vous utilisez la même connexion. En outre, mysql_num_rows peut aussi aider.

0
Michael Pryor

Oui, il est possible sans utiliser l'extension MySQLi. 

Utilisez simplement CLIENT_MULTI_STATEMENTS dans le cinquième argument de mysql_connect.

Reportez-vous aux commentaires ci-dessous Message de Husni pour plus d'informations.

0
Pacerier