работа с pdo

$iD

Новичок
Не могу понять почему данные не попадают в бд. где-то накосячил :(
PHP:
<?php
require_once 'config.php';
class DB
{
    private static $PDO;
    public function __construct()
    {
        if(!extension_loaded('pdo'))
        {
            die('The PDO library is required');
        }
        self::connect();
    }
    public function connect()
    {
        try
        {
            self::$PDO = new PDO(DB_DRIVER . ':host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);
            self::$PDO->query('SET NAMES' . DB_CHARSET);
        }
        catch(PDOException $e)
        {
            die($e->getMessage());
        }
    }
    public function fetch_row_assoc($statement)
    {
        return self::$PDO->query($statement)->fetch(PDO::FETCH_ASSOC);
    }
    public function query($statement)
    {
        return self::$PDO->query($statement);
    }
    public function last_insert_id()
    {
        return self::$PDO->lastInsertId();
    }
    public function insert($table, $values)
    {
        foreach ($values as $key => $value)
            $field_names[] = $key . ' = :' . $key;
        $sql = "INSERT INTO " . $table . " SET " . implode(', ', $field_names);
        $stmt = self::$PDO->prepare($sql);
        foreach ($values as $key => $value)
            $stmt->bindValue(':' . $key, $value);
        $stmt->execute();
    }
}
registration.php
PHP:
<?php
require_once 'db.php';
class Registration
{
    private static $config;
    public function __construct()
    {
        $this->db = new DB();
    }
    public function create_user($email, $password)
    {
        $email = filter_var($email, FILTER_SANITIZE_EMAIL);
        $password = filter_var($password, FILTER_SANITIZE_STRING);
        $values = array(
            'user_email' => $email,
            'user_password' => sha1($password)
        );
        $this->db->insert('users', $values);
        //$user_id = $this->db->last_insert_id();
    }
}
 

Фанат

oncle terrible
Команда форума
Неужели так сложно кнопочку РНР нажать?
толку-то с этого коде - все серое, как у негра где

отлаживать за тебя кто будет?
 

Фанат

oncle terrible
Команда форума
во-первых,
$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
а то ловить-то ты ловишь исключения, но кто тебе их кидает?

во вторых - отладочная печать. проверяй что тебе в запрос уходит.
 
  • Like
Реакции: $iD

$iD

Новичок
я идиот, поле неправильно назвал.. найти помогло
$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

спасибо. сидел башку ломал.
 

Фанат

oncle terrible
Команда форума
ну вот по моей шкале ценностей зевнуть поле - фигня.
а вот наладить нормальную обработку ошибок - самое важное.
в этом смысле
PHP:
 die($e->getMessage());
куда хуже.
поле-то ты исправил, а этот код у тебя и дальше резво побежал.
 

$iD

Новичок
наставь на путь истинный. как сделать по уму?
 

Фанат

oncle terrible
Команда форума
Ну, теория вот здесь: Обработка ошибок в РНР
А для твоего случая нужно писать exception handler, и ловить ошибку в нём.

По сути делая тот же die(), но человеческий, по тому принципу, который описан по ссылке.
Не как у тебя - ошибку на экран, а в лог фигу, а СТРОГО НАОБОРОТ:
ошибку в лог, на экран - 503 ошибку и извинения зайти попозже.

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

$iD

Новичок
Столкнулся еще с такой проблемкой
PHP:
public function login($email, $password)
	{
		$email = filter_var($email, FILTER_SANITIZE_EMAIL);
		$password = filter_var($password, FILTER_SANITIZE_STRING);

		$sql = "SELECT * FROM 'users' WHERE user_email='" . $email . "' AND user_pass='" . $password . "'";

		if($this->db->row_count($sql))
		{
			session_regenerate_id(true);
			$this->session->set('logged_in', true);

			$result = $this->db->fetch_row_assoc($sql);
			$this->session->set('id', $result['id']);
			$this->session->set('user_email', $result['user_email']);

			return true;
		}
		else
		{
			return false;
		}
	}
когда ввожу данные, получаю эксепшн:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''users' WHERE user_email='[email protected]' AND user_pass='123'' at line 1' in D:\Web\www\auth\libraries\db.php on line 40 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''users' WHERE user_email='[email protected]' AND user_pass='123'' at line 1 in D:\Web\www\auth\libraries\db.php on line 40 Call Stack: 0.0004 336712 1. {main}() D:\Web\www\auth\login.php:0 0.0200 400864 2. Auth->login() D:\Web\www\auth\login.php:10 0.0200 401152 3. DB->row_count() D:\Web\www\auth\libraries\auth.php:22 0.0201 401184 4. PDO->query() D:\Web\www\auth\libraries\db.php:40
в db.php на 40ой строке
PHP:
	public function row_count($statement)
	{
		return self::$PDO->query($statement)->rowCount();
	}
запрос вроде правильнный, проверил в sql, почему эксепшн?
 

Фанат

oncle terrible
Команда форума
проверяй ещё раз.
ничего в нем правильного нету.
но в целом, конечно, вот это -
PHP:
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
$password = filter_var($password, FILTER_SANITIZE_STRING);
$sql = "SELECT * FROM 'users' WHERE user_email='" . $email . "' AND user_pass='" . $password . "'";
адская дичь.
тебе PDO вообще зачем?
 
Сверху