powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PDO, параметры - на сервер уходит как char - не понимаю
24 сообщений из 24, страница 1 из 1
PDO, параметры - на сервер уходит как char - не понимаю
    #38401047
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бяда в следующем: получаю параметры из jqQuery:
Код: php
1.
2.
3.
4.
$page = $_GET['page'];
$limit = $_GET['rows'];
$sidx = $_GET['sidx'];                 
$sord = $_GET['sord'];


Далее формирую запрос (подключение пропускаю):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$query ="select a.store,max(a.date)as dats from receipt a group by a.store order by :sidx :sord limit :start, :limit";
MyLog($query);
$STH = $db->prepare($query);
$STH->bindParam(':sidx',$sidx);
$STH->bindParam(':sord',$sord);
$STH->bindParam(':start',$start);
$STH->bindParam(':limit',$limit);
$STH->execute();  


В результате параметры :start и :limit имеют значения '0' и '10' (т.е. char), а не ожидаемое 0 и 10 (цифра). С результирующей ошибкой в логах апача:
АПАЧ[Thu Sep 19 09:30:18 2013] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1' in C:\\Program Files\\Apache Group\\Apache2\\htdocs\\test\\get_data.php:72\nStack trace:\n#0 C:\\Program Files\\Apache Group\\Apache2\\htdocs\\test\\get_data.php(72): PDOStatement->execute()\n#1 {main}\n thrown in C:\\Program Files\\Apache Group\\Apache2\\htdocs\\test\\get_data.php on line 72, referer: http://127.0.0.1/test/
Чего я не правильно понял при работе с PDO?
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401092
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
AlexSSSS, вообще сомнительно что в месте :sidx и :sord можно использовать параметры. А для :start, :limit наверное надо использовать bindValue(':start', $start, PDO::PARAM_INT)
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401133
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ?]AlexSSSS, вообще сомнительно что в месте :sidx и :sord можно использовать параметры.
Эти параметры как раз и переварились нормально - они изначально char.
?А для :start, :limit наверное надо использовать bindValue(':start', $start, PDO::PARAM_INT)
Попробовал -
Код: php
1.
2.
$STH->bindValue(':start', $start, PDO::PARAM_INT);
$STH->bindParam(':limit',$limit, PDO::PARAM_INT);


результата не дало: та-же самая ошибка.
Попробовал "в лоб":
Код: php
1.
$query ="select a.store,max(a.date)as dats from receipt a group by a.store order by :sidx :sord limit ".$start." , ". $limit;


Сработало. Но тут теряется одна из "фишек" PDO про безопасные параметры.
Думаю дальше...
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401138
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
$STH->bindValue(':start', (int)$start, PDO::PARAM_INT);
$STH->bindParam(':limit',(int)$limit, PDO::PARAM_INT);
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401213
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Каменный цветок" вышел наполовину: параметр start - съеден, limit - по прежнему не переваривается:-(
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$STH->bindParam(':sidx',$sidx);
$STH->bindParam(':sord',$sord);
MyLog('Тип start='.gettype($start));
MyLog('Тип limit='.gettype($limit));
$limit=$limit+1-1;
MyLog('Тип limit='.gettype($limit));
$STH->bindValue(':start',(int) $start, PDO::PARAM_INT);
$STH->bindValue(':limit',(int) $limit, PDO::PARAM_INT);
$STH->execute(); 


В логе:
Код: plaintext
1.
2.
Тип start=integer
Тип limit=string
Тип limit=integer
Апач теперь ругается только на десятку:
Код: plaintext
...MySQL server version for the right syntax to use near '10' at line 1' in C....
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401241
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если?
Код: sql
1.
LIMIT :limit  OFFSET :offset



или

