Twoje PDO jest skonfigurowane do emulowania przygotowanych zapytań, podczas gdy mysqli używa prawdziwych przygotowanych zapytań.
Przygotowane zapytanie wiąże ciąg ''1''
jako wartość parametru całkowitego. PHP przekształca go w liczbę całkowitą za pomocą czegoś takiego jak intval()
. Każdy ciąg znaków z nienumerycznymi znakami wiodącymi jest interpretowany przez PHP jako 0, więc wartość parametru wysyłana jest po przygotowanie to wartość 0.
Fałszywe przygotowane zapytanie wykorzystuje interpolację ciągów (zamiast wiązania), aby dodać ciąg ''1''
do zapytania SQL przed MySQL analizuje to. Ale wynik jest podobny, ponieważ SQL traktuje również łańcuch z nienumerycznymi znakami wiodącymi w kontekście całkowitym jako wartość 0.
Jedyną różnicą jest to, co kończy się w ogólnym dzienniku zapytań, gdy parametr jest powiązany przed przygotowaniem, a co po przygotowaniu.
Możesz także sprawić, by PDO używało prawdziwych, przygotowanych zapytań, więc powinno działać tak jak mysqli w tym przypadku:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:może to wskazywać na dobry powód, dla którego zwyczajowo zaczyna się wartości identyfikatorów od 1 zamiast od 0.