gpt4 book ai didi

php - PDO 准备静默失败

转载 作者:可可西里 更新时间:2023-11-01 12:56:17 27 4
gpt4 key购买 nike

我正在试验 PHP 的 session_set_save_handler,我想使用 PDO 连接来存储 session 数据。

我有这个函数作为写操作的回调:

function _write($id, $data) {
logger('_WRITE ' . $id . ' ' . $data);
try {
$access = time();
$sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
logger('This is the last line in this function that appears in the log.');
$stmt = $GLOBALS['db']->prepare($sql);
logger('This never gets logged! :(');
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':access', $access, PDO::PARAM_INT);
$stmt->bindParam(':data', $data, PDO::PARAM_STR);
$stmt->execute();
$stmt->closeCursor();
return true;
} catch (PDOException $e) {
logger('This is never executed.');
logger($e->getTraceAsString());
}
}

前两条日志消息总是会出现,但是 $stmt = $GLOBALS['db']->prepare($sql) 之后的第三条消息永远不会出现在日志文件中,并且也没有异常的踪迹。

session 数据库表保持为空。

_close 回调的日志消息始终存在。

这是我连接到数据库的方式:

$db = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我有 PHP 5.2.10。

我试图简单地运行 $GLOBALS['db']->exec($sql) 并带有“手动准备”的 $sql 内容,但它仍然失败默默。查询本身没问题,我可以通过数据库控制台执行它。


编辑:

在 VolkerK 确定我发现的问题后 this article这解释了这种奇怪现象背后的原因。也许它也可以为其他人提供信息。


第二次编辑:

最不痛苦的神奇解决方案是我必须将以下函数调用添加到我的前端 Controller (主 index.php)文件的最后:

session_write_close();

最佳答案

我的赌注是:$GLOBALS['db'] 未设置或不是 pdo 的实例(不再是?)因此 PHP fatal error :调用成员函数 prepare() on a non- object 发生并且 php 退出。

$sql = 'REPLACE INTO sessions SET id=:id, access=:access, data=:data';
logger('This is the last line in this function that appears in the log.');
if ( !isset($GLOBALS['db']) ) {
logger('there is no globals[db]');
return;
}
else if ( !is_object($GLOBALS['db']) ) {
logger('globals[db] is not an object');
return;
}
else if ( !($GLOBALS['db'] instanceof PDO) ) {
logger('globals[db] is not a PDO object');
return;
}
else {
logger('globals[db] seems ok');
}

$stmt = $GLOBALS['db']->prepare($sql);
logger('This never gets logged! :(');

关于php - PDO 准备静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com