Код: php
1.
$STH->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401292
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSSSSНо тут теряется одна из "фишек" PDO про безопасные параметры.Ничего тут не теряется. Точнее, ничего не приобретается.
В order by можно указывать либо имена/алиасы полей или выражения на их основе, либо числовые литералы означающие номер поля в секции SELECT. В остальных случаях просто будет сортировка по указанному значению.
А в limit можено указывать только числовые литералы, которые можно туда подставить только конкатенацией. Сделаете ее сами или заставите это сделать PDO перед выполнением запроса - роли не играет. Это все равно будет конкатенация со всеми вытекающими последствиями.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401321
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНичего тут не теряется. Точнее, ничего не приобретается.
В order by можно указывать либо имена/алиасы полей или выражения на их основе, либо числовые литералы означающие номер поля в секции SELECT. В остальных случаях просто будет сортировка по указанному значению.
А в limit можено указывать только числовые литералы, которые можно туда подставить только конкатенацией. Сделаете ее сами или заставите это сделать PDO перед выполнением запроса - роли не играет. Это все равно будет конкатенация со всеми вытекающими последствиями.
Да это понятно! Именно так и обошел (добавил проверку на то, чтобы в этих параметрах были только цифры разумные, если не цифры - лепит 0 и 10).
Просто интересно теперь - а почему это произошло.
И не произойдет-ли в случае подобном этому (попробую попозже):
Код: php
1.
2.
$query ="select a.store,a.date as dats, sum(a.totalrub) as itogo from receipt a 
where sum(a.totalrub) < :PLANS group by a.store, a.date order by :sidx :sord limit :start, :limit";


Где значение :PLANS вводит лапками многомудрый юзверь :-(
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401334
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSSSS,

С where sum(a.totalrub) у вас точно ничего хорошего не выйдет.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401349
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401403
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон...
Исправляюсь:
Код: sql
1.
2.
select sel.* from (select a.store,DATE(a.`date`),sum(a.`amount`) as ITOGO from receipt a
group by a.store,DATE(a.date) limit 100) sel where sel.itogo<:PLANS
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401408
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HAVING не в моде?
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401426
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл про него :-(
Код: plsql
1.
2.
3.
select a.store,DATE(a.`date`) as dt,sum(a.`amount`) as ITOGO from receipt a
where DATE(a.`date`)>"2013-09-10"
group by a.store,DATE(a.date) having sum(a.`amount`)<100000 limit 1000
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401435
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSSSS,

в секции WHERE фунция DATE только вред приносит, не дает индексу использоваться. Уберите ее. Только дату в константе на забудьте на день увеличить, чтобы логика сохранилась.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401446
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$query ="select a.store,max(a.date)as dats from receipt a group by a.store order by :sidx :sord limit :start, :limit;";
$STH = $db->prepare($query);
$STH->execute(array(
         $sidx,
         $sord,
         (int)$start,
         (int)$limit
));
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401472
AlexSSSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так...$STH = $db->prepare($query);
$STH->execute(array(
$sidx,
$sord,
(int)$start,
(int)$limit
));
Спасибо. Сейчас попробую.


miksoftAlexSSSS,

в секции WHERE фунция DATE только вред приносит, не дает индексу использоваться. Уберите ее. Только дату в константе на забудьте на день увеличить, чтобы логика сохранилась.
Спасибо. Только обсуждение данного запроса уводит от темы. Этот запрос привел как пример своих "страхов". Т.е. того, что при написании:
Код: plsql
1.
...having sum(a.`amount`)<:PLANS

и вводе пользователем цифры 100000, при применении параметра в PDO серверу пойдет
Код: plsql
1.
...having sum(a.`amount`)<'100000'

то есть строка, а не
Код: plsql
1.
...having sum(a.`amount`)<100000
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401475
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexSSSS,

Что там пойдет в PDO - не знаю, не пользовался. Но можно подстраховаться на уровне MySQL:
Код: sql
1.
having sum(a.`amount`)<(:PLANS+0)
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401483
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: php
1.
...having sum(a.`amount`)<'100000'


то есть строка, а не
Код: php
1.
...having sum(a.`amount`)<100000



Это равносильно
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401484
FatalPHPError
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ORDER BY биндите? Наркоманы, штоле?
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401485
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
SELECT 1 = '1'
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401493
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hettавтор
Код: php
1.
...having sum(a.`amount`)<'100000'



то есть строка, а не
Код: php
1.
...having sum(a.`amount`)<100000

Это равносильноКонкретно с sum() точно не знаю, а в общем случае - нет.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401568
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftHettпропущено...
Это равносильноКонкретно с sum() точно не знаю, а в общем случае - нет.
В случае сравнения.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401569
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторComparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL. These operations work for both numbers and strings. Strings are automatically converted to numbers and numbers to strings as necessary.
...
Рейтинг: 0 / 0
PDO, параметры - на сервер уходит как char - не понимаю
    #38401585
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettавторStrings are automatically converted to numbers and numbers to strings as necessary.Вот тут-то собака и порылась. MySQL не всегда имеет возможность узнать правильное направление преобразования.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PDO, параметры - на сервер уходит как char - не понимаю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]