ODBC подготовил заявления в PHP - PullRequest
16 голосов
/ 22 апреля 2011

Я пытаюсь использовать odbc_prepare и odbc_execute в PHP следующим образом:

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name='?'");
$res=odbc_execute($pstmt,array('version'));
var_dump($res);  //bool(true)
$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

Первый var_dump возвращает true, поэтому выполнение завершается успешно, но строка не возвращается.Строка действительно существует с param_name = 'version'.Почему строка не возвращается?

Чтобы сделать вещи интересными, я запустил еще один очень простой пример в php, используя подготовленную вставку.

$pstmt=odbc_prepare($odb_con,"insert into tmp1 values(?,'?')");

Эта строка сама по себе вставила строку вбаза данных!!Конечно, это просто неправильно?Введенные данные были col 1 = пусто, col 2 =?

Любые советы о том, с чего начать исправление, будут оценены, спасибо.

Редактировать: Это в PHP 5.2.8

Ответы [ 6 ]

11 голосов
/ 22 апреля 2011

Попробуйте удалить одинарные кавычки из строки запроса и добавить их к самому значению параметра:

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");
$res=odbc_execute($pstmt,array(" 'version'"));
var_dump($res);  //bool(true)
$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

Символ пробела в начале значения параметра очень важен - если пробелнет, он будет обрабатывать переменную как путь к файлу.

From http://www.php.net/manual/en/function.odbc-execute.php:

Если вы хотите сохранить строку, которая фактически начинается и заканчивается одинарными кавычками,Вы должны добавить пробел или другой символ, не заключенный в одинарные кавычки, в начало или конец параметра, что предотвратит использование параметра в качестве имени файла.

5 голосов
/ 10 мая 2011

когда я читаю этот абзац

Любые параметры в parameter_array, которые начинаются и заканчиваются одинарными кавычками, будут приниматься как имя файла для чтения и отправки на сервер базы данных в качестве данных для соответствующего заполнителя.

Если вы хотите сохранить строку, которая фактически начинается и заканчивается одинарными кавычками, вы должны добавить пробел или другой символ, не заключенный в одинарные кавычки, в начало или конец параметра, что предотвратит принятие параметра как имя файла Если это не вариант, вы должны использовать другой механизм для хранения строки, например, выполнить запрос напрямую с помощью odbc_exec ()).

Мне кажется, что нет необходимости добавлять одинарные кавычки ' в строку, только если вы действительно хотите иметь кавычки в виде текста в БД

Поэтому, если бы я только хотел вставить текст, без одинарных кавычек я бы написал что-то подобное ...

см. Этот пример из odbc-prepare

http://www.php.net/manual/en/function.odbc-prepare.php

Use this example for IBM DB/2:

$q = "update TABLE set PASS=? where NAME=?";
$res = odbc_prepare ($con, $q);

$a = "secret"; $b="user";
$exc = odbc_execute($res, array($a, $b));

Это приведет к следующему утверждению

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");

$name = "version";
$params = array($name);

$res=odbc_execute($pstmt,$params);
var_dump($res);  //bool(true)

$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

Обратите внимание, что я не только удалил квот для значения в массиве params, но также удалил квот в операторе SQL .

Пожалуйста, дайте отзыв, если это было правильно

3 голосов
/ 09 мая 2011

Не следует заключать переменные в кавычки в подготовленном выражении:


$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");
$res=odbc_execute($pstmt,array(" 'version'"));

должно быть:


$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");
$res=odbc_execute($pstmt,array("version"));

Знаки вопроса представляют заполнители параметров, переданное значение предназначено длянеоткрытое, незамеченное значение, которое будет правильно экранировано интерпретатором SQL.

2 голосов
/ 06 мая 2011

Вы пробовали использовать двойные кавычки? т.е.

$res=odbc_execute($pstmt,array("version"));
2 голосов
/ 05 мая 2011

Какую СУБД вы используете? Тот факт, что единственный оператор подготовки к вставке, кажется, выполняется для базы данных, а не для подготовки, указывает либо на плохую реализацию php (маловероятно), либо на то, что СУБД не поддерживает подготовленный sql. В последнем случае возможно, что их способ поддержки команды без функциональности состоит в том, чтобы просто выполнить оператор, приводящий к полученным результатам. Если СУБД поддерживает подготовленные операторы и реализация php правильно их обрабатывает, возникает какая-то проблема с выполняемой вставкой, которая также требует некоторого изучения.

2 голосов
/ 22 апреля 2011

EDIT:

Гах, игнорируй меня, неправильно прочитал php.net

odbc_fetch_array принимает в качестве параметра результат odbc_execute, который вы, похоже, передаете в подготовленном операторе.

...