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

WBOY
Release: 2016-06-13 12:05:08
Original
870 people have browsed it

求教关于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 />
Copy after login


相关的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 />
Copy after login


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

这两句上。

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template