#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.