ホームページ > バックエンド開発 > PHPチュートリアル > PDO の使用に関するアドバイスを求める

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

WBOY
リリース: 2016-06-23 13:51:13
オリジナル
1088 人が閲覧しました

関連するデータベースは次のとおりです:

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


関連する PHP コードはおおよそ次のとおりです (無関係なコードをいくつか隠しています):
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');
ログイン後にコピー


キーは 2 つの文
PDO::ATTR_PERSISTENT => TRUE,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
ログイン後にコピー

のようです。

これら 2 つの文のみをコメントアウトして実行してください。これらの 2 つの文のいずれかが有効になると、例外が発生します。
すみません、何が起こっているのですか?アドバイスをお願いします。


ディスカッションへの返信(解決策)

例外メッセージとは何ですか?見てみるとわかります

データが挿入されましたか? 例外情報を出力して確認してください。try 内にネストされた try を記述する方法はないようです。

異常情報とは何ですか?見てみるとわかります


ごめんなさい、混乱していました。
例外情報はおそらく次のようになります:
#0 /***************/pdo.php(23): PDOStatement->execute() #1 /*****************/pdo.php(33) ) : write('12345678', '87654321') #2 {main}

データは挿入されましたか? 例外情報を出力して確認してください。try にネストされた try を記述する方法はないようです。



アドバイスありがとうございます。例外処理については初心者です:( .
例外は主に $stmt->execute(); の文でなければなりません。

例外処理に慣れていないのかと思いました。詳しい例外情報を出力するにはどうすればよいですか?

プロジェクトに関連するコメントやパス名を非表示にしてみてはいかがでしょうか?私は怠け者です

テストコードを書き直します、お待ちください
助けを探していますか?

例外情報は次のとおりです:

#0 /Library /WebServer/Documents/php/phplearn/pdo.php(28): PDOStatement->execute() #1 /ライブラリ /WebServer/Documents/php/phplearn/pdo.php(35): write('12345678', ' 87654321') #2 {main}



7 階のコードの 14 行目と 15 行目をコメントアウトすると機能しなくなります。再度例外が発生してもエラーは報告されませんが、コードを実行するとエラーが報告されます。データがデータベースに挿入されていないことがわかりました

SQL コマンドには 5 つのパラメータが必要ですが、指定したのは 3 つだけです

echo $e->getTraceAsString( );

echo $e->getMessage(); に変更します。次の内容が表示されます:

Error!: SQLSTATE[HY093]: Invalidparameter number

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
例外処理モードを有効にする
デフォルトのエラー処理モードを選択するには、コメントアウトしてください。エラー情報は次のようになります。 errorInfo から取得

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

ありがとうございます コードの変更は成功しました

<?phpini_set('display_errors', '1');error_reporting(-1);define('DNS', 'mysql:host=localhost;dbname=ping_brand;charset=utf8mb4');define('USR', 'root');define('PWD', '123456');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		));		$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');
ログイン後にコピー

insert の :data だと思いました。 into と :data in on dedicated 句は同じ変数であり、バインディングは 1 つだけ必要でした。

それはできないようです。

元のエラー コードに関して、PDO オブジェクトの初期化時に PDO::ATTR_PERSISTENT => TRUE を使用すると例外が発生するのはなぜですか?
「再利用接続」という用語について、再利用接続とは何ですか?

改めてありがとうございます。

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