PDO работа с :placeholders через bindValue

hell0w0rd

Продвинутый новичок
Ну на мой взгляд не правильно так делать. Правильней было-бы явно указывать тип, а расширение его биндит. Можно переписать тот-же bindValue:
PHP:
$q->bindValue('i:time', '100');
$g->bindValue(':time', '100', PDO::PARAM_INT);
 

Фанат

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

hell0w0rd

Продвинутый новичок
PHP:
$ php -a
Interactive shell

php > $str = '+1';
php > var_dump(ctype_digit($str));
bool(false)
php > var_dump((int)$str);
int(1)
php > var_dump((int)$str == $str);
bool(true)
Это я к тому что проверять то что у тебя в коде, раз уж так хочется брать тип из переменной лучше так:
PHP:
if ($value == $tmp = (int)$value) {
    $value = $tmp;
    $type  = PDO::PARAM_INT;
}
А если делать с явным указанием типов, но без наворотов вроде bind* -
PHP:
$db->query($sql, ['i:time' => '100']);
 

Фанат

oncle terrible
Команда форума
раз уж так хочется брать тип из переменной лучше так:
вопрос не в том, какой тип указывать. судя по поведению пдошечки, можно PDO::pARAM_INT вообще по дефолту ставить.
там вся суть не в
PHP:
     $type  = PDO::PARAM_INT;
а в
PHP:
     $value = intval($value);
 

hell0w0rd

Продвинутый новичок
Фанат
Так я и не про PARAM, а про определение типа. Так как ща - со знаком работать не будет)
 

Фанат

oncle terrible
Команда форума
я бы отказался от INT в пользу numeric
Так я и не про PARAM, а про определение типа. Так как ща - со знаком работать не будет)
Ещё раз.
Тип мы определяем для того, чтобы привести его.
Абстрактный нумерик непонятно, к чему приводить.
Так как ща - работать не будет в некоторых маргиналных случаях, НО без та как ща - вообще ни в каких не будет. Поэтому так как ща - в 100 раз лучше, чем не так как ща.

Еще раз объясню причину.
Если $i = '10'; то при выключенных препаредах ПДОшечка в запрос отправит '10'
что делает всю идею автоматическгого биндинга нерабочей.
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Фанат
Да понял я уже. Я говорю что не правильно ты приводишь. Ты код посмотри который я написал, он исправляет косяк с отрицательными числами, например.
 

Фанат

oncle terrible
Команда форума
Фанат
Да понял я уже. Я говорю что не правильно ты приводишь. Ты код посмотри который я написал, он исправляет косяк с отрицательными числами, например.
PHP:
$str = "25 ponies";
var_dump((int)$str == $str);
bool(true)
do not want
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Фанат, так правила приведения в базах, в PDO и в самом PHP различны, какое правило будет у тебя?
 

Фанат

oncle terrible
Команда форума
Фанат, так правила приведения в базах, в PDO и в самом PHP различны, какое правило будет у тебя?
Гриш, ты просто невнимательно читал тему.
Речь не о пхп, не о базе, а о ПДОшечке.
Которая, если ей ЯВНО сказать, что параметр инт, но у переменной оказыется тип стринг, то эта тупая либа забиндит его как стринг.
Что и послужило, собственно, поводом к созданию этого топика.
Проблема только в ПДО, в том, как он биндит переменные. причем не только по дефолту в STR, что было бы понятно, но и если явно указать INT (что при автоматическом биндинге все равно будет проблематично).

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

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
читал я несколько раз и старался внимательно, но вот в такой формулировке это звучит иначе

а вы не хотите такое поведение зарепортить?
 

Фанат

oncle terrible
Команда форума
а вы не хотите такое поведение зарепортить?
Это ж пдо. Слуга семи господ. Здесь потянешь - там отвалится.
Наверняка сделано ради совместимости с каким-нибудь экспериментальным ОДБЦ драйвером к Клипперу. Ровно по тем же самым причинам, по которым выпилен биндинг одинаковых плейсхолдеров при отключенной эмуляции.
 
Сверху