Хочу создать Пользователя путем записи данных в БД, но вызывается ошибка:
Для упрощения чтения, в массиве $_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(...)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Доброго времени сутокПодскажите существует ли более мощный аналог imagick? В imagick не все устраивает, во первых не могу задать цвет если мне нужно...
Есть библиотека с функцией которая возвращает контейнерПримерно такая:
Написал таймер, который запускается при нажатии кнопкуПроблема такого, что при нажатии, программа просто зависает и ничего дальше не работает
Как сделать скрытие вложений в дереве категорий ? На главную категорию нажимаю и что бы дочерние скрылисьили подскажите какие события почитать...