PHP MySQL 通过 PDO : mysql_result() substitute not working when called more than once

标签 php mysql pdo

我正在将一个相当大的现有 Web 应用程序从旧的 mysql_ 库转换为新的 PDO 类。 由于它是一个相当大的 Web 应用程序,并且这种必要的更改在正在进行的项目中很晚才出现(mysql_ 函数和存储过程的限制),我现在决定只创建自定义函数来替换旧的 mysql_ 函数并进行搜索/替换覆盖整个网络应用程序。

作为引用,我的查询执行如下:

function MysqlQuery($SqlQuery)
{
   global $MysqlPDO;  //$MysqlPDO is initialized in an earlier called functions which creates the database connection object
   $SqlResult = $MysqlPDO->prepare($SqlQuery,array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));  //tried setting a scrollable cursor but this doesnt seem to work...
   $SqlResult->execute();
   return $SqlResult;
}

到目前为止,我唯一无法解决的问题是找到一个很好的替代旧 mysql_result() 函数的方法。 当然,这里和网络上的其他地方都有大量所谓的 mysql_result() 替换的示例,但到目前为止,我发现没有一个在被多次调用以获取同一行时起作用。

我首先开始使用这个自定义函数

function MysqlResult($SqlResult, $RowNumber, $FieldName = 0)
{
   $RowArray = $SqlResult->fetch(PDO::FETCH_BOTH,PDO::FETCH_ORI_ABS,$RowNumber);
   return $RowArray[$FieldName];
}

但是,当我多次调用此函数时,它只会在第一次起作用,因为第二次调用 $SqlResult->fetch() 时,它返回 false,像这样:

$SqlQuery = "SELECT 'TEST' AS Test";
$SqlResult = MysqlQuery($SqlQuery);
var_dump(MysqlResult($SqlResult,0,"Test"));
var_dump(MysqlResult($SqlResult,0,"Test"));
var_dump(MysqlResult($SqlResult,0,"Test"));
var_dump(MysqlResult($SqlResult,0,"Test"));
var_dump(MysqlResult($SqlResult,0,"Test"));

这将输出以下内容:

string 'TEST' (length=4)
null
null
null
null

然后我决定在自定义 MysqlResult() 函数中使用 PDOStatement::fetchAll 方法,如下所示:

function MysqlResult($SqlResult,$RowNumber,$FieldName = 0)
{
   $ResultArray = $SqlResult->fetchAll();
   $RowArray = $ResultArray[$RowNumber];
   return $RowArray[$FieldName];
}

但这会产生与我第一次尝试完全相同的输出。

问题是,在我现有的 Web 应用程序中,有几次使用 mysql_result 两次或更多次获取相同的 SQL 输出。 虽然我完全意识到这不是很好的编码,但我现在不想进入并重写这些部分。 我是否相信 Shiny 的新 MySQL PDO 类比旧的 mysql_ 函数更受限制??

最佳答案

看来查询必须通过调用结果对象的“closeCursor()”方法来“重置”,然后才能再次返回相同的集合。这会有效地再次执行 MySQL 查询,所以说实话,这是一个令人讨厌的黑客攻击,但它暂时有效,直到我抽出时间删除调用该方法的任何地方。这是我现在制作的工作 MysqlResult() 函数:

function MysqlResult($SqlResult,$RowNumber,$FieldName = 0)
{
   //HACK: since mysql_result() cannot be remade using the PDO class, we have to re-execute the query. This is a quite ugly solution and should be removed in the future...
   $SqlResult->closeCursor();
   $SqlResult->execute();
   $ResultArray = $SqlResult->fetchAll();
   $RowArray = $ResultArray[$RowNumber];
   return $RowArray[$FieldName];
}

关于PHP MySQL 通过 PDO : mysql_result() substitute not working when called more than once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952274/

相关文章:

php - 在多语言(例如英语和法语)应用程序中抛出异常

php - 使用 MySQL 关系表循环行

php - 通过 PHP 加载 Javascript

php - 数据库中的Mysql关系

php - 如何使用 imap 更快地读取多条消息状态

Php Mysql select查询问题和regexp

php - 如何从 SQLite 数据库中获取随机记录?

php - PHP 列出类别和子类别的逻辑

mysql - Laravel 5.1 - 连接到 MySQL 数据库 (MAMP)

php - 简单的选择返回意想不到的结果