PDO access.mdb не исключает проценты во время запроса SELECT в подготовленном выражении - PullRequest
0 голосов
/ 10 мая 2018

Я не знаю, если это проблема только для 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 функций в моем проекте! !!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...