相关的数据库是这样的:
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;
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,
异常信息是什么?看看不就知道了
数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。
异常信息是什么?看看不就知道了
数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。
你不是在寻求帮助吗?
藏藏匿匿的怎么行?
你不是在寻求帮助吗?
藏藏匿匿的怎么行?
你不是在寻求帮助吗?
藏藏匿匿的怎么行?
TRUE, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => FALSE )); $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(); }}write('12345678', '87654321');
如果注释掉7楼代码的14、15两行,则不再发生异常,也不报错,但运行代码后检查发现数据并没有插入到数据库中。
你的 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,
启用长连接
只在复用连接时会抛出异常
谢谢您的指点。代码修改成功了。
$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) ' . 'VALUES (:skey, :data, :expire) ' . 'ON DUPLICATE KEY UPDATE' . '`data` = :data_updata, `expire` = :expire_updata'; $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->bindValue(':data_updata', $data, PDO::PARAM_STR); $stmt->bindValue(':expire_updata', $expire, PDO::PARAM_INT);
头前以为,insert into 中的:data和on duplicate子句中的:data是同一个变量,只需要一个绑定呢。
看起来不能这么做。
关于原本的错误代码,为啥在初始化PDO对象的时候使用PDO::ATTR_PERSISTENT => TRUE,会导致异常呢?
关于“复用连接”的说法,是啥地方构成了复用连接呢?
再次感谢。
已抢17608个
抢已抢50438个
抢已抢121653个
抢已抢184878个
抢已抢66646个
抢已抢351383个
抢