2014-01-10 3 views
2

Я общался с объектом MySQLi в PHP и привык к подготовке инструкций перед их исполнением.Когда завершается подготовленное заявление?

До сих пор я в основном делаю следующее:

if($stmt = $mysqli->prepare($sql) == false){ 
    return $mysqli->error; 
} 

который, когда это не удалось, всегда говорил мне, что мой SQL был неправ в принципе.

Предположит следующее:

  • проверка была сделана, чтобы обеспечить MySQL Connectivity
  • SQL является правильным, даже если она возвращает 0 строк.
  • Все соответствующие таблицы существуют.

При каких обстоятельствах может быть подготовлено заявление? Я спрашиваю, в основном, интересно, есть ли какая-нибудь точка для if($stmt = $mysqli->prepare($sql)), или я просто растрачиваю строки кода?

+1

рядом с идеальным дубликатом [этот вопрос] (http://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting) –

+0

К сожалению, мои извинения, я думал, что я единственный, получив это ... Спасибо @kuroineko – Gary

+0

Нет проблем, Gary –

ответ

1

Есть много способов, действительный запрос может потерпеть неудачу:

  • Ваши привилегии таблиц могут быть отозваны.

  • Правильный SQL-запрос может быть отформатирован с помощью замедлителей параметров в недопустимых контекстах.

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

  • Вы говорите, что таблицы существуют, но любая таблица может быть отброшена или переименована. Кроме того, столбцы могут быть изменены, поэтому ваш ранее действующий SQL-запрос больше не находит имена столбцов или пытается использовать их недопустимыми способами.

  • Соединение может неожиданно прекратиться.

Так что вам нужно обнаруживать и реагировать на ошибки и когда вы подготовить и когда вы выполнить запрос.

Подумайте об аналогии с простой функцией открытия файла, например fopen(). У вас могут быть ошибки, если вы пропустили имя файла или удалили файл перед тем, как попытаться открыть его, или если кто-то изменит права доступа к файлам, чтобы вы не могли прочитать его с указанным вами режимом доступа. Это означает, что вам нужно проверить успех после каждые вызов fopen().

Вы можете уменьшить код проверки ошибок, если вы настроили mysqli для исключения исключений.См. http://www.php.net/manual/en/mysqli-driver.report-mode.php

1

Первое, что приходит мне на ум: связь не гарантируется после вашей проверки. Я уверен, что существует еще много. Но одной причины должно быть достаточно.

+0

Почему он должен переключиться на PDO, если MySQLi отлично подходит для него? –

+0

Чтобы избежать критической плиты котла. Но, я удалил эту рекомендацию. Здесь не ОП. –

Смежные вопросы