ODBC подготовил заявления в PHP

Я пытаюсь использовать 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 = blank, col 2 =?

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

Изменить: это в PHP 5.2.8

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

 $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) 

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

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

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

когда я прочитал этот абзац

Любые параметры в параметре_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) 

Смотрите, что я не только удалял qoutes для значения в массиве params, но также удалял qoutes в инструкции SQL .

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

РЕДАКТИРОВАТЬ:

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

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

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

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

 $res=odbc_execute($pstmt,array("version")); 

Вы не должны вставлять переменные в кавычки в подготовленный оператор:

$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'")); 

должно быть:

$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.