#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"));