我正在构建登录系统,我已添加更新功能。但是当我从登录帐户更新用户配置文件时,整个数据库行都会更新。
我有这个代码
include 'db.php';
session_start();
session_regenerate_id();
if (!$_SESSION['logged_in'] == true) {
$_SESSION['message'] = "You must be logged in to use this section";
header("location: error.php");
}
if (isset($_POST['uupdate'])) {
$username = $_POST['uusername'];
$email = $_POST['uemail'];
if (isset($_POST['uusername'])) {
try {
$query = $connect->prepare("UPDATE users SET username='$username' WHERE id = '$id'");
$check = $query->fetch();
$id = $check['id'];
$query->execute(array($username));
} catch (PDOException $e) {
echo $e->getMessage();
}
if (isset($_POST['uemail'])) {
try {
$query = $connect->prepare("UPDATE users SET email='$email' LIMIT 1");
$query->execute(array($email));
} catch (PDOException $e) {
echo $e->getMessage();
}
}
}
我不知道如何使用id更新用户。如果有人有解决方案,请分享。
当然,您缺少where
条件,因此所有条目都会更新。您必须明确告知要更新哪一行。
用户名和电子邮件可能都是唯一的,所以,让我们说$old_email
和$old_username
是您要更新的用户的旧值,那么您应该将查询更改为:
UPDATE users SET username='$username' WHERE username ='$old_username'
和
UPDATE users SET email='$email' WHERE email ='$old_email'
分别。
$connect->prepare("UPDATE users SET username='$username' LIMIT 1");
缺少WHERE子句。你需要添加WHERE id =“$ id”,你必须从某个地方获得$ id,也许是$ _SOSTIOn $ _POST,但是这部分架构在这里看不到。
您需要指定要更新的表的哪一行。你可以使用WHERE
子句这样做。您通常会在id
子句中使用用户的WHERE
。
例:
要将用户名为Bob
的用户的电子邮件地址更改为[email protected]
,您可以使用以下查询:
UPDATE users SET email='[email protected]' WHERE username='Bob'
您必须定义要更新的行:
您可以使用ID:
$query = $connect->prepare("UPDATE users SET email='$email' WHERE id='{$id}' LIMIT 1");
或使用用户名:
$query = $connect->prepare("UPDATE users SET email='$email' WHERE username='{$username}' LIMIT 1");
您还使用了错误的准备/执行功能。要将参数安全地绑定到查询,您可以这样做:
$query = $connect->prepare("UPDATE users SET email=:email WHERE id=:id LIMIT 1");
$query->execute(array('id'=>$id, 'email'=>$email));
PHP 7>在PHP 7或更高版本中,您可以将array()更改为[],如下所示:
$query->execute(['id'=>$id, 'email'=>$email]);