【发布时间】:2012-08-05 18:47:27
【问题描述】:
好吧,抱歉,如果有任何术语被关闭......所以我正在尝试在我的 PHP 代码中使用这个插入语句。当我使用 isql 或 sqlplus 将其放入时,该语句工作正常。但是当我在 PHP 中运行查询时,它不会向表中插入任何内容。不返回任何错误。我正在使用 PHP 的 PDO 扩展。 http://us2.php.net/manual/en/pdo.prepare.php
插入到 USER_KEY (创建日期, 评论, 截止日期, USER_KEY_ID)
值(SYSTIMESTAMP, 空,
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) 值(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
从这个错误中,我了解到我输入的日期与我在 SQL 语句中的 TO_TIMESTAMP 函数中的格式不匹配。
http://www.techonthenet.com/oracle/errors/ora01830.php
我不知道这一点,但在 oracle 中,DD 代表 [1-31] 而不是 [01-31]。 Oracle 文档中的信息
所以我将尝试将我用于绑定到 SQL 语句的日期的格式从 Y-m-d 更改为 Y-m-j。因为 j 在 PHP DateTime 对象中代表 [1-31] 天。
如果我有任何错误,请纠正我。我很想知道为什么改变我对 SQL 语句进行绑定的方式会引发错误?因为我不太明白。
【问题讨论】:
-
您还可以通过一次尝试一半变量的语句来查看具体未插入的内容来排除故障
-
我尝试一次只插入一个变量,至于 PHP 中的 errorInfo 和 errorCode 函数,我尝试了它们,它们返回 00000 作为错误代码,据我了解,这是成功执行sql语句。如果我错了,请纠正我。
标签: php sql oracle codeigniter pdo