2014-11-16 2 views
0

Я делаю сценарий регистрации и использую PDO в первый раз, но я получаю эту ошибку при попытке ее использовать. Определения отлично работают при использовании MySQLi.Ошибка PDO: не выбрана база данных

Мой код дает мне эту ошибку:

Array ([0] => SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected) 

Это код: (/register.php)

try{ 
     $input_password_hash = password_hash($input_password, PASSWORD_DEFAULT); 
     $stmt = $PDO_new->prepare("SELECT user_name FROM users WHERE user_name = :username"); 
     $stmt->bindParam(":username",$input_username); 
     $stmt->execute(); 
     echo "code after exec"; 
     //checks if user already exist in database. 
     if($stmt->rowCount()>0){ 
      $error[] = "Username already exist"; 
      echo "user is there"; 
     } 
     else{ 
      echo "user not there"; 
      $insert = "INSERT INTO users(user_name, user_password_hash, user_email) VALUES($input_username,$input_password_hash, $input_email)"; 

     } 


    } catch(PDOException $e){ 
     $error[] = $e->getMessage(); 
    } 

Это файл для подключения к Databse: ((конфиг/db_connect.php)

<?php 
require_once($_SERVER['DOCUMENT_ROOT']."/config/db.php"); 
$PDO_new = new PDO("mysql:host=" . DB_HOST . ";DBName=" . DB_NAME, DB_USER, DB_PASS); 
$PDO_new->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

И это файл, в котором я определяю информацию для базы данных: (/config/db.php)

+2

Почему у вас установлены соединения MySQLi и PDO? Они несовместимы. Я не уверен в чувствительности к регистру в строке подключения PDO, но обычно это нижний регистр: '; dbname =". DB_NAME' –

+0

Да, попробуйте изменить 'DBName' на' dbname'. –

ответ

3

Быстрый тест показывает, что соединение PDO чувствительно к регистру при анализе атрибутов. Вы используете DBName, когда вы должны использовать нижний регистр dbname. Это явно не указано in the PDO::__construct() docs, насколько я могу судить, но я смог проверить его тестирование в моей собственной среде.

$PDO_new = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS); 
//--------------------------------------------^^^^^^^^^^ 

Неясно, почему вы также установить соединение через MySQLi как MySQLi и PDO сравнимые, но несовместимые интерфейсы API. Обычно вам нужен один или другой, а не оба (если вы не комбинируете код из двух источников, которые используют противоположные API).

Рекомендуется обернуть new PDO() в try/catch, чтобы уловить ошибки соединения перед установкой ERRMODE_EXCEPTION.

try { 
    $PDO_new = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS); 
} catch (PDOException $e) { 
    // handle a connection error error 
} 

Наконец, я бы упущением, если бы я не указывал на то, что у вас есть простые переменные в INSERT заявлении, а не связанные параметры. Вы должны быть привязаны к значениям с заполнителями здесь, как и в первом заявлении SELECT.

// Use placeholders please! 
$insert = "INSERT INTO users(user_name, user_password_hash, user_email) VALUES(:input_username,:input_password_hash, :input_email)"; 
// prepare() then execute()... 
+0

А, спасибо, я испытаю это сейчас Просто забыл удалить строку с Mysqli, поскольку у меня было это для тестирования, если она сработала с mysqli. – uruloke

+0

Да, исправлена ​​проблема, спасибо. Теперь я вижу, почему я изменил ее на «DBName», потому что я использовать phpstorm как IDE, и мне не понравилось, что он сказал, что это опечатка, когда я написал «dbname» вместо «DBName» – uruloke

+0

От имени себя и многих других я уверен: спасибо, что нашли время, чтобы проверить свою теорию Майкла о 'dbname' с учетом регистра. +1 с моей стороны. Я никогда этого не знал до сих пор. Однако я всегда следил за руководствами по синтаксису, но никто не знает, пока кто-то не отклоняется от нормы (когда-либо поэтому s легко), * cheers * –

Смежные вопросы