Прежде чем я задам вопрос, я знаю, что есть проблемы с SQL-инъекцией, я собираюсь разобраться с этим, скорее всего, с помощью PDO, я просто пытаюсь понять это сейчас.
Я хочу, чтобы PHP читал столбец статуса из MySql, и если в столбце статуса указано -1, где $ username = ($ _POST ["username"]), я хочу, чтобы PHP сначала отправлял их на экран «изменить пароль», а затем после его изменения отправьте сценарий обновления в MySql, чтобы обновить столбец «status» со значения по умолчанию -1 до 1.
Если его 1, я хочу, чтобы он вошел в систему как обычно, а если его -1, я хочу, чтобы они были вынуждены изменить свой пароль в основном, и у меня возникают проблемы с поиском способа сделать это.
Я предполагаю, что мой запрос на обновление будет выглядеть примерно так
$query = "UPDATE login SET status= 1 WHERE user_id='".$username ."' LIMIT 1";
Мой скрипт входа в php пока
<?php
// Include config file
require_once 'LoginConn.php';
// Define variables and initialize with empty values
$username = $password = "";
$username_err = $password_err = "";
// Processing form data when form is submitted
if ($_SERVER["REQUEST_METHOD"] == "POST"){
// Check if username is empty
if (empty(trim($_POST["username"]))){
$username_err = 'Please enter username.';
} else{
$username = trim($_POST["username"]);
}
// Check if password is empty
if (empty(trim($_POST['password']))){
$password_err = 'Please enter your password.';
} else{
$password = trim($_POST['password']);
}
// Validate credentials
if (empty($username_err) && empty($password_err)){
// Prepare a select statement
$sql = "SELECT username, password FROM scorecardusers WHERE username = ?";
if ($stmt = mysqli_prepare($link, $sql)){
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $param_username);
// Set parameters
$param_username = $username;
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)){
// Store result
mysqli_stmt_store_result($stmt);
// Check if username exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1){
// Bind result variables
mysqli_stmt_bind_result($stmt, $username, $hashed_password);
if (mysqli_stmt_fetch($stmt)){
if (password_verify($password, $hashed_password)){
/* Password is correct, so start a new session and
save the username to the session */
session_start();
$value= $sql['password'];
$_SESSION['username'] = $username;
header("location: Test.php");
} else{
// Display an error message if password is not valid
$password_err = 'The password you entered was not valid.';
}
}
} else{
// Display an error message if username doesn't exist
$username_err = 'No account found with that username.';
}
} else{
echo "Oops! Something went wrong. Please try again later.";
}
}
// Close statement
mysqli_stmt_close($stmt);
}
// Close connection
mysqli_close($link);
}
?>
ОБНОВЛЕНО: я добавил это в свой запрос, и он правильно обновляется.
mysqli_query ($link, "UPDATE Users SET Status = '1' WHERE Status ='-1'and username ='".$username ."' LIMIT 1");
Если бы кто-нибудь мог помочь мне понять, как вытащить область состояния из моего sql и перенаправить их на страницу смены пароля, если status = -1, это было бы здорово.
Я просто пытаюсь понять, как перенаправить на смену пароля, если Status = -1 в mysql ..
ВТОРОЕ ОБНОВЛЕНИЕ: Я сделал второй запрос, который проверяет информацию и отправляет вас в журнал смены пароля, однако я знаю, что это неверно. Но я чувствую, что подхожу к ответу намного ближе. Код работает до тех пор, пока я попадаю на нужный экран, но не получает правильную информацию. Мне нужно, чтобы имя пользователя было переменной в зависимости от того, что вводит агент. Опять же, любая помощь здесь будет очень признательна.
$id_get = "SELECT Status, username FROM scorecardusers WHERE Status = '-1' and username='MyName' LIMIT 1";
if ($result=mysqli_query($link, $id_get))
{
// Fetch one and one row// check if first time log in
while ($row = mysqli_fetch_assoc($result))
{
$Status=$row["Status"];
$username=$row["MyName"];
if ($Status== "-1" && $username = = "MyName");
var_dump($result);
header("location: ChangePW.php");
}
// Free result set
mysqli_free_result($result);
}
Я изучу его, но я использую Dreamweaver для его создания. Это простой логин, который будет использоваться в закрытой сети. Мне просто нужно перенаправить, чтобы сменить пароль, если столбец статуса = -1
В качестве редактора кода Dreamweaver прекрасен, но его фрагменты кода PHP ужасно плохи, и их не следует использовать. Помните, ваша «закрытая сетевая» система сегодня может быть открыта для публики завтра по многим причинам, преднамеренным или случайным. Если вы правильно создадите приложение с первого раза, что несложно, вы не подвергнетесь риску в будущем.
Здесь следует отметить, что использование username в качестве основного идентификатора в вашей таблице пользователей проблематично. Имена пользователей могут и будут меняться, даже если ваши правила явно не разрешают это. Используйте что-то вроде идентификатора AUTO_INCREMENT внутри, имя пользователя в URL-адресах и для входа в систему. Никогда не перерабатывайте автоматически сгенерированные идентификаторы, иначе вы рискуете связать данные из одной учетной записи в другую.
Как можно изменить имя пользователя, если все они имеют уникальные идентификаторы, которые никогда не меняются и не повторяются? У них не будет возможности установить свое имя пользователя как предопределенное. В таком случае мне все равно нужно использовать AUTO_Increment? Я изучаю AUTO_INCREMENT, потому что никогда раньше не использовал его.
Не менять и не повторять имена пользователей - это просто политика. Что, если кто-то очень хочет, чтобы его имя изменилось, и он попросит администратора «исправить» это за него? Это может создать огромный беспорядок. Если само имя - это просто другое поле, проблем нет.
Я понимаю, откуда вы, однако я единственный администратор, и нет необходимости менять имя пользователя, оно основано на их уникальных идентификаторах, и каждый получает его, и они никогда не будут одинаковыми. Не должно быть причин, по которым когда-либо потребуется смена идентификатора. Я говорю имя пользователя, но на самом деле это уникальный идентификатор, который привязан к человеку. Если они уходят, этот идентификатор не используется повторно. Идентификаторы в основном представляют собой автоинкремент.






