如果我在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 [“UserID”];
2-适用于不返回任何记录的sql语句,如UPDATE或DELETE。
3-但是当我尝试返回一个返回多个记录的记录集,然后遍历它时,我得到一个无限循环,我的浏览器崩溃了。像这样:
$rs = ExecuteQuery($sql);
while ($row = $rs){
writeme("UserID: " . $row["UserID"]);
}
如何修改while循环以使其前进到记录集中的每个新记录并在最后一条记录后停止?我确定这是一个愚蠢的小事,但我还不熟悉PHP。我真的很喜欢我的ExecuteQuery函数能够处理所有3个场景,它非常方便。
答案 0 :(得分:1)
尝试foreach($rs as $row){
而不是while ($row = $rs){
答案 1 :(得分:0)
请勿使用while,请使用foreach:
$rs = ExecuteQuery($sql);
foreach ($rs as $row){
writeme("UserID: " . $row["UserID"]);
}
答案 2 :(得分:0)
mysql_fetch_assoc()只返回结果的一行。要获取下一行,需要再次调用mysql_fetch_assoc()。您可以做的一件事是让您的ExecuteQuery函数返回一个数组数组:
$rows = array();
while ($row = mysql_fetch_assoc($result) !== false) {
$rows[] = $row;
}
return $rows;
此外,您不应使用mysql_ *函数,因为它们已被弃用。请尝试使用PDO或mysqli_ *。