Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
MS SQL

Ошибка PDO

02.02.2018, 11:00. Показов 1231. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
        $db = new PDO('mysql:host=test.ua;dbname=site', 'root', '');
        $sql = "SELECT * FROM users WHERE id=:abc LIMIT :test";
        $res = $db->prepare($sql);
        $res->BindValue(':abc', "92368102");
        $res->BindValue(':test', "1");
        $res->execute();
        var_dump($res->fetchAll(PDO::FETCH_ASSOC));
Почему такой запрос не выдает результат?
а если запрос изменить на вот так:
PHP
1
$sql = "SELECT * FROM users WHERE id=:abc LIMIT 1";
то тогда всё норм
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2018, 11:00
Ответы с готовыми решениями:

Произошла ошибка с PDO
Здравствуйте, пытаюсь подключиться к база данных mysql через объект класса PDO. Присвоил переменным название бд, логин и пароль. $host =...

Ошибка соединения с PDO
Пытаюсь осваивать PDO define('DB_DRIVER','mysql'); define('DB_HOST','localhost'); define('DB_NAME','gallery'); ...

PHP PDO - фатальная ошибка fetch()
Доброго времени суток! Проблема такая - делаю проверку на существование логина пользователя (при регистрации), выскакивает ошибка...

11
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,913
02.02.2018, 11:04
http://phpfaq.ru/pdo#limit
0
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
02.02.2018, 11:18  [ТС]
Сделал так:
PHP
1
2
        $res->BindValue(':abc', "92368102", PDO::PARAM_INT);
        $res->BindValue(':test', "1", PDO::PARAM_INT);
то же самое
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,913
02.02.2018, 11:27
Покажите текст ошибки.
https://secure.php.net/manual/... orinfo.php
0
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
02.02.2018, 11:29  [ТС]
выдаёт просто пустой результат, пустой масив
0
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
02.02.2018, 23:46
Сразу после строки №1 добавить второй строкой:
PHP
1
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
А ещё лучше вообще так декларировать:
PHP
1
2
3
4
5
6
7
8
9
10
11
$dns = "mysql:host=test.ua; dbname=site; charset=utf8" ;
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
] ;
 
$db = new PDO($dns, 'root', '', $opt);
...
// Тогда и строку №7 можно заменить на
var_dump( $res->fetchAll() );
Хотя, конечно, дело личное.
Это я про стиль...
0
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
05.02.2018, 10:33  [ТС]
получилось)) спасибо
а подробнее можно узнать что имено мы сделали?

Добавлено через 54 минуты
теперь случилась та же проблема что изначально, выбивает пустой результат
когда у меня в запрое есть LIKE :search
я убираю эту строку:
PHP
1
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
и в запросе с LIKE всё окей, но тогда опять не работает там где LIMIT.
Что делать?
0
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
05.02.2018, 13:09
Цитата Сообщение от Tolick Посмотреть сообщение
а подробнее можно узнать что имено мы сделали?
Отключили эмуляцию подготовленных запросов.
Это хорошо описано здесь

А по поводу LIMIT, тут другое. Дело в том, что когда Вы работаете при включенном режиме эмуляции (PDO::ATTR_EMULATE_PREPARES = true), то PDO передаёт в execute все параметры, как string. То есть фактически Ваш запрос будет выглядеть, как
SQL
1
SELECT * FROM users WHERE id='92368102' LIMIT '1' ;
что уже является ошибкой в MySQL.
А для LIKE нужно строку при вызове bindValue передавать УЖЕ подготовленную, а не просто значение. В этом случае Ваш скрипт будет выглядеть так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$db = new PDO('mysql:host=test.ua;dbname=site', 'root', '') ;
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
$sql = "SELECT * FROM users WHERE id=:abc LIMIT :test" ;
$res = $db->prepare($sql) ;
 
// Биндим значения так
$res->bindValue(':abc', "92368102") ;
$res->bindValue(':test', "1");
 
// Или вот так - без разницы для numbers
$res->bindValue(':abc', 92368102) ;
$res->bindValue(':test', 1) ;
 
// А для LIKE будет выглядеть вот так
$res->bindValue(':search', "%что-то-там-искать%") ;
// Или лучше так
$search = "%что-то-там-искать%" ;
$res->bindValue(':search', $search) ;
 
// Теперь запускаем сиквел и выводим результат на экран
$res->execute() ;
$data = $res->fetchAll() ;
var_dump($data) ;
Проверяйте, всё должно работать.

Повторюсь: в таком варианте это будет работать при выключенном параметре PDO::ATTR_EMULATE_PREPARES.
Лучше всего установить его глобально для всей application и забыть, придерживаясь простых правил, описанных выше.

