Question

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 souhaite 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?

Était-ce utile?

La solution

Mise à jour : apparemment possible en passant un indicateur à mysql_connect () . Voir exécution de plusieurs requêtes SQL dans une instruction avec PHP Néanmoins, tout lecteur actuel devrait é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, vous pouvez utiliser mysqli et le mysqli_multi_query -fonction.

Autres conseils

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

Pour ce que cela vaut, PDO prend en charge les requêtes multiples par défaut et vous pouvez effectuer une itération sur plusieurs jeux de résultats 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, les requêtes multiples sont généralement considérées comme une mauvaise idée pour des raisons de sécurité. Si vous ne faites pas attention à la façon dont vous construisez vos chaînes de requête, vous pouvez obtenir le type exact de vulnérabilité de l'injection SQL indiquée dans la classique " Petites tables de Bobby " Bande dessinée XKCD . Lorsque vous utilisez une API qui vous limite à une seule requête, cela ne peut pas arriver.

Vous ne pouvez pas utiliser SQL_CALC_FOUND_ROWS .

  

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 l’a déjà souligné votre question précédente, l’utilisation de SQL_CALC_FOUND_ROWS est souvent plus lente que l’obtention d’un 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;

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

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

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

Il est indiqué sur le site PHP que les 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) . Donc, vous ne pouvez pas le faire en PHP, MAIS, pourquoi ne pas simplement exécuter cette requête dans un autre appel mysql_query (comme dans l'exemple de Jon)? Le résultat devrait quand même être correct si vous utilisez la même connexion. De même, mysql_num_rows peut également aider.

Oui, il est possible de ne pas utiliser l'extension MySQLi.

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

Voir les commentaires ci-dessous Le message de Husni pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top