Intereting Posts
PHP конвертирует XML в JSON В чем разница между php5 и php5-dev Ошибка в кодировке mysql -> Как я могу переконвертировать его в другое? Использовать счетчик как часть переменной Отправлять почту с вложением с использованием нового API Gmail, но он не отображается для входящих сообщений получателя Самый простой способ извлечь изображения из документа MS Word с помощью PHP? Плагин проверки JQuery не отправляет данные POST Структура PHP для социальных сетей Нужна помощь в создании запроса на основе значений фильтра ui Как получить XML-данные как ассоциативный массив с атрибутами в качестве ключа в PHP PhpStorm не выделяет PHP-код внутри .php-файла при смешивании с HTML Сбалансированный перенос слов (минимальная рвность) в PHP Построить имя переменной PHP на основе других значений переменных и статического текста Извлечение данных XML в php Как передать URL в URL (как параметр GET) с помощью PHP?

Метод PHP Prepare не работает при вызове дважды?

Я использую метод подготовки следующим образом:

$db= new mysqli("localhost","***","***","***"); if ($db->connect_error) { die('Connection Error'); } $id = 1; if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? ')) { $stmt->bind_param('i', $id); $stmt->execute(); // $stmt->close(); echo "Success<br>"; } else { echo "Something broke :/<br>"; } $id =2; if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? ')) { $stmt->bind_param('i', $id); $stmt->execute(); echo "Success<br>"; } else { echo "Something broke :/<br>"; $error = $db->errno . ' ' . $db->error; echo $error; } 

Если я выполню скрипт, который я получаю

успех

Что-то сломалось: /

0

Как я могу узнать, почему метод подготовки не прошел, после того, как он вызван во второй раз? По какой-то причине $db->errno возвращает 0, что указывает на то, что ничего не $db->errno . Однако методы подготовки не выполняются и возвращают false, поэтому я не могу проверить $stmt->error;

Я случайно узнал, что, когда я $stmt->execute() первый $stmt->execute() , вызов метода подготовки снова работает нормально (при первом и втором вызовах). Что мне здесь не хватает?

редактировать

Как предложил Максим Ткач, если я раскомментирую

 // $stmt->close(); 

то я получаю

успех

успех

Но почему? Я никогда нигде не читал, что важно закрыть заявление о подготовке.

Это из руководства PHP:

Закрывает подготовленное заявление. mysqli_stmt_close () также освобождает дескриптор инструкции. Если текущий оператор имеет ожидающие или непрочитанные результаты, эта функция отменяет их, чтобы можно было выполнить следующий запрос.

Я не вижу, чтобы они сказали, что это важно для закрытия, чтобы выполнить второе заявление о подготовке. Я что-то упускаю?

Вам необходимо прочитать следующее: Подготовленные заявления

Выполненное выполнение инструкции состоит из двух этапов: подготовка и выполнение. На этапе подготовки шаблон отчета отправляется на сервер базы данных. Сервер выполняет проверку синтаксиса и инициализирует внутренние ресурсы сервера для последующего использования.

а также

Каждое подготовленное заявление занимает серверные ресурсы. Заявления должны быть немедленно закрыты сразу после использования. Если это не сделано явно, оператор будет закрыт, когда дескриптор оператора будет освобожден PHP.

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

И ваш код должен быть переписан следующим образом:

 $db= new mysqli("localhost","***","***","***"); if ($db->connect_error) { die('Connection Error'); } $id = 1; if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? ')) { $stmt->bind_param('i', $id); $stmt->execute(); echo "Success<br>"; } else { echo "Something broke :/<br>"; } $id = 2; $stmt->bind_param('i', $id); $stmt->execute(); $stmt->close(); 

PS Если вы добавите возвращаемое значение проверки bind и выполните – это будет хорошо

Вам нужно прочитать ошибку $ stmt->;

Чтобы читать, вам нужно переписать код, как в приведенном ниже примере.

 ... $stmt = new mysqli_stmt($db); if($stmt->prepare('SELECT name FROM table WHERE id = ? ')) { $stmt->bind_param('i', $id); $stmt->execute(); echo "Success<br>"; } else { var_dump($stmt->error); } ...