PDOの使用に関するアドバイスを求める

WBOY
リリース: 2016-06-13 12:05:08
オリジナル
863 人が閲覧しました

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 />
ログイン後にコピー

という 2 つの文のようです。

これら 2 つの文をコメントアウトして OK を実行するだけで、これら 2 つの文のいずれかが有効になると例外が発生します。
すみません、何が起こっているのですか?アドバイスをお願いします。
------解決策------
データは挿入されましたか? 例外情報が出力されます。出てきて見てください。try 内にネストされた try を記述するそのような方法はないようです。
------解決策----------------------
SQL コマンドには 5 つのパラメータが必要ですが、指定したのは 1 つだけです3!
echo $e->getTraceAsString();

echo $e->getMessage();
に変更されました:
Error!: SQLSTATE[HY093] : Invalidパラメータ番号

PDO::ATTR_ERRMODE =>
PDO::ATTR_PERSISTENT => TRUE,
永続的な接続を有効にする
接続を再利用する場合にのみ例外がスローされます

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート