Heim  >  Artikel  >  Backend-Entwicklung  >  求教关于PDO使用的有关问题

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

WBOY
WBOYOriginal
2016-06-13 12:05:08823Durchsuche

求教关于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,
启用长连接
只在复用连接时会抛出异常

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn