Причина, по которой вы получаете эту ошибку, к сожалению, код культа груза .
Хотя это случается со всеми нами, когда мы просто бездумно копируемвставьте код, но, тем не менее, мы должны понимать, что делает наш код и сознательно добавлять операторы.
Код проверки ошибок, который вы добавили,
if($conn -> query($sql) === TRUE){
пытается выполнить ваш запрос снова (что само по себе не имеет смысла) и без подготовленного оператора.И, естественно, вы получаете эту ошибку, поскольку query()
не понимает местозаполнители.
По иронии судьбы, код для проверки ошибки является причиной, по которой вы получаете ошибку.
Но самое интересное, что тестирование результата запроса вручную вообще неверно, независимо от того, является ли его реализация технически правильной или нет.Вместо этого вы должны настроить mysqli для автоматического исключения в случае ошибки :
- это сделает ваш код менее раздутым (так как вам не нужно будет добавлять любой такой кодвообще)
- сделает ваш код дружественным к производству (как, например, грубая ошибка, выпадающая на живом сервере)
- случайно,он ответит на ваш вопрос (в случае реальной ошибки базы данных) - , где ваш код выдает ошибку.Ваш текущий код, так сказать, не имеет «свидетельства о рождении», и в большой кодовой базе будет действительно невозможно определить, в какой части он потерпел неудачу - это может быть любой запрос в любом файле.В то время как правильно генерируемая ошибка всегда содержит имя файла и номер строки, а также трассировка стека , которая показывает точный путь, по которому следовал код, который привел к ошибке.
Для этого необходимо добавить следующую строку в код подключения mysqli:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Пожалуйста, ознакомьтесь с моими статьями по Отчетам об ошибках PHP и , как сообщать об ошибках вmysqli для более подробного объяснения