Добавлено через 18 минут
А, забыл сказать: чтобы функция в строке №22 работала в таком виде
PHP
1
$data = $res->fetchAll() ;
надо параметр PDO::ATTR_DEFAULT_FETCH_MODE установить в true. Тогда по умолчанию всегда будет выводить в ассоциативный массив. Но если не хотите, то можете написать, как было:
PHP
1
$res->fetchAll(PDO::FETCH_ASSOC) ;
Но тогда так надо будет вызывать ВЕЗДЕ в коде application.
Хотя, опять же, дело личное. На скорость не влияет..
0
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
05.02.2018, 13:17  [ТС]
Цитата Сообщение от EU1CJ Посмотреть сообщение
А для LIKE нужно строку при вызове bindValue передавать УЖЕ подготовленную, а не просто значение
Я это сделал, оно всё работает только при выключеном PDO::ATTR_EMULATE_PREPARES.
но тогда как мне быть? Получается что бы этот запрос заработал мне для LIMIT нужно его включать, а вот для LIKE нужно что бы включен был, как мне тогда сделать? Или взять тупо то что будет в LIKE просто проверить на число например
PHP
1
is_nameric()
и тупо не передавать через подготовленое выражение, тогда выключать эту штуку не надо получается: PDO::ATTR_EMULATE_PREPARES
и помимо этого вопроса вот еще один:
Как одним запросом вытащить записи и сколько их вообще в бд, запрос:
PHP
1
SELECT groupusers.iduser, users.firstname, users.lastname, users.photo100 FROM groupusers JOIN users ON users.id = groupusers.iduser WHERE idgroup=1234567 ORDER BY groupusers.id DESC LIMIT 0, 20
Этот запрос выдает мне 20 человек которые есть в группе, а вот так я получаю их кол-во общее
PHP
1
SELECT COUNT(groupusers.iduser) FROM groupusers JOIN users ON users.id = groupusers.iduser WHERE idgroup=1234567 ORDER BY groupusers.id DESC LIMIT 0, 20
но как-то это тупо, как в одном запросе сделать?
0
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
05.02.2018, 13:45
Цитата Сообщение от Tolick Посмотреть сообщение
Я это сделал, оно всё работает только при выключеном PDO::ATTR_EMULATE_PREPARES.
но тогда как мне быть? Получается что бы этот запрос заработал мне для LIMIT нужно его включать, а вот для LIKE нужно что бы включен был, как мне тогда сделать?
Что за ерунда. Какой там ещё is_numeric()?
Я же написал Вам скрипт, который будет работать. Ну, хорошо, сделайте так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$db = new PDO('mysql:host=test.ua;dbname=site', 'root', '') ;
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
$sql = "SELECT * FROM users WHERE id LIKE :abc LIMIT :test" ;
$res = $db->prepare($sql) ;
// Биндим 
$abc = "%92368102%" ;
$res->bindValue(':abc', $abc) ;
$res->bindValue(':test', 1) ;
// Запускаем
$res->execute() ;
$data = $res->fetchAll() ;
var_dump($data) ;
И, что - не работает?

По второму вопросу.
В PDO есть функция rowCount. После выполнения запроса №1 вызываете её
PHP
1
2
3
4
....
$res->execute() ;
$data  = $res->fetchAll() ;
$count = $res->rowCount() ;
получаете количество. Второй запрос не нужен.
0
1 / 1 / 1
Регистрация: 26.12.2012
Сообщений: 149
05.02.2018, 14:23  [ТС]
Сделал - пустой результат.
но если убрать с вашего кода это:
PHP
1
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
и поставить в LIMIT просто число 1 то тогда всё работает.
а если эту строку вставить
PHP
1
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
тогда с LIMIT всё окей, но с LIKE не работает.

Добавлено через 4 минуты
Может быть я аутист но я сделал как вы сказали

Добавлено через 12 минут
PHP
1
$count = $res->rowCount() ;
Не подходит, потому что я вытаскиваю по 20 записей, а мне нужно знать общее количество
0
26 / 26 / 17
Регистрация: 23.12.2017
Сообщений: 111
05.02.2018, 14:48
Аутизм здесь не при чём...
Напишите вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$db = new PDO('mysql:host=test.ua;dbname=site', 'root', '') ;
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ;
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false) ;
$sql = "SELECT * FROM users WHERE id LIKE :abc LIMIT :test" ;
$abc = "%92368102%" ;
 
try{
    $res = $db->prepare($sql) ;
    $res->bindValue(':test', 1) ;
    $res->bindValue(':abc', $abc) ;
    $res->execute() ;
}
catch (PDOException $e) {
    echo $e->getMessage()."<br />" ;
    echo $sql ;
}
 
$data = $res->fetchAll() ;
var_dump($data) ;
Запустите скрипт. Потом закомментируйте/раскомментируйте строку №3 (включите/выключите эмуляцию) и запустите опять.
Скопируйте ошибки, которые будут в браузере и выложите их здесь.
А то мы голословно рассуждаем, а ошибки явно в логах есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2018, 14:48
Помогаю со студенческими работами здесь

Ошибка при использовании PDO: right syntax to use near ''1', '10''
В коде два варианта. Второй через квери работает. Первый с препейром - нет. Fatal error: Uncaught exception 'PDOException' with...

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

Ошибка в PDO с INSERT INTO: SQLSTATE[HY093]: Invalid parameter number
Вот такая ошибка выскакивает: Warning: PDOStatement::execute(): SQLSTATE: Invalid parameter number: parameter was not defined Код: ...

PDO
Есть код: $Plan_ID = 1; $stmt = $pdo-&gt;prepare('SELECT * FROM Plans WHERE ID = ?'); $stmt-&gt;execute(); $Plan = $stmt-&gt;fetchAll(); ...

PDO
Всем привет, нашёл готовый PDO класс но вот не могу разобраться как сделать определённый запрос &lt;?php /** * Thin PDO Wrapper: A...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru