Ошибка ввода формы входа в PHP

Я все еще новичок и получаю зависание PHP, поэтому, пожалуйста, расскажите мне обо мне (я учусь так быстро, как могу)

Я создал сценарий входа ниже, но мне сказали использовать подготовленные заявления

<?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = mysqli_real_escape_string($con, $_POST['username']); $password = mysqli_real_escape_string($con, $_POST['password']); $select_user = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $run_user = mysqli_query($con, $select_user); $check_user = mysqli_num_rows($run_user); if($check_user>0){ header('location:../dashboard.php'); }else{ header('location:/pages/loginerror.php'); } } ?> 

Узнав о подготовленных заявлениях по соображениям безопасности, я начал читать подготовленные заявления, но я просто не могу заставить его работать ниже. ошибка, которую я получаю: «Ошибка синтаксиса: синтаксическая ошибка, неожиданный« mysqli_stmt_bind_param »(T_STRING) в /usr/local/www/apache24/data/timed/php/login.php в строке 9"

 <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = mysqli_real_escape_string($con, $_POST['username']); $password = mysqli_real_escape_string($con, $_POST['password']); $stmt = mysqli_prepare($con, "SELECT * FROM users WHERE username = ? AND password = ?") $stmt->mysqli_stmt_bind_param($stmt, "ss", '$username', '$password'); mysqli_stmt_execute($stmt); $run_user = mysqli_query($con, $stmt); $check_user = mysqli_num_rows($run_user); if($check_user>0){ header('location:../dashboard.php'); }else{ header('location:/pages/loginerror.php'); } } ?> в <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = mysqli_real_escape_string($con, $_POST['username']); $password = mysqli_real_escape_string($con, $_POST['password']); $stmt = mysqli_prepare($con, "SELECT * FROM users WHERE username = ? AND password = ?") $stmt->mysqli_stmt_bind_param($stmt, "ss", '$username', '$password'); mysqli_stmt_execute($stmt); $run_user = mysqli_query($con, $stmt); $check_user = mysqli_num_rows($run_user); if($check_user>0){ header('location:../dashboard.php'); }else{ header('location:/pages/loginerror.php'); } } ?> 

Любая помощь будет оценена по достоинству. благодаря

Related of "Ошибка ввода формы входа в PHP"

Поскольку вы учитесь, а не просто говорите вам, что вы делаете неправильно, я добавлю некоторые объяснения, почему это неправильно:

 $username = mysqli_real_escape_string($con, $_POST['username']); $password = mysqli_real_escape_string($con, $_POST['password']); 

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

 $stmt = mysqli_prepare($con, "SELECT * FROM users WHERE username = ? AND password = ?") 

Эта строка отсутствует ; в конце.

 $stmt->mysqli_stmt_bind_param($stmt, "ss", '$username', '$password'); 

Здесь есть две проблемы:

Вместо передачи фактических переменных $username и $password вы передаете строку '$username' и '$password' . Это означает, что ваша база данных будет искать буквально "$username" и "$password" а не содержимое этих переменных. Вам нужно потерять кавычки.

Вторая (и более важная) проблема заключается в том, что здесь вы смешиваете процедурные и объектно-ориентированные стили. Вы можете вызвать функцию bind_param двумя способами:

 mysqli_stmt_bind_param($stmt, "ss", $username, $password); // or: $stmt->bind_param("ss", $username, $password); 

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

 mysqli_stmt_execute($stmt); 

Хорошо.

 $run_user = mysqli_query($con, $stmt); 

Плохо.

mysqli_query() используется, когда вы хотите выполнить буквенный SQL-запрос. Вы не можете использовать это с подготовленным заявлением. mysqli_stmt_excute() уже выполнил запрос в вашей базе данных. Вам нужно удалить этот вызов в mysqli_query() .

Имейте в виду, что выполнение вашего подготовленного заявления может завершиться неудачей. Если по какой-либо причине ваш подготовленный оператор не выполняется (возможно, в вашем SQL-запросе есть опечатка, соединение с базой данных и т. Д.) mysqli_stmt_execute() вернет false . Всегда разумно проверять это, чтобы отлаживать вещи намного проще.

 $check_user = mysqli_num_rows($run_user); 

Это почти правильно, за исключением того, что вам нужно получить количество строк из самого оператора , так как это взаимодействие вашего запроса с базой данных. Вместо этого вам нужно вызвать mysqli_num_rows($stmt) . Изменить : как вы правильно указали, mysqli_num_rows() не работает с операторами. Вместо этого вам нужно использовать mysqli_stmt_num_rows($stmt) .

Если вы набираете текст, у вас должно получиться нечто похожее на:

 <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = $_POST['username']; $password = $_POST['password']; $stmt = mysqli_prepare($con, "SELECT * FROM users WHERE username = ? AND password = ?"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); $success = mysqli_stmt_execute($stmt); if (!$success) { echo "Query failed: " . mysqli_stmt_error($stmt); die(); } $check_user = mysqli_stmt_num_rows($stmt); if($check_user>0){ header('location:../dashboard.php'); }else{ header('location:/pages/loginerror.php'); } } ?> в <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = $_POST['username']; $password = $_POST['password']; $stmt = mysqli_prepare($con, "SELECT * FROM users WHERE username = ? AND password = ?"); mysqli_stmt_bind_param($stmt, "ss", $username, $password); $success = mysqli_stmt_execute($stmt); if (!$success) { echo "Query failed: " . mysqli_stmt_error($stmt); die(); } $check_user = mysqli_stmt_num_rows($stmt); if($check_user>0){ header('location:../dashboard.php'); }else{ header('location:/pages/loginerror.php'); } } ?> 
 <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username = ? AND password = ?"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "ss", $username, $password); $success = mysqli_stmt_execute($stmt); if (!$success) { echo "Query failed: " . mysqli_stmt_error($stmt); die(); } mysqli_stmt_store_result($stmt); $check_user = mysqli_stmt_num_rows($stmt); if($check_user>0){ header('location:../dashboard.php'); }else{ echo 'Login Failed'; } } ?> в <?php require '../php/connect.php'; if(isset($_POST['login'])){ $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username = ? AND password = ?"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "ss", $username, $password); $success = mysqli_stmt_execute($stmt); if (!$success) { echo "Query failed: " . mysqli_stmt_error($stmt); die(); } mysqli_stmt_store_result($stmt); $check_user = mysqli_stmt_num_rows($stmt); if($check_user>0){ header('location:../dashboard.php'); }else{ echo 'Login Failed'; } } ?>