如何在PHP / MYSQL中执行两个mysql查询?

时间:2009-04-29 13:47:28

标签: php mysql loops

我有两个问题,如下:

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

我想一次尝试执行这两个查询。

$result = mysql_query($query);

然后告诉我如何处理每个单独设置的表。实际上在ASP.NET中我们使用数据集来处理两个查询

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

如何使用PHP / MYSQL进行相同的操作?

8 个答案:

答案 0 :(得分:32)

更新:通过将标记传递给mysql_connect(),显然可以实现。请参阅Executing multiple SQL queries in one statement with PHP然而,任何当前的读者都应该避免使用mysql_类函数并且更喜欢PDO。

你不能在PHP中使用常规的mysql-api。只需执行两个查询。第二个将是如此之快,以至于无关紧要。这是微优化的典型示例。别担心。

为了记录,可以使用mysqli和mysqli_multi_query - 函数来完成。

答案 1 :(得分:7)

正如其他人已经回答的那样,mysqli API可以使用msyqli_multi_query()函数执行多查询。

对于它的价值,PDO默认支持多查询,您可以迭代多个查询的多个结果集:

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

但是,出于安全原因,多查询被广泛认为是坏主意。如果您不小心如何构造查询字符串,实际上可以获得classic "Little Bobby Tables" XKCD cartoon中显示的SQL注入漏洞的确切类型。当使用限制您进行单一查询的API时,这是不可能发生的。

答案 2 :(得分:3)

使用SQL_CALC_FOUND_ROWS你不能。

  

通过FOUND_ROWS()可用的行计数是暂时的,并且不能在SELECT SQL_CALC_FOUND_ROWS语句之后的语句之后可用。

正如您在之前的问题中提到的那样,使用SQL_CALC_FOUND_ROWS通常比获取计数要慢。

也许你最好像子查询那样做这个:

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 :(得分:3)

如果您不想执行两次查询,则必须使用MySQLi扩展名:

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

答案 4 :(得分:3)

你必须使用MySQLi,下面的代码效果很好

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

答案 5 :(得分:2)

像这样:

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

答案 6 :(得分:0)

它在PHP网站上说multiple queries are NOT permitted(编辑:这只适用于mysql扩展.mysqli和PDO允许多个查询) 。所以你不能在PHP中做到这一点,但是,为什么你不能在另一个mysql_query调用中执行该查询(如Jon的例子)?如果您使用相同的连接,它仍应该给您正确的结果。此外,mysql_num_rows也可能有所帮助。

答案 7 :(得分:0)

是的,可能,不使用MySQLi扩展程序。

只需在CLIENT_MULTI_STATEMENTS的第五个参数中使用mysql_connect

有关详细信息,请参阅以下评论Husni's post