2010-02-09 4 views
0

У меня сегодня есть странная проблема, связанная с функцией oci_bind_by_name, которую я использую в PHP.oci_bind_by_name buggy с функцией 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 и 01/02/2019, например:

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, а не в первый раз ... Надеюсь, это было последнее :) –

Смежные вопросы