вопрос о mysqli подготовить

У меня есть следующие настройки конфигурации mysqli в отдельном файле:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

Теперь у меня есть некоторые функции в классе, который находится в другом файле. Sth вроде:

 function username_exists($username){ global $mysqli; if ($stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?")) { $stmt->bind_param("s", $username); $stmt->execute(); $stmt->store_result(); $count=$stmt->num_rows; $stmt->close(); } return ($count > 0 ? true : false); } 

Мне было интересно:

  1. Зачем мне нужно включать global $mysqli ; внутри каждой функции в классе, если я не включаю, я получаю сообщение об ошибке вроде:

    Неустранимая ошибка: вызов функции-члена prepare () для не-объекта в …

  2. Что такое $stmt->store_result(); делать? Если я не включаю его, он возвращает 0 строк.

  3. Нужно ли использовать $stmt->close(); после каждого запроса? (Например, у меня есть другие функции ниже этой функции, мне нужно использовать ее в конце каждой функции или в конце последней функции в классе?

Благодарю.

Первый вопрос: если ваша ссылка на объект $mysqli определена вне функции, она должна быть передана как параметр функции, такой как function username_exists($username, $mysqli) или указана с ключевым словом global . Вероятно, предпочтительнее использовать метод параметров функции, чтобы избежать использования глобальных переменных сферы в контексте области действия. Если вы не сделаете ни одного из них, $mysqli не известно внутри функции, так как функция не может видеть вне своей области.

Если вы хотите избежать ссылки на глобальный $mysqli , я бы предложил включить объект MySQLi в качестве члена вашего класса. После того, как вы перейдете в существующий объект MySQLi, вы можете ссылаться на него в каждой функции как $this->mysqli

 class My_Class() { public $mysqli; // everything else function some_func() { $this->mysqli->prepare(); // etc } } $x = new My_Class(); $x->mysqli = $mysqli; // or new mysqli("localhost", "my_user", "my_password", "world"); 

Второй вопрос: $stmt->store_result() извлекает полный набор результатов из завершенного запроса, вызванного execute() . Без него MySQLi еще не запросил никаких результатов, которые будут возвращены с сервера MySQL, даже если запрос может быть успешным. Это необходимо только для запроса SELECT который возвращает строки.

Третий вопрос: если вы вызываете один и тот же оператор SQL снова и снова в цикле, вам не нужно вызывать $stmt->close() после каждой итерации. В других случаях $stmt->close() вызывать $stmt->close() , освобождая память и позволяя серверу MySQL знать, что вы сделали это с помощью этого оператора и набора результатов.