У меня есть следующие настройки конфигурации 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 знать, что вы сделали это с помощью этого оператора и набора результатов.