Подтвердить что ты не робот

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

4b9b3361

Ответ 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.