Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
MySQL

PDO bindValue и prepare

04.09.2016, 20:37. Показов 1932. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Никак не могу понять, в чем ошибка ... Не могу совместить prepare и bindValue. ( Наверно сейчас не совсем понятно, лучше тогда прикреплю ниже свой код )

PHP
1
2
3
4
5
6
7
$sql = 'SELECT * FROM journal where user=:usr LIMIT :limit OFFSET :offset';
 
$db_con = new PDO("...");
$res = db_con->prepare($sql);
$res->bindValue(':limit', (int)$limit, PDO::PARAM_INT);
$res->bindValue(':offset', (int)$offset, PDO::PARAM_INT);
$res->execute(array(':usr'=>$this->Uid)));
Самое интересное в том, что если из запроса убрать (where user=:usr) и $res->execute() использовать без каких либо параметров, то всё работает ... А вот совместить и доп параметры в execute и bindValue не удается
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2016, 20:37
Ответы с готовыми решениями:

PDO: bindParam и bindValue
Добрый вечер! Уже полдня бьюсь вот с этим: $queryStr = "SELECT product_num, label, price, bonus_asrt FROM assortment ORDER BY...

PDO, разница bindParam и bindValue
Используется библиотека PDO. Вопросы следующие: 1) В чем разница между этим $sth = $db->prepare("SELECT * FROM products...

PDO, Postgres. Долго выполняется SELECT, если есть bindValue
Всем привет! Очень-очень странный баг. Есть табличка postgres с 3.5кк записей. Есть два почти идентичных скрипта: ...

13
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.09.2016, 20:48
Цитата Сообщение от Bigeron Посмотреть сообщение
$res->bindValue(':limit', (int)$limit, PDO::PARAM_INT);
Дополнительное приведение типа можно убрать.

А если так?
PHP
1
$sql = 'SELECT * FROM `journal` where `user`=:usr LIMIT :limit OFFSET :offset';
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
04.09.2016, 20:53  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
А если так?
Всё та же ошибка

PHP
1
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.09.2016, 20:59
Я подумал -- ошибка в запросе.

Цитата Сообщение от Bigeron Посмотреть сообщение
А вот совместить и доп параметры в execute и bindValue не удается
Ну тогда всё правильно. Выдержка из документации к методу execute:
Массив значений, содержащий столько элементов, сколько параметров заявлено в SQL запросе.
Либо все через bind* привязывайте, либо все в массив добавьте, для execute.
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
04.09.2016, 21:05  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
Либо все через bind* привязывайте, либо все в массив добавьте, для execute.
В том то и дело, что если добавлять limit и offset в массив, а потом его в execute, то $res->rowCount() == 0

Не уже ли всё через bind переделывать ?!
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
05.09.2016, 22:26  [ТС]
Наткнулся вот на такой момент ...
PHP
1
$res->bindParam(':offset', $offset, PDO::PARAM_INT);
Если $offset = 0, то ловлю вот такую ошибку ...
PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 983
06.09.2016, 08:46
Bigeron, https://github.com/mvcbox/sql-query
PHP
1
$rows = qb()->table('journal')->limit($limit)->offset($offset)->all();
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
06.09.2016, 16:44  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
$rows = qb()->table('journal')->limit($limit)->offset($offset)->all();
А чем мне это поможет ?
0
Software Engineer
 Аватар для Custos
332 / 335 / 55
Регистрация: 23.09.2014
Сообщений: 983
06.09.2016, 20:43
Bigeron, обертка над PDO для упрощения работы с СУБД.
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
06.09.2016, 23:54  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
обертка над PDO для упрощения работы с СУБД.
Так вопрос не в этом был ...

PHP
1
$res->bindParam(':offset', $offset, PDO::PARAM_INT);
Если $offset = 0, то получаю вот такую ошибку
PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
07.09.2016, 00:25
Bigeron, как вам уже сказали, используйте для установки параметров что то одно:
либо bindValue/bindParam
PHP
1
2
3
4
$res->bindValue(':limit', $limit, \PDO::PARAM_INT);
$res->bindValue(':offset', $offset, \PDO::PARAM_INT);
$res->bindValue(':usr', $this->Uid);
$res->execute();
либо передачу массива в execute
PHP
1
2
3
4
5
6
$params = [
    ':limit'  => (int)$limit,
    ':offset' => (int)$offset,
    ':usr'    => $this->Uid
];
$res->execute($params);
Не надо смешивать эти способы.

В вашем же случае нужно использовать только 1й вариант - execute передает значения как строки(в кавычках), а limit/offset требуют целые числа.
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
07.09.2016, 00:37  [ТС]
Cra3y,
Цитата Сообщение от Cra3y Посмотреть сообщение
как вам уже сказали, используйте для установки параметров что то одно.В вашем же случае нужно использовать только 1й вариант
Я так и поступил. Но вот теперь загвоздка в том, что если в $offset передавать 0, то вываливается ошибка

PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.09.2016, 00:39
Цитата Сообщение от Bigeron Посмотреть сообщение
что если в $offset передавать 0, то вываливается ошибка
Точно именно 0, а не NULL?
0
 Аватар для Bigeron
4 / 4 / 0
Регистрация: 01.02.2013
Сообщений: 139
07.09.2016, 01:10  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Точно именно 0, а не NULL?
А... всё, нашёл в чем был косяк...
Для заполнения $offset у меня было условие, чтобы он был хоть чему то равен ...
PHP
1
if (offset <> '')
А у Php идёт автоматом преобразование типов ... поэтому '' был равен 0 ... и поэтому не заполнял :offset, о чем и высвечивалась ошибка ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2016, 01:10
Помогаю со студенческими работами здесь

Не работает PDO::prepare
Не заполняется таблица.Подскажите пожалуйста в чем беда??((Ошибку не выдает-просто пустая таблица и все.. Если делаю не подготовленный...

PDO и prepare по переменной
Добрый день, уже час бьюсь над проблемой и никак не могу решить, как получить значение из таблицы, где поле login = $login ? &lt;?php...

PDO prepare Не получается выборка из базы
Доброго времени суток! Пытаюсь переделать запросы для защиты от sql инъекций, но ни чего в это не понимаю.. Помогите разобраться.. На...

PHP PDO PREPARE (ошибка SQLSTATE[42000])
$dbh = new PDO(..); $tableName = 'Name'; $outData = $dbh-&gt;prepare('SELECT * FROM :tableName ORDER BY `id` DESC'); ...

PDO::prepare для нескольких строк SQL
sql содержит несколько строк кода, можно их выполнить одним приемом, или нужно для каждой строки sql писать свой код pdo? мой код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru