関連するデータベースは次のとおりです:
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;
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');
PDO::ATTR_PERSISTENT => TRUE,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
例外メッセージとは何ですか?見てみるとわかります
データが挿入されましたか? 例外情報を出力して確認してください。try 内にネストされた try を記述する方法はないようです。
異常情報とは何ですか?見てみるとわかります
データは挿入されましたか? 例外情報を出力して確認してください。try にネストされた try を記述する方法はないようです。
テストコードを書き直します、お待ちください
助けを探していますか?
例外情報は次のとおりです:
#0 /Library /WebServer/Documents/php/phplearn/pdo.php(28): PDOStatement->execute() #1 /ライブラリ /WebServer/Documents/php/phplearn/pdo.php(35): write('12345678', ' 87654321') #2 {main}
echo $e->getMessage(); に変更します。次の内容が表示されます:
Error!: SQLSTATE[HY093]: Invalidparameter number
<?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 を使用すると例外が発生するのはなぜですか?
「再利用接続」という用語について、再利用接続とは何ですか?
改めてありがとうございます。