@iiideb
Пишу роботов на html

Почему шифруются данные в БД mysql?

64ce26a750cb7843583593.png
В новой таблице все данные шифруются, причём все поля одной строки имеют одинаковое значение.
Исходный код: https://github.com/Flexachiller/websocket-chat/tre...
Все исполняемые файлы: register.php, database/ChatUser.php, database/DatabaseConnection.php
Впервые сталкиваюсь с такой проблемой, сносил таблицу, но ничего не поменялось.
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
@iiideb Автор вопроса
Пишу роботов на html
Заменил
Было
$params = [
            ':user_name'=> $this->user_name,
            ':user_email'=> $this->user_email,
            ':user_password'=> $this->user_password,
            ':user_profile'=> $this->user_profile,
            ':user_status'=> $this->user_status,
            ':user_created_on'=> $this->user_created_on,
            ':user_verification_code'=> $this->user_verification_code
        ];
        $statement = $this->connect->prepare($query);

        foreach ($params as $key => $value) {
            $statement->bindParam($key, $value);
        }


На
Стало
$statement->bindParam(':user_name', $this->user_name);
        $statement->bindParam(':user_email', $this->user_email);
        $statement->bindParam(':user_password', $this->user_password);
        $statement->bindParam(':user_profile', $this->user_profile);
        $statement->bindParam(':user_status', $this->user_status);
        $statement->bindParam(':user_created_on', $this->user_created_on);
        $statement->bindParam(':user_verification_code', $this->user_verification_code);


Почему bindParam($key, $value) не работал в цикле foreach
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Очень неплохо, но есть замечания.

  1. ini_set('display_setup_errors', 1); надо убрать вообще, это бессмысленный карго-культ
  2. ini_set('error_reporting', E_ALL); и ini_set('display_errors', 1); надо вынести в общий файл, который инклюдится во все остальные. Иначе на бою придется редактировать в каждом файле, чтобы заменить 1 на 0.
  3. empty после trim надо убрать, проверять на существование заведомо существующее значение не имеет смысла. То есть, переписать так
    if(trim($_POST['user_name']) && trim($_POST['user_email']) && trim($_POST['user_password']))

    Но и это будет неправильно, поскольку trim не применяется к добавляемым в БД значениям
    То есть, потримать отдельно в переменные, а потом проверить просто
    if($user_name && $user_email && $user_password)

  4. проверка if(isset($_SESSION['user_data'])) явно не на месте. А если форма запрошена не постом? Показывать её уже авторизованному пользователю? Зачем?
  5. после header('Location: '); всегда должен идти exit. в данном случае не принципиально, но это должно делаться на автомате.
  6. _once из require_once надо убрать вообще, это бессмысленный карго-культ
  7. require('database/ChatUser.php'); - это стыдоба. Сделайте простенький автозагрузчик, это три строчки. Например
    spl_autoload_register(function ($className) {
        $ds = DIRECTORY_SEPARATOR;
        $className = str_replace('\\', $ds, $className);
        $filename = __DIR__ . "{$ds}..{$ds}database{$ds}$className.php";
        require($filename);
    });
    автозагрузчик тоже кладется в общий подключаемый файл.

  8. проверку if($user->saveData()) надо убрать вообще, это бессмысленный карго-культ, и - вдобавок - ошибка. Если POST запрос был обработан без ошибок, то после него всегда должен быть редирект, без всяких success_message. А "Something went wrong" выводится совсем другим кодом. Я ещё посмотрю в database, но если что, то исправлять надо будет там
  9. вывод сообщений об ошибках в хтмл части лучше сделать в едином стиле
    <? if($errors !== ''): ?>
        <?=htmlspecialchars($errors) ?><br><br>
    <? endif ?>

  10. хорошим тоном считается при ошибке выводить пользователю уже введенные значения (кроме пароля, разумеется)
    <input type="text" name="user_name" value="<?= htmlspecialchars($user_name ?? '') ?>">



Так, в database более серьезные ошибки.
В целом неплохой ActiveRecord, но в конструкторе прям всё очень плохо.
  1. В обязательном порядке переделать
    • Во-первых, require в коде класса - это сразу профнепригодность. Всю необходимую информацию класс должен получать только через методы.
    • Во-вторых, new DatabaseConnection в каждом конструкторе - это совсем детская ошибка. Давно TOO MANY CONNECTIONS от mysql не получали?

    Этот класс должен принимать уже созданное соединение, через параметр конструктора.

  2. createAvatar я бы вынес в отдельный класс
  3. Непонятно, зачем вам вообще понадобился цикл foreach ($params as $key => $value), если проще и удобнее написать $statement->execute($params); Для кого специально этот функционал создатели PDO писали?
  4. return $user_data; после условия - это логическая ошибка. Будет undefined variable $user_data если условие не выполнится. Но главное, что здесь все неправильно изначально. Никаких проверок быть в принципе быть не должно.


DatabaseConnection

Тут две основные ошибки, не буду уж нумеровать

  • Во-первых, данные для подключения к БД (как и другие, отличающиеся для разных окружений настройки) пишутся в отдельном файле, который не добавляется в систему контроля версий (пишется в .gitignore). И, соответственно, никаких констант, а обычные параметры конструктора. И в этом контексте становится непонятно, зачем вообще нужен класс DatabaseConnection, если все что он делает - это создает инстанс PDO? Правильно, он становится совершенно не нужен
  • Во-вторых, и самое главное - в PDO не включен режим информирования программиста об ошибках. Я даже не представляю, у какого инфоцыгана вы брали этот код - уже, вроде бы, даже до самых тупых из них дошло, что оставлять программиста без сообщений об ошибках - это садизм. Поэтому при создании инстанса ПДО надо в обязательном порядке включать режим информирования об ошибках. Для этого добавить еще один параметр в виде массива, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]; и пока оставить так. А потом, со временем, добавить к проекту централизованный вывод сообщения "что-то пошло не так"

Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы