PHP / MySQL biri olarak iki mysql sorguları yürütmek nasıl?

6 Cevap php

Ben aşağıdaki gibi, iki sorgu var:

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

Ben tek bir girişimde bu iki sorguları yürütmek istiyorum.

$result = mysql_query($query);

Ama sonra ayrı ayrı ayarlamak her tabloları işlemek nasıl söyle. Aslında ASP.NET biz iki sorguları gibi kolları veri kümesini kullanır

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

Nasıl aynı kullanarak PHP / MYSQL yapabilirsiniz.

Teşekkürler

6 Cevap

Siz PHP düzenli mysql-API kullanarak bunu yapamaz. Sadece iki sorguları yürütmek. İkinci bir önemli olmaz o kadar hızlı olacaktır. Bu mikro optimizasyon tipik bir örneğidir. Dert etmeyin.

Kayıt için, bu mysqli ve mysqli_multi_query-fonksiyonu kullanılarak yapılabilir.

SQL_CALC_FOUND_ROWS yapamazsın kullanma.

FOUND_ROWS aracılığıyla satır sayısı () geçici ve SEÇ SQL_CALC_FOUND_ROWS deyimi aşağıdaki deyimi geçmişte mevcut olması amaçlanmıştır değildir.

Birisi SQL_CALC_FOUND_ROWS sadece bir sayımını almak daha sık yavaş kullanarak, daha önce söz belirtildiği gibi.

Belki alt sorgu gibi yapıyor kapalı iyi olurdu:

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;

Bu gibi:

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

Iki kez bir sorguyu yürütmek istemiyorsanız eğer MySQLi uzantısı kullanmak gerekir:

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

Mysqli kullanmak zorunda, aşağıdaki kod iyi çalışıyor

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

Diğerleri cevap gibi, mysqli API msyqli_multi_query () fonksiyonu multi-sorguları yürütebilirsiniz.

Bu değer ne için, PDO varsayılan çoklu sorgu destekler ve size birden fazla sorgu birden çok sonuç kümeleri üzerinde yineleme yapabilirsiniz:

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

Bununla birlikte, çok sorgu oldukça yaygın güvenlik nedenlerinden dolayı bir bad idea olarak kabul edilir. Eğer sorgu dizeleri oluşturmak konusunda dikkatli değilseniz, aslında classic "Little Bobby Tables" XKCD cartoon gösterilen SQL injection açığı türünü tam olarak alabilirsiniz. Tek sorgu sizi kısıtlamak zaman bir API kullanarak, bu olamaz.