2014-01-16 2 views
2

хорошо, так что я только начал на проекте и Im создание членской части сайта у меня есть 2 классов до сих пор одна за другую базу данных для управления пользователями здесь они:неприятности вставки PDO

class dbConnect 
{ 
    protected $db_conn; 
    public $db_name = 'todo'; 
    public $db_user= 'root'; 
    public $db_pass = 'pass'; 
    public $db_host = '127.0.0.1'; 

    function connect() 
    { 
     try 
     { 
      $this->db_conn = new PDO("mysql:host=$this->db_host;dbname = $this->db_name",$this->db_user,$this->db_pass); 
      return $this->db_conn; 
     } 
     catch(PDOException $e) 
     { 
      return $e->getMessage(); 
     } 
    } 
} 

здесь является пользователи класса

class ManageUsers 
{ 
    public $link; 

    function __construct() 
    { 
     $db_connection = new dbConnect(); 
     $this->link = $db_connection->connect(); 
     return $this->link; 
    } 

    function registerUsers($username,$pass,$ip_adress,$time,$date) 
    { 
     $query = $this->link->prepare("INSERT INTO `users` (username, password, ip_adress, time, date_joined) VALUES (?,?,?,?,?)"); 
     $values = array($username,$pass,$ip_adress,$time,$date); 
     $query->execute($values); 
     $counts = $query->rowCount(); 
     return $counts; 
    } 
} 

$users = new ManageUsers(); 
echo $registered = $users->registerUsers('bob','marley','127.0.0.1','12:00','29-02-2012'); 

Теперь вопрос, который я имею, что это не вставляя данные в базу данных я тройной проверил и таблицы в базе данных соответствует запросу, так, может быть, его что-то в синтаксисе. Функция работает без ошибок и возвращает ноль вместо 1. Ну спасибо за помощь успокойтесь

+0

Вы вызываете оба класса из двух отдельных файлов или оба класса внутри одного файла? –

+0

отдельно, но im, включая класс dbconnect в классе управляющих – user3051232

+0

@ Fred-ii- include_once 'class.db.PHP '; – user3051232

ответ

1

Ну, есть несколько очевидных проблем:

  • Ваша проблема заключается в том, что вы не настроили свой PDO Правильный драйвер

Практика прекращения выполнения, когда команда SQL/запрос завершается с ошибкой. Для того, чтобы активировать его, необходимо задать соответствующий параметр драйвера PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

  • Ваш dbConnect класс не имеет смысла

Прежде всего, вы подключаетесь к MySQL серверу и, следовательно, было бы гораздо лучше указать это как-то. И так как ваш dbConnect является логической частью подключения к базе данных, composition - это не путь. Вместо того, что класс должен быть расширен (как она удовлетворяет is-a отношения)

Таким образом, вы можете написать класс, который MySQL-PDO конкретные, которые могли бы выглядеть следующим образом:

class MySQL_PDO extends PDO 
{ 
    public function __construct(array $params) 
    { 
     $dsn = 'mysql:host=' . $params['host']; 

     if (isset($params['dbname'])) { 
      $dsn .= ';dbname=' . $params['dbname']; 
     } 

     $options = array(
      parent::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', 
      parent::ATTR_ERRMODE   => parent::ERRMODE_EXCEPTION, 
      parent::ATTR_EMULATE_PREPARES => false, 
      parent::ATTR_DEFAULT_FETCH_MODE => parent::FETCH_ASSOC, 
     ); 

     parent::__construct($dsn, $params['username'], $params['password'], $options); 
    } 
} 

И вы можете инициализировать его как

$db_options = array(
    'host' => '127.0.0.1', 
    'username' => 'root', 
    'password' => '', 
    'dbname' => 'todo' 
); 

$pdo_driver = new MySQL_PDO($db_options); 

Ваш ManageUsers на самом деле является реализация DataMapper, которые должны быть надлежащим образом воспользоваться Dependency Injection

Также обратите внимание, что time является зарезервированным словом в MySQL, и поэтому вам лучше придерживаться обратных тиков во всем мире.

class UserMapper 
{ 
    protected $pdo; 

    public function __construct($pdo) 
    { 
     $this->pdo = $pdo; 
    } 

    public function insert($username, $password, $ip_adress, $time, $date_joined) 
    { 
     $query = "INSERT INTO `users` (`username`, `password`, `ip_adress`, `time`, `date_joined`) VALUES (:username, :password, :ip_adress, :time)" 

     $stmt = $this->pdo->prepare($query); 
     return $stmt->execute(array(
      ':username' => $username, 
      ':password' => $password, 
      ':ip_adress' => $ip_adress, 
      ':date_joined'=> $date_joined 
     )); 
    } 
} 

И, наконец, вы можете использовать все это, так же, как:

$mapper = new UserMapper($pdo_driver); 
$mapper->insert('foo', .....); 
+0

Спасибо, я сделал несколько изменений в моем коде благодаря вашему совету, и он работает – user3051232

1

здесь рабочий код

class dbConnect 
{ 
    protected $db_conn; 
    public $db_host = '127.0.0.1'; 
    public $db_user = 'root'; 
    public $db_pass = 'roadmin'; 
    public $db_name = 'todo'; 

    public function connect() 
    { 
    try 
    { 
     $this->db_conn = new PDO("mysql:host=$this->db_host;dbname=$this->db_name", $this->db_user,$this->db_pass); 
     return $this->db_conn; 
    } 
    catch(PDOException $e) 
    { 
     return $e->getMessage(); 
    } 
    } 

} 

Вот класс управлять пользователями

include_once('class.db.php'); 

class ManageUsers 
{ 
    public $link; 

    function __construct() 
    { 
    $db_connection = new dbConnect(); 
    $this->link = $db_connection->connect(); 
    return $this->link; 
    } 

    function registerUsers($username,$email,$password,$ip_adress,$date) 
    { 
    $query = $this->link->prepare("INSERT INTO `users` (username,email, password, ip_adress, date_joined) VALUES(?,?,?,?,?)"); 
    $values = [$username,$email,$password,$ip_adress,$date]; 
    $query->execute($values); 
    $confirm = $query->rowCount(); 
    return $confirm; 
    } 

    function loginUser 
} 

$test = new ManageUsers(); 
echo $test->registerUsers('bob','[email protected]','lol','127.0.0.1','2012'); 
Смежные вопросы