Я пытаюсь использовать 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.