我正在构建登录系统,并且添加了更新功能。但是当我从登录帐户更新用户配置文件时,整个数据库行都会更新。
我有这个代码
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更新用户。如果有人有解决方案,请分享。
答案 0 :(得分:2)
当然,您缺少t=1929 [st= 0] URL_REQUEST_DELEGATE [dt=0]
t=1929 [st= 0] +URL_REQUEST_START_JOB [dt=1058]
--> load_flags = 16384 (MAYBE_USER_GESTURE)
--> method = "GET"
--> url = "https://.../layout.css"
t=1929 [st= 0] URL_REQUEST_DELEGATE [dt=0]
t=1929 [st= 0] HTTP_CACHE_GET_BACKEND [dt=0]
t=1930 [st= 1] HTTP_CACHE_OPEN_ENTRY [dt=1]
--> net_error = -2 (ERR_FAILED)
条件,因此所有条目都会更新。
您必须明确告知要更新的行。
用户名和电子邮件可能都是唯一的,因此,假设where
和$old_email
是您要更新的用户的旧值,那么您应该将查询更改为:
$old_username
和
UPDATE users SET username='$username' WHERE username ='$old_username'
分别。
where条件in the official documentation的引用
答案 1 :(得分:1)
$connect->prepare("UPDATE users SET username='$username' LIMIT 1");
缺少WHERE子句。您需要添加WHERE id =“ $ id”,并且必须从某处获取$ id,也许是$ _POST的$ _SESSIOn,但此处看不到体系结构的那一部分。
答案 2 :(得分:1)
您需要指定要更新表的哪一行。您可以使用WHERE
子句来实现。通常,您会在id
子句中使用用户的WHERE
。
示例:
要将用户名Bob
的用户的电子邮件地址更改为newemail@mail.com
,可以使用以下查询:
UPDATE users SET email='newemail@mail.com' WHERE username='Bob'
答案 3 :(得分:0)
您必须定义要更新的行:
您可以使用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]);