Правильное использование MySQLi - PullRequest
2 голосов
/ 30 августа 2010

Может кто-нибудь рассказать мне, как правильно использовать расширение MySQLi в PHP?Я всегда использовал процедурные функции MySQL прежде и хочу внести изменения, но нахожу примеры на PHP.net и других сайтах слишком сложными.Кажется, есть несколько способов сделать одно и то же.Я хочу использовать его в следующем методе:

function checkCredentials($username, $password)
{
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1");
    $q->bind_param('ss', $username, $password);
    $q->execute();
}

Насколько я могу судить по примерам PHP.net, но я получаю эту ошибку:

Fatalошибка: вызов функции-члена prepare () для необъекта в C: \ xampp \ htdocs \ classes \ user.class.php в строке 14

(переменная $db являетсяобрабатывать в моем пользовательском классе, и это прекрасно работает)

Просто кажется, что документация слишком сложна для тех, кто никогда раньше не использовал намерение, и для кого-то, кто умеренно плохо знаком с классами и ООП.

У кого-нибудь есть ссылки на страницы, объясняющие, как соединить / подготовить операторы / выполнить запросы и все такое, или можно записать это в ответе?

Спасибо.

Ответы [ 3 ]

1 голос
/ 30 августа 2010

Полученная ошибка означает, что $db не является объектом.

Одна из возможностей состоит в том, что вы инициализировали $db вне вызова функции, но пытаетесьиспользуйте внутри функции - в этом случае вам необходимо импортировать ее из глобального пространства имен, используя ключевое слово global.Глобальные переменные в PHP не отображаются автоматически внутри функций - вы должны указать PHP сделать глобальную переменную видимой:

function foo() {
    global $db;
    // do stuff with $db
}

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

1 голос
/ 30 августа 2010

Проблема в том, что $db не находится в области видимости (поэтому он инициализируется как null). Если бы вы указали error_reporting на E_ALL, вы бы увидели уведомление о попытке использовать неинициализированную переменную $db ... Вам нужно как-то перенести $db в область функций:

Если это глобальный вариант:

function checkCredentials($username, $password) {
    global $db;

Если это переменная-член (и эта функция действительно является методом в объекте):

function checkCredentials($username, $password) {
    $q = $this->db->prepare();

Если это что-то еще, вы можете передать это:

function checkCredentials($username, $password, $db) {
1 голос
/ 30 августа 2010

$ дБ не объявлено глобальным.Поместите global $db в функцию:

function checkCredentials($username, $password)
{
    global $db;
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1");
    $q->bind_param('ss', $username, $password);
    $q->execute();
}

Это не очень хороший стиль ООП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...