用語のいずれかがオフになっている場合は申し訳ありません....だから、PHPコードでこのinsertステートメントを使用しようとしています。isqlまたはsqlplusを使用してステートメントを入れると、ステートメントは正常に機能します。しかし、PHP でクエリを実行すると、テーブルに何も挿入されません。エラーを返しません。PHP の PDO 拡張機能を使用しています。http://us2.php.net/manual/en/pdo.prepare.php
INSERT INTO USER_KEY (CREATED_DATE, COMMENT, EXPIRATION_DATE, USER_KEY_ID)
VALUES (SYSTIMESTAMP, NULL, TO_TIMESTAMP
('2012-02-02', 'YYYY-MM-DD'), key_sequence.NEXTVAL);
私のphpコードは次のようになり、CodeIgniterを使用しています
$dbh = self::$CI->db->conn_id;
$sql = "INSERT INTO USER_KEY (CREATED_DATE, COMMENT, EXPIRATION_DATE, USER_KEY_ID) VALUES (SYSTIMESTAMP, ?, TO_TIMESTAMP(?, 'YYYY-MM-DD'), key_sequence.NEXTVAL)";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(NULL,'2012-02-02'));
データベース内のさまざまなテーブルのコードに同様の PHP 挿入ステートメントがあり、それらのステートメントは機能します。しかし、これらのテーブルはタイムスタンプを使用していないので、どういうわけか私のタイムスタンプの使用が、PHP で使用されている挿入ステートメントを台無しにしているのだろうか? また、ステートメントが実行されていないときにエラーが表示されない理由についての説明はありますか?
更新/解決策
だから私はバインディングを行う方法を変更しました
$sql = INSERT INTO USER_KEY <br>
(CREATED_DATE, <br>
COMMENT, <br>
EXPIRATION_DATE, <br>
USER_KEY_ID) <br>
VALUES (SYSTIMESTAMP, <br>
:comment, <br>
TO_TIMESTAMP(:date, 'YYYY-MM-DD'), <br>
key_sequence.NEXTVAL); <br>
$stmt = $dbh->prepare($sql); <br>
$stmt->bindValue(':comment', $this->comment); <br>
$stmt->bindValue(':date', $this->creation_date); <br>
$execute(); <br>
$var_dump($stmt->errorInfo());
この方法でバインディングを行うと、エラーが返されました
ORA-01830: date format picture ends before converting entire input string
TO_TIMESTAMP
このエラーから、入力した日付がSQL ステートメントの関数の形式と一致しないことがわかりました。
http://www.techonthenet.com/oracle/errors/ora01830.php
私はこれを知りませんでしたが、Oracle DD は [1-31] NOT [01-31] を表します。Oracle ドキュメントに記載されている情報
そこで、SQL ステートメントにバインドしている日付に使用している形式を から に変更してみY-m-d
ますY-m-j
。j は PHP の DateTime オブジェクトで [1-31] 日を表すためです。
間違っている場合は修正してください。SQL ステートメントのバインドを行っていた方法を変更すると、エラーがスローされた理由を知りたいですか? それがよくわからないので。