webentwicklung-frage-antwort-db.com.de

Wie führt man zwei MySQL-Abfragen als eine in PHP/MYSQL aus?

Ich habe zwei Fragen, wie folgt:

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

Ich möchte beide Abfragen in einem einzigen Versuch ausführen. 

$result = mysql_query($query);

Aber dann sag mir, wie ich mit den einzelnen Tischen getrennt umgehen werde. Tatsächlich verwenden wir in ASP.NET ein Dataset, das zwei Abfragen als verarbeitet

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

Wie kann ich dasselbe mit PHP/MYSQL machen?

29
Prashant

Update: Scheinbar möglich, indem ein Flag an mysql_connect() übergeben wird. Siehe Mehrere SQL-Abfragen in einer Anweisung mit PHP ausführen Trotzdem sollte jeder aktuelle Reader die Verwendung der Klasse mysql_- vermeiden und PDO vorziehen.

Sie können das nicht mit der regulären MySQL-API in PHP tun. Führen Sie einfach zwei Abfragen aus. Der zweite wird so schnell sein, dass es keine Rolle spielt. Dies ist ein typisches Beispiel für die Mikrooptimierung. Mach dir keine Sorgen darüber.

Für das Protokoll kann dies mit mysqli und der Funktion mysqli_multi_query - ausgeführt werden.

32
Emil H

Wie andere geantwortet haben, kann die mysqli-API mit der Funktion msyqli_multi_query () mehrere Abfragen ausführen.

PDO unterstützt standardmäßig mehrere Abfragen, und Sie können die mehreren Ergebnismengen Ihrer mehreren Abfragen durchlaufen:

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

Multi-Query wird jedoch aus Sicherheitsgründen allgemein als schlechte Idee angesehen. Wenn Sie nicht genau wissen, wie Sie Ihre Abfragezeichenfolgen erstellen, können Sie tatsächlich die genaue Art der SQL-Injection-Sicherheitsanfälligkeit abrufen, die im klassischer XKCD-Cartoon "Little Bobby Tables" angegeben ist. Wenn Sie eine API verwenden, die Sie auf Einzelabfragen beschränkt, kann dies nicht passieren.

8
Bill Karwin

Sie müssen MySQLi verwenden, der folgende Code funktioniert gut

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

Mit SQL_CALC_FOUND_ROWS geht das nicht.

Die durch FOUND_ROWS () verfügbare Zeilenzählung ist vorübergehend und soll nach der Anweisung nach der Anweisung SELECT SQL_CALC_FOUND_ROWS nicht verfügbar sein.

Wie bereits in Ihrer früheren Frage erwähnt, ist die Verwendung von SQL_CALC_FOUND_ROWS häufig langsamer als das Zählen.

Vielleicht sollten Sie dies am besten als Unterabfrage tun:

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

Sie müssen die MySQLi-Erweiterung verwenden, wenn Sie eine Abfrage nicht zweimal ausführen möchten:

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

So was:

$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

Auf der Site PHP heißt es, dass mehrere Abfragen NICHT zulässig sind (EDIT: Dies gilt nur für die Erweiterung mysql. Mysqli und PDO erlauben mehrere Abfragen.) . Sie können es also nicht tun in PHP, ABER, warum können Sie diese Abfrage nicht einfach in einem anderen mysql_query -Aufruf ausführen (wie bei Jons Beispiel)? Wenn Sie dieselbe Verbindung verwenden, sollte das korrekte Ergebnis trotzdem angezeigt werden. mysql_num_rows kann auch helfen.

0
Michael Pryor

Ja, es ist {möglich ohne die MySQLi-Erweiterung. 

Verwenden Sie einfach CLIENT_MULTI_STATEMENTS im fünften Argument von mysql_connect.

Siehe die Kommentare unter Husnis Beitrag für weitere Informationen.

0
Pacerier