Я добавил запрос на обновление, опубликованный выше, после следующего кода. Это решило мою проблему и точно проверит, входил ли пользователь в систему раньше, есть ли у них веб-сайт, направляет их на изменение пароля, если они вошли в систему, отправьте их на веб-сайт. Я создал отдельный запрос для выбора статуса и имени пользователя, чтобы он не мешал вводу пароля. Я предполагаю, что это будет работать с любым именем пользователя, учитывая, что оно полностью изменчиво, если они никогда не входили в систему, прежде чем он должен направить их. Если есть какие-либо проблемы с этим кодом, я хотел бы знать, однако он работает правильно для меня.
$id_get = "SELECT Status, username FROM Users WHERE Status = '-1' and username = ?";
if ($Check = mysqli_prepare($link, $id_get)){
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($Check, "s", $param2_username);
// Set parameters
$param2_username = $username;
$param_status=$status;
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($Check)){
// Store result
mysqli_stmt_store_result($Check);
if (mysqli_stmt_num_rows($Check) == 1){
// Bind result variables
mysqli_stmt_bind_result($Check, $username, $param2_status);
if (mysqli_stmt_fetch($Check)){
if ($param_status== "-1" && $param2_username == '?');
header("location: ChangePassword.php");
}
}
}
}
Какие проблемы с SQL-инъекцией? При этом используются подготовленные операторы со значениями-заполнителями, если вы следуете этому шаблону в своем фактическом коде, у вас все в порядке, но есть и другие серьезные проблемы.