2010-02-09 48 views
0

我今天有一个奇怪的问题与我在PHP中使用的oci_bind_by_name函数有关。oci_bind_by_name错误与TO_DATE SQL函数

让我给你一个展示。

这里是一个简单的日期表:

create table test(col1 date); 
insert into test values(to_date('01/01/2009','DD/MM/YYYY')); 
insert into test values(to_date('01/01/2019','DD/MM/YYYY')); 
insert into test values(to_date('01/01/2029','DD/MM/YYYY')); 
insert into test values(to_date('01/01/2039','DD/MM/YYYY')); 

启动此查询将导致2行,如果我绑定:dt_maj_deb:dt_maj_fin至01/01/2009和2019年1月2日例如:

SELECT * 
FROM TEST 
WHERE col1 BETWEEN TO_DATE (:dt_maj_deb, 'DD/MM/YYYY') 
       AND TO_DATE (:dt_maj_fin, 'DD/MM/YYYY') 

Results 
------- 
01.01.2009   
01.01.2019 

所以一切都如我们所预料的那样。我担心的是当我想从PHP启动相同的查询时。这里是我的测试代码:

$query = "SELECT * FROM TEST 
      WHERE col1 BETWEEN TO_DATE (:dt_maj_deb, 'DD/MM/YYYY') 
         AND TO_DATE (:dt_maj_fin, 'DD/MM/YYYY')"; 
$stmt = oci_parse($conn,$query); 
$value = '01/01/2009'; 
oci_bind_by_name($stmt,':dt_maj_deb',$value); 
$value = '01/02/2019'; 
oci_bind_by_name($stmt,':dt_maj_fin',$value); 
oci_execute($stmt); 
oci_fetch_all($stmt, $result); 
var_dump($result); 
oci_free_statement($stmt); 
oci_close($conn); 

Results 
------- 
array(1) { 
    ["COL1"]=> 
     array(0) {} 
} 

我在想什么?

回答

1

您是不是将:dt_maj_deb:dt_maj_fin都绑定到同一个$value,所以当你执行它们时它们都会保持相同的日期?由于01/02/2019实际上没有数据,因此无法返回。如果你的第二个$value=是在表中确实存在的日期,那么你会得到正好一行,不是吗?或者换一种说法,为两个oci_bind_by_name()调用使用不同的变量。

+0

谢谢亚历克斯,我再次被oci图书馆欺骗,不是第一次......我希望这是最后一次:) – 2010-02-15 08:43:38