@Heinemann

Как получить пользователя из базы данных после добавления?

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

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in D:\web\OpenServer\domains\testbox\db\db.php on line 31

Warning: session_name(): Cannot change session name when headers already sent in D:\web\OpenServer\domains\testbox\db\db.php on line 32

Warning: session_start(): Cannot start session when headers already sent in D:\web\OpenServer\domains\testbox\db\db.php on line 33

Warning: Cannot modify header information - headers already sent by (output started at D:\web\OpenServer\domains\testbox\db\db.php:31) in D:\web\OpenServer\domains\testbox\db\db.php on line 34

Warning: Cannot modify header information - headers already sent by (output started at D:\web\OpenServer\domains\testbox\db\db.php:31) in D:\web\OpenServer\domains\testbox\db\db.php on line 41

31 строка - это $row = mysqli_fetch_assoc($result); в функции authorization.
var_export(mysqli_error($link)); после 31 строки выдает: 'Commands out of sync; you can\'t run this command now'

function authorization($login, $password) {

    global $link;

    if (empty($login)) {
        $error = 1;
        header("Refresh: 1; url=http://testbox/route/?error=$error");

    } elseif (empty($password)) {
        $error = 2;
        header("Refresh: 1; url=http://testbox/route/?error=$error");

    } else {
        $sql = "SELECT u.*, GROUP_CONCAT(r.id) as roles_id, GROUP_CONCAT(r.role) as role,
       GROUP_CONCAT(r.description) as description FROM users as u
           JOIN user_role as ur ON ur.user_id =  u.id
           JOIN roles as r ON r.id = ur.role_id
           WHERE login='" . $login  . "' AND password='". $password ."'
           GROUP BY u.id";
        $result = mysqli_query($link, $sql);

        if ($result->num_rows !== 0 || $result !== false) {
            $row = mysqli_fetch_assoc($result);
            session_name('session_id');
            session_start();
            setcookie(session_name(), session_id(), time()+3600, '/');
            $_SESSION['full_name'] = $row['full_name'];
            $_SESSION['email'] = $row['email'];
            $_SESSION['login'] = $row['login'];
            $_SESSION['role'] = $row['role'];
            $_SESSION['description'] = $row['description'];

            header("Refresh: 1; url=http://testbox/route/user/profile.php");
        } else {
//            echo 'Введен неверный логин или пароль';
            header("Refresh: 1; url=http://testbox/route");
        }
    }
}

function userRegistration($full_name, $login, $password, $email) {

    if (empty($login) || empty($password) || empty($email)) {
//        echo 'Вы заполнили не все поля';
        header("Refresh: 1; url=http://testbox/route/registration.php");

    } else {
        global $link;
        $sql = "INSERT INTO users (full_name, email, login, password)
 VALUES ('". $full_name ."', '". $email ."', '". $login ."','". $password ."');
INSERT INTO user_role (user_id, role_id) VALUES (LAST_INSERT_ID(), '3')";
        $res = mysqli_multi_query($link, $sql);

        if ($res === true) {
            authorization($login, $password);

        } else {
//            echo 'Что-то пошло не так при добавлении в базу данных.';
            header("Refresh: 1; url=http://testbox/route/registration.php");
        }

    }
}
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
Вы пытаетесь в mysqli_fetch_assoc передать булево значение, о чем вам говорит ошибка: Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in. А эта функция принимает параметр другого типа: https://www.php.net/manual/ru/function.mysql-fetch....

UPD: ошибка возникает потому-что вы используете mysqli_multi_query для регистрации пользователя, а потом отправляете запрос mysqli_query для авторизации. Вам нужно сначала прочитать результат из mysqli_multi_query через mysqli_next_result(), а потом делать запрос на авторизацию пользователя. А лучше для регистрации пользователя также использовать mysqli_query. Это происходит потому-что mysqli по-умолчанию использует не буферизованные запросы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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