我正在试图找出为什么我的pdo_oci执行/准备语句不起作用。这可能是一件微不足道的事情,我失踪了或者自己驱使他们自己或者我甚至都不知道...... 简短说明:有一个查询,要插入的参数数组。
try{
$conn = new PDO($dsn,$db_username,$db_password);
}catch(PDOException $e)
{
echo ($e->getMessage());
}
$statement = 'INSERT INTO "statements" ("modelID", "subject", "predicate", "object", "l_language", "author", "stread", "stedit", "stdelete", "epoch")
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, sysdate)';
$params = array(8,
'http://192.168.1.234/taooracle/tao_ora_dev.rdf#i1386245617410387',
'http://www.w3.org/2000/01/rdf-schema#label',
'Item 8',
'en-US',
'http://192.168.1.234/taooracle/tao_ora_dev.rdf#superUser',
'yyy[admin,administrators,authors]',
'yyy[admin,administrators,authors]',
'yyy[admin,administrators,authors]'
);
//test if $conn works
$result = $conn->query('SELECT * FROM "statements"');
if($result->fetch() > 0){
echo 'PDO connection works' ."<br/>";
}
if(count($params) > 0){
$sth = $conn->prepare($statement);
$sth->execute($params);
$returnValue = $sth->rowCount();
}
echo 'Affected rows: '. $returnValue;
**RESULTS:**
PDO connection works
Affected rows: 0
EDIT: statements table column names/types
create table statements
(
"modelID" NUMBER(11),
"subject" VARCHAR2(255),
"predicate" VARCHAR2(255),
"object" VARCHAR2(4000),
"l_language" VARCHAR2(255),
"id" NUMBER(20) not null,
"author" VARCHAR2(255),
"stread" VARCHAR2(255),
"stedit" VARCHAR2(255),
"stdelete" VARCHAR2(255),
"epoch" DATE
)
id通过触发器插入,非常插入语句。 (这无关紧要,因为使用pdo-&gt; exec()语句的简单查询可以正常运行,并且它们使用相同的表/列。)
编辑:我的回答 不得不改变'?'一些有效的字符串。不知道为什么oracle抛出它是无效字符的异常。
如果其他人有这个问题,我发现了导致它的原因。我用来生成查询的类,在查询结尾添加分号。这似乎并没有打扰MySQL,但它失败了甲骨文。所以我刚刚为pdo_oci驱动程序添加了if子句,如果找到则删除分号。