Проверить имя пользователя существует с помощью PHP и PDO?

У меня есть файл 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();