@Anonymous85966

В чем проблема PDO?

На сайте имеется система регистрации.Подключение к бд происходит при помощи PDO.Для подключения создан отдельный файл db_connect.php.Его содержимое:
<?php
$servername="localhost";
$user="root";
$password="root";
$dbname="web_forum";
$global_connection=null;
try {
    $connect=new PDO("mysql:host=$servername;dbname=$dbname",$user,$password);
    $connect->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    setConnection($connect);

}catch (PDOException $e){
    $error=$e->getMessage();
    echo "<p style='color: red;'>Ошибка соединения с сервером: $error</p>";

}
function setConnection($connection){

    global $global_connection;

    $global_connection=$connection;

}

function getConnection(){
    global $global_connection;


    return $global_connection;
}
?>
Обработка формы с email и password пользователя происходит в файле registration_script.php:
<?php
include "Classes/User_class.php";

include "php_scripts/db_connect.php";
session_start();


$email=htmlspecialchars($_POST['email']);

$password=$_POST['password'];

$user=new User($email,$password,getConnection());//getConnection из файла db_connect.php

if ($user->createUserSuccessful()){//функция в классе представлена ниже
    $_SESSION['logged']=$user;
    header("Location:index.php");
}else{
    echo "error";
}
?>
В конструктор класса я передаю объект pdo, полученный из функции getConnection файла db_connect.php.Далее в классе User я использую этот объект pdo для различных запросов.При запуске функции в классе User
 public function createUserSuccessful(){
        $hash_password=password_hash($this->password,PASSWORD_DEFAULT );

        $sql="INSERT INTO users(email,password) VALUES ('$this->email','$hash_password')";

        $result=$this->connection->query($sql);
        if ($result){
            return true;
        }else{
            return false;
        }

    }

Я получаю ошибку:
Fatal error: Uncaught PDOException: You cannot serialize or unserialize PDO instances in [no active file]:0 Stack trace: #0 [internal function]: PDO->__sleep() #1 {main} thrown in [no active file] on line 0

В чем проблема? Примечание:
1)Несмотря на ошибку, запрос к БД является успешным, т.е пользователь создается. Однако в сессию объект user не сохраняется
2)При использовании mysqli в файле db_connect.php подобных ошибок не возникает
Я практически уверен, что проблема в хранении в сессии экземпляра PDO.
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ответы на вопрос 2
gscraft
@gscraft
Программист, философ
Вы пытаетесь в сессию сохранить все данные класса User, вот и ругается, что сериализуете объект PDO. Во-первых, довольно странное подключение, у вас и $connect, и $global_connection одно и тоже, и глобальное подключение передаете в класс. Есть смысл переосмыслить все это. Во-вторых, реализуйте, например, метод User::getData, который вернет непосредственно данные пользователя: $_SESSION['logged'] = $user->getData()
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это всё какой-то чудовищный карго культ говнокод.
  • особенно функция setConnection, которая вообще ни в какие ворота не лезет, будучи абсолютно, эталонно бессмысленной.
  • И getConnection от неё не далего ушла. То есть внутри все равно ад с глобалсами, но снаружи у нас все выглядит прилично - функция.
  • ПДО, разумеется, используем без подготовленных выражений. Зачем вообще городить авторизацию если любой школьник сможет авторизоваться без всякого пароля через SQL инъекцию?
  • Ошибка соеднинения пдо выводится в красивой красной рамочке. Как будто юзеру прям так интересно читать что у тебя база легла. При этом сам ты этого не узнаешь. Для кого это всё пишется - загадка.


Ну и традиционно, просто пострясающий в своей осмысленности код:
Присваиваем переменной $result булево значение и дальше пишем
if ($result){
    return true;
}else{
    return false;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы