У меня проблема. Я создаю свою собственную страницу входа, и у меня возникли проблемы. Когда я тестирую свою страницу и вставляю неверное имя пользователя и пароль, отлично работает. Но когда я вставляю данные, существующие в базе данных, он просто пропускает часть if (isset($_POST['but_submit'])). Что здесь могло быть не так?
Вот мой код:
PHP:
<?php include ("config.php");
if (isset($_POST['but_submit'])){
$uname = mysqli_real_escape_string($con,$_POST['txt_uname']);
$password = mysqli_real_escape_string($con,$_POST['txt_pwd']);
if ($uname != "" && $password != ""){
$sql_query = "select count(*) as cntUser from users where Username='".$uname."' and passwrd='".$password."'";
$result = mysqli_query($con,$sql_query);
$row = mysqli_fetch_array($result);
$count = $row['cntUser'];
if ($count > 0){
$_SESSION['uname'] = $uname;
header('Location: welcome.php');
}else{
echo "Invalid username and password";
}
} }
?>
HTML
<div class = "container">
<form method = "post" action = "">
<div id = "div_login">
<h1>Login</h1>
<div>
<input type = "text" class = "textbox" id = "txt_uname" name = "txt_uname" placeholder = "Username" />
</div>
<div>
<input type = "password" class = "textbox" id = "txt_uname" name = "txt_pwd" placeholder = "Password"/>
</div>
<div>
<input type = "submit" value = "Submit" name = "but_submit" id = "but_submit" />
</div>
</div>
</form>
</div>
Буду очень рада, что кто-нибудь мне поможет :) Спасибо!
header('Location: welcome.php'); требует exit(); после него
Когда я вставляю действительные данные, программа выдает false на if (isset($_POST['but_submit'])). И да, я знаю, что мне не следует хранить такие пароли ... Я изменю их после того, как выясню, что здесь не так ... спасибо
Jaquarh, спасибо, но все еще не работает.
что возвращает mysqli_error($con) после добавления этого в запрос? И отчеты об ошибках для PHP. php.net/manual/en/function.error-reporting.php @Gandalf Примечание: используйте @the_member_name для непосредственного пинга.






Возможно, это сработает? Сначала выполните отладку, если отсутствуют поля, а затем выполните свой SQL.
require_once 'config.php';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (mysqli_connect_errno()) die(mysqli_connect_error());
# Debug what the issue is
foreach(array('but_submit', 'txt_uname', 'txt_pwd') as $arg)
if (!isset($_POST[$arg]))
die("{$arg} field is not set or empty");
# Prevent SQL injection
$stmt = $con->prepare("SELECT COUNT(*) as cntUser FROM users WHERE Username ? AND passwrd = ?");
$stmt->bind_param("ss", $_POST['txt_uname'], $_POST['txt_pwd']);
if (!$stmt->execute()){ mysqli_error($con); }
$stmt->store_result();
# Check the row count is more than 0
if ($stmt->num_rows != 0) {
session_start(); # Start session, if config.php already does this you can remove this
$_SESSION['uname'] = $_POST['txt_uname']; # Think about injects here - use the database record not untrusted POST data
header('Location: ' . sprintf("%s://%s/welcome.php", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME']));
exit();
}
# Nothing was returned
die('Incorrect username / password combination');
Следует отметить, что вы не должны сохранять имя пользователя в сеансе, это должен быть жетон, для которого имя пользователя указывается в качестве аргумента в вашем случае:
$_SESSION['token'] = \Firebase\JWT\JWT::encode(array('username' => $_POST['uname']), 'your secret');
Затем внутри вашего файла Welcome.php вы можете расшифровать его так (предлагается создать какой-то контроллер, который делает это раньше):
$user = \Firebase\JWT\JWT::decode($_SESSION['token'], 'your secret', array('HS256'));
echo $user['username'];
Также следует отметить, что, вероятно, лучше всего получить данные из базы данных, чтобы вы могли использовать их уникальный идентификатор для создания токена вместе с другими идентификаторами, которые вы хотите включить (держитесь подальше от конфиденциальной информации).
mysqli_real_escape_string() требует подключения в качестве первого аргумента. Но я не понимаю, почему вы предлагаете $_SESSION['uname'] = mysqli_real_escape_string($_POST['txt_uname']);, в этом нет необходимости.
Хорошо указано, единственная причина, по которой я вставил его, - это остановить инъекции в сеанс, например XSS, но если все будет сделано правильно, он может легко запросить базу данных и использовать запись в базе данных, которая, как известно, не содержит инъекций, если используются подготовленные операторы. но я сейчас отредактирую это @FunkFortyNiner
Я бы заменил $stmt->execute(); на if (!$stmt->execute()){ mysqli_error($con); }, чтобы он мог выдавать возможные ошибки.
Не стесняйтесь обновлять и изменять, где это возможно, я не эксперт Mysqli_ *, я использую PDO, поэтому большая часть этого была взята из руководства, поскольку я ответил @FunkFortyNiner
В порядке. Во первых спасибо за ваш ответ. Я понимаю, что моя кнопка отправки не установлена или пуста, и я не уверен, как это исправить ... Есть предложения?
Что значит
skips if (isset($_POST['but_submit']))? У вас нет выхода? Вы не должны хранить пароли в виде обычного текста.