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
Ответы
Ответ 1
Попробуйте удалить одинарные кавычки из строки запроса и добавить их к самому значению параметра:
$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:
Если вы хотите сохранить строку, которая фактически начинается и заканчивается одиночным цитаты, вы должны добавить пробел или другое не-одиночный кавычек для начало или конец параметра, который предотвратит параметр из как имя файла.
Ответ 2
когда я читаю этот абзац
Любые параметры в параметре_array, которые начинаются и заканчиваются одинарными кавычками, будут считаться именем файла для чтения и отправки на сервер базы данных в качестве данных для соответствующего заполнителя.
Если вы хотите сохранить строку, которая на самом деле начинается и заканчивается одинарными кавычками, вы должны добавить пробел или другой символ без кавычек в начало или конец параметра, что предотвратит использование параметра как имя файла. Если это не вариант, вы должны использовать другой механизм для хранения строки, например, непосредственно выполнить запрос с помощью odbc_exec()).
Мне кажется, что нет необходимости добавлять одинарные кавычки '
в строку, только если вы действительно хотите иметь кавычки как текст в DB
Поэтому, если я хочу только вставить текст, без одиночных кавычек я бы написал что-то вроде этого...
см. этот пример из 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.
просьба дать отзыв, если это было правильно
Ответ 3
EDIT:
Га, игнорируйте меня, неправильно читайте php.net
odbc_fetch_array принимает в качестве параметра результат odbc_execute, вы, кажется, передаете подготовленный оператор.
Ответ 4
Какие СУБД вы используете? Тот факт, что выражение о подготовке одиночной вставки, по-видимому, выполняется в отношении базы данных, а не готовится к неудачной реализации php (маловероятно) или СУБД, не поддерживающей подготовленный sql. Если это так, возможно, что их способ поддержки команды без функциональности - это просто выполнить оператор, ведущий к полученным результатам. Если СУБД поддерживает подготовленные операторы, и реализация php корректно обрабатывает ее, возникает некоторая проблема с исполняемой вставкой, которая также нуждается в некотором исследовании.
Ответ 5
Вы пытались использовать двойные кавычки? то есть.
$res=odbc_execute($pstmt,array("version"));
Ответ 6
Вы не должны вставлять переменные в кавычки в подготовленный оператор:
$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.