相关的数据库是这样的:
CREATE TABLE `session` (
`skey` char(32) CHARACTER SET ascii NOT NULL,
`data` text COLLATE utf8mb4_bin,
`expire` int(11) NOT NULL,
PRIMARY KEY (`skey`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
相关的PHP代码大致如下(,我隐藏掉了一些无关的代码):
define('DNS', 'mysql:host=localhost;dbname=db;charset=utf8mb4');
define('USR', 'usr');
define('PWD', 'pwd');
define('MAXLIFETIME', 1440);
function write($id, $data) {
try {
$dbh = new PDO(DNS, USR, PWD, array(
PDO::ATTR_PERSISTENT => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => FALSE
));
try {
$expire = time() + MAXLIFETIME;
$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '
. 'VALUES (:skey, :data, :expire) '
. 'ON DUPLICATE KEY UPDATE '
. '`data` = :data, `expire` = :expire';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':skey', $id, PDO::PARAM_STR);
$stmt->bindValue(':data', $data, PDO::PARAM_STR);
$stmt->bindValue(':expire', $expire, PDO::PARAM_INT);
$stmt->execute();
$dbh = NULL;
} catch (Exception $e) {
echo $e->getTraceAsString();
}
} catch (Exception $e) {
echo $e->getTraceAsString();
}
}
write('12345678', '87654321');
其中的关键似乎在
PDO::ATTR_PERSISTENT => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
这两句上。
只有注释掉这两句,运行OK,这两句中的任何一句生效,则发生异常。
请问,这是什么情况?求指点。
------解决方案--------------------
数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。
------解决方案--------------------
你的 SQL 指令需要 5 个参数,而你只给了 3 个!
echo $e->getTraceAsString();
改为
echo $e->getMessage() ;
你就可以看到:
Error!: SQLSTATE[HY093]: Invalid parameter number
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
启用异常处理模式
注释掉就是按默认错误处理模式,可通过 errorInfo 取得错误信息
PDO::ATTR_PERSISTENT => TRUE,
启用长连接
只在复用连接时会抛出异常
友情提示:垃圾评论一律封号 加我微信:826096331拉你进VIP群学习群