我正在将一个相当大的现有 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/