Вашият PDO е конфигуриран да емулира подготвени заявки, докато mysqli използва истински подготвени заявки.
Подготвената заявка свързва низа ''1''
като стойност на целочислен параметър. PHP го принуждава до цяло число, използвайки нещо като intval()
. Всеки низ с водещи знаци, които не са числови, се интерпретира като 0 от PHP, така че стойността на параметъра се изпраща след подготовката е стойността 0.
Фалшивата подготвена заявка използва интерполация на низ (вместо обвързване), за да добавите низа ''1''
в SQL заявката преди MySQL го анализира. Но резултатът е подобен, тъй като SQL също третира низ с нечислови водещи знаци в целочислен контекст като стойност 0.
Единствената разлика е това, което завършва в общия регистър на заявките, когато параметърът е обвързан преди подготовка спрямо след подготовка.
Можете също така да накарате PDO да използва реални подготвени заявки, така че трябва да действа точно като mysqli в този случай:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:Това може да демонстрира добра причина защо е обичайно стойностите на идентификатор да се започват от 1 вместо от 0.