Как запустить запрос PDO / ODBC / PHP с двойной кавычкой?

Когда я запускаю следующий простой запрос в Microsoft Access:

select * from movie where moviename like 'batman'

оно работает.

Также использование двойных кавычек вокруг строки работает:

select * from movie where moviename like "batman"

У меня есть веб-сайт, где пользователь может ввести любой выберите запрос, который затем запустит PHP, и верните результаты записи пользователю. Я использую PDO / ODBC для подключения к базе данных Access. Если пользователь вводит запрос 1, он работает, но запрос 2 завершается неудачно с:

[Microsoft] [ODBC Microsoft Access Driver] Слишком мало параметров. Ожидаемый 1. (SQLExecute [-3010] в ext \ pdo_odbc \ odbc_stmt.c: 254)

В документации говорится о функции quote ():

«Не все драйверы PDO реализуют этот метод (особенно PDO_ODBC). Попробуйте вместо этого использовать подготовленные операторы».

но я не могу использовать подготовленный оператор, так как не знаю, какой запрос будет вводить пользователь. Иногда они используют «…» вокруг строки, а иногда «…».

Для воспроизведения вам нужна только база данных Access (.mdb / .accdb), по крайней мере с одной таблицей с именем «film» и столбцом «titel». Положите некоторые записи в нем. По крайней мере, 1 с «Бэтмен». Используйте следующий тестовый скрипт:

//also using a older Access version of the database "film.mdb" didn't work
//be sure to use full/absolute pathname
$dbnameFile="C:\\wamp\\www\\elearning2\\databases\\film.accdb";
$username="";
$password="";
$accessdriver="{Microsoft Access Driver (*.mdb, *.accdb)}";
$dbDB = new PDO("odbc:Driver=$accessdriver;Dbq=$dbnameFile", $username, $password,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

//Testcases, comment all but one
//Testcase 1: works
$sql="select * from film where titel like 'Batman'";

//Testcase 2: works
$sql='select * from film where titel like \'Batman\'';

//Testcase 3: COUNT field incorrect: -3010 [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
$sql="select * from film where titel like \"Batman\"";

//Testcase 4: COUNT field incorrect: -3010 [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
$sql='select * from film where titel like "Batman"';

//Testcase 5: Syntax error (missing operator) in query expression 'titel like \[Batman\]
$sql='select * from film where titel like \"Batman\"';

//Testcase 6: Syntax error (missing operator) in query expression 'titel like []Batman[]
$sql='select * from film where titel like ""Batman""';

$result=$dbDB->query($sql);
$rows=$result->fetchAll(PDO::FETCH_ASSOC);
$result->closeCursor();

foreach($rows as $row) {
echo $row["TITEL"]."\n";
echo "<br>";
}

$dbDB=null;

Как правильно экранировать заданный пользователем SQL-запрос для PHP / PDO / ODBC / Access? Или просто невозможно использовать разделитель строк «…», несмотря на работу в Access?

Я также нахожу сообщения об ошибках для теста 5 и 6 странными. Похоже, двойная кавычка превращается в [ или же ]??

Я не могу использовать параметры связывания, подготовленные операторы или переписать запрос, потому что запрос полностью неизвестен и предоставлен пользователем, а также может содержать синтаксические ошибки. Я не могу изменить этот пользовательский запрос и просто хочу, чтобы он выполнялся PDO / ODBC, но как?

Я использую Apache 2.4.9 и PHP 5.5.12, работающие локально на компьютере с Windows 7 SP1.

Я выложил официальный Отчет об ошибках PHP

Вот доказательство того, что оба запроса 1 и 2 работают в Access:
введите описание изображения здесь

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]