1

如果我在 PHP 中执行此操作,它可以正常工作并按预期循环:

$rs = mysql_query($sql);
while ($row = mysql_fetch_assoc($rs)){
    writeme("UserID: " . $row["UserID"]);
}

但我一直想把它抽象成一个我称之为 ExecuteQuery 的函数:

function ExecuteQuery($sql){
$result = mysql_query($sql);

if ($result) {
    if($result != 1){
        return mysql_fetch_assoc($result); // return recordset
    }
}else{
    $message  = 'Invalid query: ' . mysql_error() . "<br>";
    $message .= 'Whole query: ' . $sql;
    echo $message;
    die();
}

}

此功能在 3 种情况中的 2 种情况下效果很好:

1- 适用于返回 1 行的查询,我可以这样访问:

$rs = ExecuteQuery($sql);

$foo = $rs["用户 ID"];

2- 适用于不返回任何记录的 sql 语句,例如 UPDATE 或 DELETE。

3-但是当我尝试取回一个返回多条记录的记录集,然后循环遍历它时,我得到一个无限循环并且我的浏览器崩溃了。像这样:

$rs = ExecuteQuery($sql);
while ($row = $rs){
    writeme("UserID: " . $row["UserID"]);
}

如何修改我的 while 循环,使其前进到记录集中的每条新记录并在最后一条记录之后停止?我敢肯定这是一个愚蠢的小东西,但我还不是 PHP 专家。我真的很希望我的 ExecuteQuery 函数能够处理所有 3 个场景,它非常方便。

4

3 回答 3

1

尝试foreach($rs as $row){代替while ($row = $rs){

于 2012-09-19T20:43:44.750 回答
0

不要使用while,使用foreach:

$rs = ExecuteQuery($sql);
foreach ($rs as $row){
    writeme("UserID: " . $row["UserID"]);
}
于 2012-09-19T20:44:09.607 回答
0

mysql_fetch_assoc() 只返回一行结果。要获取下一行,您需要再次调用 mysql_fetch_assoc()。您可以做的一件事是让您的 ExecuteQuery 函数返回一个数组数组:

$rows = array();
while ($row = mysql_fetch_assoc($result) !== false) {
   $rows[] = $row;
}
return $rows;

此外,您不应使用 mysql_* 函数,因为它们已被弃用。尝试改用 PDO 或 mysqli_*。

于 2012-09-19T20:52:56.303 回答