У меня есть следующие настройки конфигурации 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); }
Мне было интересно:
Зачем мне нужно включать global $mysqli
; внутри каждой функции в классе, если я не включаю, я получаю сообщение об ошибке вроде:
Неустранимая ошибка: вызов функции-члена prepare () для не-объекта в …
Что такое $stmt->store_result();
делать? Если я не включаю его, он возвращает 0 строк.
$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 знать, что вы сделали это с помощью этого оператора и набора результатов.