[英]PHP: I can only use this function once (using it in a while loop)
我得到了一个几乎可以解决的老问题的答案。
我有一个功能,
function vraagOp($table,$where)
{
static $rVraagOp;
if(!$rVraagOp){
$qVraagOp = "SELECT * FROM $table WHERE $where";
$rVraagOp = mysql_query( $qVraagOp );
}
return mysql_fetch_assoc( $rVraagOp );
}
我想这样使用
while (vraagOp("testtable","testtype = test"))
{
echo "testing <br>";
}
该功能工作正常,但是,我每页只能使用一次。 我第二次调用它没有任何作用。 也没有错误,就像函数从未发生过一样。
为了使其能够多次工作并且仍在while循环中工作,我必须更改什么?
该错误是因为您没有重置mysql结果。 由于该函数存储在静态变量中,因此每次都尝试访问相同的结果资源。 我可以看到您正在尝试从查询中切出一个步骤(将查询和检索步骤组合为一个步骤),但是如果您是我,我不会为之烦恼:收益不会超过损失的成本灵活性。 坚持尝试和真实的方式:
$result = mysql_query("SELECT * FROM foo");
while ($row = mysql_fetch_assoc($result)) { ... }
// loop through it again:
mysql_data_seek($result, 0); // rewinds the result
while ($row = mysql_fetch_assoc($result)) { ... }
甚至更好,请看一下PDO方法。
使用这样的东西:
function vraagOp($table,$where)
{
static $rVraagOp = null;
if(!isset($rVraagOp)){
$qVraagOp = "SELECT * FROM $table WHERE $where";
$rVraagOp = mysql_query( $qVraagOp );
}
$ret = mysql_fetch_assoc( $rVraagOp );
if(!$ret) $rVraagOp = null;
return $ret;
}
很难看,但是如果你想要那样的话...
您可以改用这样的方法,效果会更好:
function vraagOp($table,$where, &$resource)
{
if(!isset($resource)){
$qVraagOp = "SELECT * FROM $table WHERE $where";
$rVraagOp = mysql_query( $resource );
}
$ret = mysql_fetch_assoc( $resource );
if(!$ret) $resource = null;
return $ret;
}
并像这样使用它:
$r = null;
while (vraagOp("testtable","testtype = test", $r))
{
echo "testing <br>";
}
它仍然很难看,但是要好一些。
我假设您要迭代从数据库接收的值?
您应该将循环更改为foreach
函数:
foreach (vraagOp("testtable","testtype = test") as $row)
{
// here you have full access on the rows the function returns
print_r($row);
echo "testing <br>";
}
好吧,大概您可以尝试以下方法:
function do_query($table, $where){
// please do some escaping for your $table and $where if necessary
$qVraagOp = "SELECT * FROM `$table` WHERE $where";
$rVraagOp = mysql_query( $qVraagOp );
return $rVraagOp;
}
function do_fetch($result){
return mysql_fetch_assoc( $result );
}
$res = do_query('testtable', 'testtype = "test"');
while($row = do_fetch($res)){
var_dump($row); // dump each row out
}
我的猜测是您在“ testtype = test”中的查询中有错误,因为test是一个字符串(或那是一列?),因此仅被调用一次才发现错误。
尼克(Nickf)提到,PDO提供了很多东西。 由于PDOStatement
实现了Traversable接口,因此可以在foreach
直接使用它。
$query = $db->prepare("SELECT id, name, location FROM `events` WHERE `when`=?");
$query->execute(array(strtotime('-3 days UTC')));
foreach ($query as $event) {
...
}
PDO还支持准备好的语句 ,这些语句提供了旧版mysql驱动程序所缺乏的效率和安全性。
就目前而言, vraagOp
对于数据访问层vraagOp
似乎是一个较差的设计。
我对上一个问题(您不接受...)的回答解决了这个问题。
它维护特定表/ where子句的映射,并为每个调用使用正确的资源。
function vraagOp($table, $where)
{
// Holds our mysql resources in a map of "{$table}_{$where}" => resource
static $results = array();
$key = $table . '_' . $where;
if (!isset($results[$key]))
{
// first call of this particular table/where
$results[$key] = mysql_query("SELECT * FROM $table WHERE $where");
}
$row = mysql_fetch_assoc($results[$key]);
if ($row === false)
// remove this key so a subsequent call will start over with a new query
unset($results[$key]);
return $row;
}
// Usage
while ($row = vraagOp("table1", "where field > 7")) {
print_r($row);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.