Подготовленные инструкции ODBC в PHP

#php #odbc #prepared-statement

#php #odbc #подготовленное заявление

Вопрос:

Я пытаюсь использовать 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, поэтому выполнение завершается успешно, но строка не возвращается. Строка действительно существует с параметром_name = ‘version’. Почему не возвращается строка?

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

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

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

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

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

Комментарии:

1. Что odbc_num_rows($res); возвращает? Я хочу подтвердить тот факт, что запрос действительно возвращает непустой результат. odbc_fetch_array() может возвращать значение false, поскольку в результирующем наборе нет строк. Кроме того, появляются ли какие-либо сообщения об ошибках в вашем журнале ошибок PHP?

2. вы пробовали решение, которое я предложил? пожалуйста, оставьте отзыв

3. К сожалению, с новыми ответами придется подождать, пока у меня не появится время еще раз взглянуть на эту конкретную проблему. Прямо сейчас мне было поручено кое-что еще.

4. Просто чтобы обновить этот вопрос: я так и не нашел решения для этого. Мне просто пришлось обойтись без подготовленных инструкций. Я подозреваю, что это драйвер ODBC, установленный в системе, для которой я разрабатываю. К сожалению, это не может быть изменено в ближайшее время.

5. это старый пост, но как бы вы поступили, если бы хотели зациклить результаты вашего оператора select? Я пытаюсь сделать что-то подобное

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

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

Комментарии:

1. Пробовал это, но он считает, что параметр является столбцом.

2. Пожалуйста, ознакомьтесь с документами по odbc_execute … он возвращает логическое значение, значение true только при успешном выполнении запроса (независимо от того, есть строка или нет) и значение false, если запрос завершается неудачей. И odbc_exec возвращает ресурс.

Ответ №2:

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

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

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

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

Ответ №3:

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

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

Ответ №4:

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

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

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

Комментарии:

1. Действительно? odbc_execute наверняка возвращает true или false? php.net/manual/en/function.odbc-execute.php

2. Нет, это не так. odbc_execute возвращает логический статус. Вызовы корректны.

3. @psynnott -> Я получил это от uk.php.net/manual/en/function.odbc-fetch-array.php

4. @Toby это результат odbc_exec, а не odbc_execute 🙂

5. @psynnott да, только что заметил это! ого! Мои извинения!

Ответ №5:

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

Комментарии:

1. Я забыл также спросить вас, какой интерпретатор php вы используете; Я собираюсь внимательно посмотреть, есть ли какие-либо проблемы, которые могли бы привести к этому, поскольку кажется, что проблема в вызове функции, а не в вашем коде

2. Php 5.2.8 на linux fedora. Не совсем уверен, что вы имеете в виду, под каким интерпретатором php

Ответ №6:

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

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