2015-04-30 3 views
0
$arr = array(); 
$from_date = '2015-01-01'; 
$to_date = '2015-01-31'; 
$order_no = '25215'; 
$sql = "SELECT * FROM test"; 
if(!empty($from_date)&&!empty($to_date)) 
{ 
    $sql.=" WHERE txn_date BETWEEN :from_date AND :to_date"; 
    $arr[] = ":from_date => $from_date"; 
    $arr[] = ":to_date => $to_date"; 
    $condition=true; 
} 
if(!empty($order_no)) 
{ 
    if($condition) 
    { 
     $sql.=" AND ref_number = :order_no"; 
     $arr[] = ":order_no => $order_no"; 
    } 
    else 
    { 
     $sql.=" WHERE ref_number = :order_no"; 
     $arr[] = ":order_no => $order_no"; 
     $condition=true; 
    } 
} 
$stmt = $db->prepare($sql); 
$stmt->execute($arr); 
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 

При выполнении этого запроса показывает предупреждение какPHP PDO Динамический запрос Строительство

Внимание: PDOStatement :: Execute(): SQLSTATE [HY093]: Неверный номер параметра: параметр не был определен

что с этим связано?

+0

Ваш 'ref_number LIKE: order_no 'также может быть' ref_number =: order_no', поскольку у вас нет подстановочных знаков – Phil

ответ

2

В переменной $ обр следует заменить, как, как это для всех ассоциативных индекса

$arr[':from_date'] = $from_date; 
$arr[':to_date'] = $to_date; 
$arr[':order_no'] = $order_no; 

Также это хорошая практика, чтобы переместить общий код в наружном блоке вместо если/иначе лестница

if(!empty($order_no)) 
{ 
    $arr[':order_no'] = $order_no; 
    if($condition) 
    { 
     $sql.=" AND ref_number = :order_no"; 
    } 
    else 
    { 
     $sql.=" WHERE ref_number LIKE :order_no"; 
     $condition=true; 
    } 
} 

В качестве аргумента в порядке ответа здесь приводится пояснение к этому вопросу

$sql.=" WHERE txn_date BETWEEN :from_date AND :to_date"; 

Заменить это с этим одним

$sql.=" WHERE date(txn_date) BETWEEN date(:from_date) AND date(:to_date)"; 

ref_number = :order_no 

Вместо указанного выше одного типа брось на целое число без знака, как, как это и там, где условие, если/другое заявление

CONVERT(ref_number,UNSIGNED INTEGER) = :order_no 
+0

спасибо. date и order_no - это строковые поля. как справиться с этим? –

+0

Вы имеете в виду в своей таблице sql столбец даты и order_no - это тип данных varchar, правильно? – gvgvgvijayan

+0

есть. поэтому, когда я выполняю запрос, строка не возвращается. прямо сейчас массив похож на Array ([from_date] => 2014-01-01 [to_date] => 2014-01-31). но мне нужно как Array ([from_date] => '2014-01-01' [to_date] => '2014-01-31') –

1

Вместо

$arr[] = ":from_date => $from_date";

сделать

$arr['from_date'] = $from_date;

Узнайте больше о PHP массивов here.

Кроме того, что я хотел бы сделать, это:

$sql = "SELECT * FROM test WHERE 1=1"; 

Тогда нет необходимости проверять на $condition и просто сцепить в $sql.

+0

. Я понимаю. Спасибо. Еще одна вещь, даты и order_no - это строковые поля. как справиться с этим? –

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