Ошибка в PDO [SQLSTATE[HY000] [1045]…]

407
03 сентября 2017, 03:41

Хочу создать Пользователя путем записи данных в БД, но вызывается ошибка:

Для упрощения чтения, в массиве $_POST['register]' есть такие данные (к примеру):

Array
(
    [name] => Иван
    [surname] => Иванов
    [email] => ivanov@gmail.com
    [pass] => 123
    [sex] => 1
)

RegisterController:

public function createUser()  
{  
    User::create($_POST['register']);  
}

User.php (Model):

<?php 
 
namespace App\Models; 
 
use App\Core\Model; 
 
class User extends Model 
{ 
    /** 
     * Create account for User. 
     * @param $request 
     * @return bool|string 
     */ 
    public static function create($request) 
    { 
        $oldUser = (new Model)->selectWhere('users', "email =", ':email', $request['email']); 
 
        if (!empty($oldUser)) return false; // return redirect with status error 
 
        (empty($request['pass'])) ? : $request['pass'] = md5($request['pass']); 
        $data = $request; 
 
        return (new Model)->insert('users', 'name, surname, email, password, sex', ':name, :surname, :email, :pass, :sex', $data); 
    } 
}

Model.php:

<?php 
 
namespace App\Core; 
 
class Model 
{ 
    /** 
     * Database connection. 
     * @var PDO|bool 
     */ 
    private $dbh = null; 
 
    /** 
     * Model constructor. 
     * Return database connection object to $dbh. 
     */ 
    public function __construct() 
    { 
        $db = new Database(); 
        $this->dbh = $db->connect(); 
    } 
 
    /** 
     * Select matches from table $table. 
     * @param $table 
     * @return array 
     */ 
    public function select($table) 
    { 
        $sth = $this->dbh->prepare("SELECT * FROM $table"); 
        $sth->execute(); 
        return $sth->fetchAll(); 
    } 
 
    public function selectWhere($table, $where, $pseudo, $data) 
    { 
        $sth = $this->dbh->prepare("SELECT * FROM $table WHERE $where $pseudo"); 
        $sth->bindValue($pseudo, $data); 
        $sth->execute(); 
        return $sth->fetchAll(); 
    } 
 
    /** 
     * Insert info into the database table. 
     * Uses for register. 
     * @param $table 
     * @param $subject 
     * @param $value 
     * @param $data 
     * @return bool|string 
     */ 
    public function insert($table, $subject, $value, $data) 
    { 
        try 
        { 
            $query = $this->dbh->prepare("INSERT INTO $table ($subject) VALUES ($value)"); 
            $query->execute($data); 
            return true; 
        } 
        catch (PDOException $e) 
        { 
            return $e->getMessage(); 
        } 
    } 
}

Ну и Database.php:

<?php 
 
namespace App\Core; 
 
use PDO; 
 
class Database extends PDO 
{ 
    /** 
     * Database config information. 
     * @var array 
     */ 
    protected $config = []; 
 
    /** 
     * Database constructor. 
     * Return array with information config. 
     */ 
    public function __construct() 
    { 
        $this->config = require_once APP . '/Config/Database.php'; 
    } 
 
    /** 
     * Create connect to database. 
     * @return bool|PDO 
     */ 
    public function connect() 
    { 
        try { 
            $dbh = new PDO('mysql:host='.$this->config['host'].';dbname='.$this->config['name'], $this->config['user'], $this->config['pass']); 
 
        } catch (PDOException $e) { 
            print "Error: " . $e->getMessage() . "<br/>"; 
            die(); 
        } 
        return ($dbh) ? $dbh : false; 
    } 
}

Config/Database.php:

/** 
 * User info. 
 * @return array 
 */ 
return [ 
    'host' => '127.0.0.1', 
    'user' => 'user', 
    'pass' => 'pass', 
    'name' => 'dbname' 
];

Я так понял, проблема в SQL-инъекциях.
Текст ошибки:

Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO) in C:\OpenServer\domains\gofit\app\Core\Database.php:31
Stack trace:
#0 C:\OpenServer\domains\gofit\app\Core\Database.php(31): PDO->__construct('mysql:host=;dbn...', NULL, NULL)
#1 C:\OpenServer\domains\gofit\app\Core\Model.php(20): App\Core\Database->connect()
#2 C:\OpenServer\domains\gofit\app\Models\User.php(30): App\Core\Model->__construct()
#3 C:\OpenServer\domains\gofit\app\Controllers\Auth\RegisterController.php(23): App\Models\User::create(Array)
#4 [internal function]: App\Controllers\Auth\RegisterController->createUser()
#5 C:\OpenServer\domains\gofit\app\Router.php(84): call_user_func_array(Array, Array)
#6 C:\OpenServer\domains\gofit\public\index.php(20): App\Router->run()
#7 {main}
  thrown in C:\OpenServer\domains\gofit\app\Core\Database.php on line 31

В чем проблема? Я уверен, что ошибка в этом участке кода:

(new Model)->insert(...)

READ ALSO
Есть более мощный аналог imagick

Есть более мощный аналог imagick

Доброго времени сутокПодскажите существует ли более мощный аналог imagick? В imagick не все устраивает, во первых не могу задать цвет если мне нужно...

326
Как убрать декорацию функции?

Как убрать декорацию функции?

Есть библиотека с функцией которая возвращает контейнерПримерно такая:

394
Зависает таймер

Зависает таймер

Написал таймер, который запускается при нажатии кнопкуПроблема такого, что при нажатии, программа просто зависает и ничего дальше не работает

421
Как скрыть дочерние категории?

Как скрыть дочерние категории?

Как сделать скрытие вложений в дереве категорий ? На главную категорию нажимаю и что бы дочерние скрылисьили подскажите какие события почитать...

360