mysql: команды не синхронизированы; вы не можете запустить эту команду сейчас -> при выполнении запроса в функции php

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Имея этот код:

  $sql = "SELECT * FROM users WHERE user_login=?;";
        $stmt = mysqli_stmt_init($conn);

        if (!mysqli_stmt_prepare($stmt, $sql)) {
            die(mysqli_error($conn));
        } else {
            mysqli_stmt_bind_param($stmt, 's', $login);
            mysqli_stmt_execute($stmt);
            mysqli_store_result($conn);

            $resultCheck = mysqli_stmt_num_rows($stmt);

            //err == login name is already taken
            if ($resultCheck > 0) {
                die("login is taken");
            } else {
                $sql = "INSERT INTO users(user_login, user_email, user_pwd) VALUES (?, ?, ?);";
                $stmt = mysqli_stmt_init($conn);
                if (!mysqli_stmt_prepare($stmt, $sql)) {
                    die(mysqli_error($conn));
                } else {
                    $hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
                    mysqli_stmt_bind_param($stmt, 'sss', $login, $email, $hashedPwd);
                    mysqli_stmt_execute($stmt);
                }
                // insert_usertodb($conn, $login, $email, $pwd);
            }
        }
 

работает нормально (`например, часть, в которую вставлен пользователь, не выдает никакой ошибки mysqli), однако, если я попытался использовать функцию, в которую вставлен пользователь:

 function insert_usertodb($conn, $user_login, $user_email, $user_pwd)
{
    $sql = "INSERT INTO users(user_login, user_email, user_pwd) VALUES (?, ?, ?);";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) { // <-- this is where the error happens
        // err_signup('sqlierror', '', '');
        die('sqlierror: ' . mysqli_error($conn));
    } else {
        //hash password
        $hashedPwd = password_hash($user_pwd, PASSWORD_DEFAULT);
        mysqli_stmt_bind_param($stmt, 'sss', $user_login, $user_email, $hashedPwd);
        mysqli_stmt_execute($stmt);
        // header("Location: ../signup.php?signup=success");
    }
}
 

И используйте ее вместо части, в которую вставляется пользователь (после else перехода -> функция прокомментирована в конце), mysqli генерирует ошибку:

  Commands out of sync; you can't run this command now
 

Есть ли какая-либо причина, по которой функция с идентичным кодом (например, буквально скопировала часть (где находится вставка) и просто изменила имя переменных на аргумент этой функции) генерирует ошибку несинхронизации? а код без функции не работает?

Комментарии:

1. Если вы только начинаете изучать PHP, вам следует изучать PDO вместо mysqli. PDO намного проще и больше подходит для начинающих. Начните здесь phpdelusions.net/pdo amp; websitebeaver.com /…

Ответ №1:

Это потому, что вы использовали здесь неправильную функцию mysqli_store_result($conn); . Вы должны были использовать mysqli_stmt_store_result($stmt); вместо этого. Это означает, что ваш код работает не так, как вы хотели, и проверка на существование нарушена. Вот почему это ужасная идея для использования mysqli_stmt_num_rows() .

Причина, по которой он работает, когда его нет в функции, заключается в том, что вы вызываете деструктор для $stmt объекта, когда присваиваете ему другое значение $stmt = mysqli_stmt_init($conn); . Когда вызывается деструктор, он извлекает все результаты в фоновом режиме, чтобы «очистить» провод.

Если еще не слишком поздно, рассмотрите возможность использования PDO вместо этого. Это проще, и вы не будете делать такие ошибки так часто. Код, который вы написали с помощью mysqli, слишком подробный. Вам не нужна большая часть этого. Это было бы намного проще с PDO.