Неопределенный bindValue вызывает сбой при выполнении подготовленного оператора
У меня проблемы с выполнением моего динамически созданного запроса, когда bindValue пуст
- Если bindValue определен и не используется, запрос не возвращает результатов. Пока введено значение для всех полей поиска, мой запрос работает.
- Я пробовал как bindValue, так и bindParam.
- Намерение состоит в том, чтобы запрашивать только те поля, которые заполнены в форме поиска.
- Я заметил в своем локальном журнале MySQL, что инструкция будет подготовлена правильно, но не будет выполнена, если не будут использованы все поисковые термины bindValue.
Вот mysql.log (со всеми 3 заполненными полями):
142 Connect root@localhost on drawings03
142 Prepare SELECT * FROM draw WHERE (`LocationNumber` = ? && `DrawingNumber` = ? && `DrawingDate` >= ? )
142 Execute SELECT * FROM draw WHERE (`LocationNumber` = '525' && `DrawingNumber` = '101' && `DrawingDate` >= '1950' )
142 Close stmt
142 Quit
Вот часть php:
<?php
//grabs variables from a search form
$searchTerms['locnum'] = $_GET['locnum'];
$searchTerms['drawnum'] = $_GET['drawnum'];
$searchTerms['projtitle'] = $_GET['projtitle'];
$searchTerms['shttitle'] = $_GET['shttitle'];
$searchTerms['shtnum'] = $_GET['shtnum'];
$searchTerms['discp'] = $_GET['discp'];
$searchTerms['drawdate'] = $_GET['drawdate'];
//Loops through the array
foreach ($searchTerms as $field => $value) {
if ($value != null && $value != '' && $value != ' ' ) {
// Based on the key name in the array, decide which
// SQL statement to add to the array to be constructed
switch ($field) {
case 'locnum':
$where[] = "`LocationNumber` = :locnum ";
break;
case 'drawnum':
$where[] = "`DrawingNumber` = :drawnum ";
break;
case 'drawdate':
$where[] = "`DrawingDate` >= :drawdate ";
break;
}
}
}
// Combine WHERE statements into one with && separating each one
$whereSQL = implode(' && ', $where);
$stmt = $db->prepare("SELECT * FROM draw WHERE (".$whereSQL.")");
$stmt->bindValue(':locnum', $locnum, PDO::PARAM_INT);
$stmt->bindValue(':drawnum', $drawnum, PDO::PARAM_INT);
$stmt->bindValue(':drawdate', $drawdate, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$row_count = $stmt->rowCount();
echo "<div class='span12'><b>".$row_count." results"."</b><br>Click <b>to sort</b>. Right-click link and save-as <b>to save a PDF</b>.</div>";
foreach ($rows as $value) {
echo $value['LocationNumber']." - ".$value['DrawingNumber']." - ".substr($value['DrawingDate'],0,4)."<br>";
}
?>
1 ответ
Решение
Я смог решить эту проблему, только добавив $stmt->bindValue для полей, которые не были пустыми, добавив это:
foreach ($searchTerms as $field => $value) {
if ($value != null && $value != '' && $value != ' ' ) {
// Based on the key name in the array, decide which SQL statement to add to the array to be constructed
switch ($field) {
case 'locnum':
$stmt->bindValue(':locnum', $locnum, PDO::PARAM_INT);
break;
case 'drawnum':
$stmt->bindValue(':drawnum', $drawnum, PDO::PARAM_INT);
break;
case 'drawdate':
$stmt->bindValue(':drawdate', $drawdate, PDO::PARAM_STR);
break;
}
}
}