У меня есть файл db.php, который имеет в нем следующее:
// db.php file // creates connection to database // DATABASE CONNECTION FUNCTION function sql_con(){ try{ $dbh = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { // log error to file and display friendly error to user ExceptionErrorHandler($e); exit; } }
У меня есть страница регистрации, и я хочу проверить, существует ли имя пользователя, поэтому я вызываю свой sql_con();
заблаговременно, чтобы подключиться к базе данных, выполните следующий запрос
// connect to database sql_con(); $stmt = $dbh->prepare("SELECT `user_login` FROM `users` WHERE `user_login` = ? LIMIT 1"); $stmt->execute(array($username)); if ( $stmt->rowCount() > 0 ) { $error[] = 'Username already taken'; }
Я очень новичок в PDO, и с приведенным выше я получаю следующие ошибки:
Примечание. Неопределенная переменная: dbh в C: \ wamp \ www \ signup.php в строке 64
Неустранимая ошибка: вызов функции-члена prepare () для не-объекта в C: \ wamp \ www \ signup.php в строке 64
Наверное, что-то очень глупо, и я, кажется, путаю себя с PDO, поскольку я нахожусь на новичках. Может ли кто-нибудь сказать мне, что я делаю неправильно? Также я не уверен, что это правильный способ, поскольку я новичок в PDO, поэтому, если есть более эффективный способ выполнить проверку запроса имени пользователя, то, пожалуйста, дайте мне знать.
Это связано с тем, что объект $dbh
ограничен внутри блока try catch
и вашей функции sql_con()
из-за объема.
Правильным решением было бы удалить блок try catch
и вернуть переменную $dbh
в конце функции sql_con()
.
Затем:
try { $dbh = sql_con(); $stmt = $dbh->prepare("SELECT `user_login` FROM `users` WHERE `user_login` = ? LIMIT 1"); $stmt->execute(array($username)); if ( $stmt->rowCount() > 0 ) { $error[] = 'Username already taken'; } } catch (PDOException $e) { //Do stuff with $e }
Переменная $dbh
уничтожается после выполнения функции.
Вы можете попробовать вернуть дескриптор:
function sql_con() { // your connection code return $dbh; }
Затем на странице регистрации:
$dbh = sql_con();
В зависимости от ваших потребностей лучшей альтернативой может быть использование контейнера DI .
Вы определяете pdo в функции, а ist не видно.
function sql_con(){ try{ $dbh = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $dbh; //this } catch (PDOException $e) { // log error to file and display friendly error to user ExceptionErrorHandler($e); exit; } } $dbh = sql_con();
Будет лучше, если вы создадите класс для абстракции pdo.
$dbh = DB::getInstance();