#php #mysql #database
#php #mysql #База данных
Вопрос:
Итак, у меня очень поверхностное понимание PHP / MySQL (например, степень моего понимания — это то, сколько я смог сохранить из нескольких руководств), и я хочу немного расширить эти руководства. Мне было интересно, как это сделать: скажем, у меня есть один PHP-скрипт, который отвечает за вход пользователя, как показано ниже:
$row = $stmt->fetch();
if ($row) {
if (crypt($_POST['password'],$row['password']) === $row['password']) {
$login_ok = true;
}
}
if ($login_ok) {
header("Location: sample.php");
exit;
die(json_encode($response));
} else {
$response["success"] = 0;
$response["message"] = "Invalid Credentials!";
die(json_encode($response));
}
} else {
?>
<h1>Login</h1>
<form action="login.php" method="post">
Username:<br />
<input type="text" name="username" placeholder="username" />
<br /><br />
Password:<br />
<input type="password" name="password" placeholder="password" value="" />
<br /><br />
<input type="submit" value="Login" />
</form>
Это не весь PHP-скрипт, но, вероятно, то, что имеет значение. Он успешно извлекает введенные имена пользователей и зашифрованные пароли из базы данных и переходит к следующему PHP-скрипту, если они совпадают.
Теперь перейдем к следующему PHP-скрипту, который вставляет данные в два других столбца в той же таблице рядом со столбцами «имя пользователя» и «пароль»:
<?php
require("config.inc.php");
if (!empty($_POST)) {
$query = "INSERT INTO table ( test1, test2) VALUES ( :sample, :othersample)";
$query_params = array(
':sample' => $_POST[‘test1’],
':othersample' => $_POST[‘test2’] );
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["success"] = 0;
$response["message"] = "Database Error2. Please Try Again!";
die(json_encode($response));
}
$response["success"] = 1;
$response["message"] = "Data has been stored!";
echo json_encode($response);
}
else
{
?>
<form action="sample.php" method="post">
Test Value 1:<br />
<input type="text" name="test1" value="" />
<br />
<br />
Test Value 2:<br />
<input type="text" name="test2" value="" />
<br />
<br />
<input type="submit" value="Submit values" />
</form>
<?php
}
?>
При этом также сохраняются две записи в базе данных, но в другой строке, чем в строке с сохраненным именем пользователя и паролем. Я понимаю, почему это было бы сделано, но, по сути, я спрашиваю, как я могу сделать так, чтобы две записи с тестовым значением хранились в той же строке, что и строка имени пользователя и пароля, в зависимости от того, кто вошел в систему. Если ‘user1’ вошел в систему, я бы хотел, чтобы его значения test1 и test2 отображались в отдельной строке.
Заранее спасибо, сообщество stackoverflow. Если этот вопрос уже задавался, я приношу извинения и буду признателен за любые ссылки на них.
Комментарии:
1. после входа пользователя в систему сохраните user_id в сеансах, чтобы вы могли использовать его при другой вставке / обновлении.
Ответ №1:
Вам нужно использовать СЕАНСЫ для хранения пользователя.
Итак, в верхней части всех ваших файлов php включают
session_start();
Затем в этой строке …. захватить информацию о пользователях. Все, что вы хотите…
if (crypt($_POST['password'],$row['password']) === $row['password']) {
$_SESSION['username'] = $row['username'];
$_SESSION['user_id'] = $row['id'];
$login_ok = true;
}
Теперь у вас есть доступ к этому пользователю, пока они вошли в систему.
Затем повторно введите их на этой другой странице и используйте это, чтобы изменить их строку в БД
session_start();
require("config.inc.php");
if (!empty($_POST)) {
$query = "UPDATE table SET sample=:test1, othersample=:test2 WHERE id = '".$_SESSION['user_id']."'";
$stmt = $db->prepare($query);
$stmt->bindParam(":test1",$_POST['test1']);
$stmt->bindParam(":test2",$_POST['test2']);
$result = $stmt->execute();
Комментарии:
1. Это недопустимый SQL. Вы не можете использовать
WHERE
withINSERT
. Вам нужно изменить оператор наUPDATE
.2. Я уже это сделал, возможно, вы видите старое сообщение или обновляете свою страницу?
3. Молодец! Ты сделал меня ниндзя за 60 секунд, которые потребовались, чтобы написать предыдущий комментарий 😉
4. потрясающий, потрясающий ответ. Я не могу поддержать вас из-за необходимости получения 15 очков репутации, но я надеюсь, что другие люди это сделают.
Ответ №2:
Чтобы создать новую строку в таблице, которую вы используете INSERT
. Чтобы обновить существующую строку в таблице, которую вы используете UPDATE
.
Предполагая, что ваша таблица пользователей выглядит примерно так…
id | username | password | test1 | test2
---|------------|----------|-------|------
1 | moonwizard | asdjkhfa | |
2 | fred186 | jdwer3fv | |
… ваш запрос должен выглядеть следующим образом:
$query = "update table set test1 = :sample, test2= :othersample where id = :id";
Затем вам нужно будет привязать идентификатор строки, которую вы хотите обновить.
Вы получаете этот идентификатор, когда пользователь входит в систему, и сохраняете его именно для таких вещей.