Я не знаю, если это проблема только для PDO, подключающегося к базе данных MDB ACCESS (а не к MySQL), но у меня проблема во всех запросах SELECT, где я вставляю %
с использованием подготовленного оператора.
Это мой пример:
Table.Col1 is a TEXT field
Table.Col2 is a INT field
Когда я ищу внутри Col1
, я хочу найти точный термин (не начинающийся с ... или не заканчивающийся ... но точный термин, который я передаю)
Пример скомпилированной таблицы
| ID | Col1 | Col2 |
-------------------------
| 1 | test | 23 |
-------------------------
| 2 | apple | 24 |
-------------------------
| 3 | applejuice| 33 |
-------------------------
| 4 | yellow | 76 |
-------------------------
| 5 | brown | 50 |
-------------------------
<?php
$dbName = "Database.mdb";
try{
$db= new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbName; Uid=; Pwd=;");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo $e->getMessage();
exit();
}
function test($filters = array()) {
$sql = "SELECT * FROM Table WHERE 1";
$vars = array();
// FILTER BY Col1
if ( isset($filters['Col1']) && $filters['Col1'] != "" ) {
$sql .= " AND [Table].[Col1] LIKE ?";
$vars[] = $filters['Col1'];
}
// FILTER BY Col2
if ( isset($filters['Col2']) && $filters['Col2'] != "" ) {
$sql .= " AND [Table].[Col2] = ?";
$vars[] = $filters['Col2'];
}
try {
$s = $db->prepare($sql);
$s->execute($vars);
$ris = $s->fetchAll(PDO::FETCH_ASSOC);
return $ris;
} catch (PDOException $e) {
die($e);
}
}
Теперь это мои тесты:
var_dump(test(array("Col1" => "test")));
// OUTPUT CORRECT
array(
0 => array(
"ID" => 1,
"Col1" => test,
"Col2" => 23
)
);
var_dump(test(array("Col1" => "apple")));
// OUTPUT CORRECT
array(
0 => array(
"ID" => 2,
"Col1" => applejuice,
"Col2" => 33
)
);
var_dump(test(array("Col1" => "%")));
// OUTPUT INCORRECT !!!!
// I GET ALL TABLE!!! I WANT TO RETRIEVE A EMPTY RESULT ARRAY
array(
0 => array(
"ID" => 1,
"Col1" => test,
"Col2" => 23
),
1 => array(
"ID" => 2,
"Col1" => apple,
"Col2" => 24
),
2 => array(
"ID" => 3,
"Col1" => applejuice,
"Col2" => 33
),
3 => array(
"ID" => 4,
"Col1" => yellow,
"Col2" => 76
),
4 => array(
"ID" => 5,
"Col1" => brown,
"Col2" => 50
),
0 => array(
"ID" => 2,
"Col1" => applejuice,
"Col2" => 33
)
);
Почему готовое заявление не работает? У меня много функций, где мне нужно ВЫБРАТЬ, где я ищу ТОЧНЫЙ ТЕСТ ... Как я могу решить эту проблему с %
для ВСЕХ моих таблиц, не переписывая все мои функции (более 100 функций в моем проекте! !!)