首页  >  文章  >  后端开发  >  求教关于PDO使用的有关问题

求教关于PDO使用的有关问题

WBOY
WBOY原创
2016-06-13 12:05:08865浏览

求教关于PDO使用的问题
相关的数据库是这样的:

<br />CREATE TABLE `session` (<br />  `skey` char(32) CHARACTER SET ascii NOT NULL,<br />  `data` text COLLATE utf8mb4_bin,<br />  `expire` int(11) NOT NULL,<br />  PRIMARY KEY (`skey`)<br />) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;<br />


相关的PHP代码大致如下(,我隐藏掉了一些无关的代码):
<br />define('DNS', 'mysql:host=localhost;dbname=db;charset=utf8mb4');<br />define('USR', 'usr');<br />define('PWD', 'pwd');<br />define('MAXLIFETIME', 1440);<br /><br />function write($id, $data) {<br />	try {<br />		$dbh = new PDO(DNS, USR, PWD, array(<br />			PDO::ATTR_PERSISTENT => TRUE,<br />			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />			PDO::ATTR_EMULATE_PREPARES => FALSE<br />		));<br />		try {<br />			$expire = time() + MAXLIFETIME;<br />			$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '<br />					. 'VALUES (:skey, :data, :expire) '<br />					. 'ON DUPLICATE KEY UPDATE '<br />					. '`data` = :data, `expire` = :expire';<br />			$stmt = $dbh->prepare($sql);<br />			$stmt->bindValue(':skey', $id, PDO::PARAM_STR);<br />			$stmt->bindValue(':data', $data, PDO::PARAM_STR);<br />			$stmt->bindValue(':expire', $expire, PDO::PARAM_INT);<br />			$stmt->execute();<br />			$dbh = NULL;<br />		} catch (Exception $e) {<br />			echo $e->getTraceAsString();<br />		}<br />	} catch (Exception $e) {<br />		echo $e->getTraceAsString();<br />	}<br />}<br /><br />write('12345678', '87654321');<br />


其中的关键似乎在
<br />PDO::ATTR_PERSISTENT => TRUE,<br />PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />

这两句上。

只有注释掉这两句,运行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,
启用长连接
只在复用连接时会抛出异常

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn