为了账号安全,请及时绑定邮箱和手机立即绑定

WHERE 语句在应该更新数据的 SQL 中不起作用

WHERE 语句在应该更新数据的 SQL 中不起作用

PHP
森林海 2022-10-14 14:29:09
这次我试图在用户个人资料上进行最后一次看到。我在我的 phpmyadmin 中添加了一个名为 lastseen 的列,类型为“DATETIME”。当用户注销时,lastseen 应该更新为当前的日期和时间。所以我在我的注销脚本中创建了一个 SQL 来更新这个值。当我测试它时,它并没有像往常一样工作。尝试了很多东西,但没有任何帮助。我发现如果没有我的 WHERE 语句,日期只会按应有的方式更新,但遗憾的是所有用户。所以 SQL 中需要 WHERE 语句。我在没有它的情况下测试后将其添加回来,但它不再工作,这让我确定它与 WHERE 有什么关系,但我真的不明白是什么。这是我的注销脚本:<?phpsession_start();session_unset();  // Well.. One of these two  will definitely work!session_destroy();// Updatinginclude('C:\xampp2\htdocs\settings\sh_config.php');include('./static/index/scripts/session_start.php');$conn = mysqli_connect($database['host'], $database['user'],  $database['password'], $database['db'], $database['port']);$last_timestamp = date("Y-m-d H:i:s");$last_user = $_SESSION['username'];$lastseen_query = mysqli_query($conn, "UPDATE users SET lastseen='$last_timestamp' WHERE username = '$last_user'");header('Location: /');$conn->close();?>“sh_config.php”的包含是私有的,但我会告诉它在这个脚本中的作用。很简单的答案:我在该文件中配置了数据库连接。因此, $database 的所有内容都在该文件中正确配置。嗯,如你所见,里面有很多信息。基本上,这管理着注册和登录以及使用用户 ID 重定向到唯一配置文件的所有内容。我认为这个文件可能会派上用场,因为在这个文件中定义了 id 和用户名。如果您看起来不错,您会看到我将此文件包含在我的注销脚本中,因此定义的单词应该可以正常工作,但它们不能。尝试在没有包含的情况下在文件中重新定义它也不起作用。哦,顺便说一句,我使用 MySQLi。
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

您的代码中有一个错误,即当用户使用他们的电子邮件地址登录时,该地址存储在$_SESSION['username']. 在您的注销脚本中,您假设这实际上是他们的用户名,而实际上可能不是。将您的更新查询更改为这样的内容,您的问题可能会得到解决:


UPDATE users

SET lastseen='$last_timestamp'

WHERE username = '$last_user'

  OR email = '$last_user';

虽然这可能有效,但我建议使用您的宝贵用户id。不要比较容易出现各种错误(大小写错误的字母、前导/尾随空格、不同编码等)的字符串,而是比较您的 ID。这不仅使事情更不容易出错,而且还会减少您的计算时间,尤其是在数据库查找的上下文中。


$_SESSION['user_id'] = $user_id['id']; // or $gen_id['id'] in the signup code.

$last_user = $_SESSION['user_id'];

$lastseen_query = mysqli_query($conn, "UPDATE users SET lastseen='$last_timestamp' WHERE id = '$last_user'");

将来要自己调试此类问题,您可以使用一种流行的、快速而肮脏的方式来转储变量的内容:打印/回显创建用户时的值并回$username显在上面的脚本更新数据库中最后看到的值,如下所示:$email$username


$username = mysqli_real_escape_string($db, $_POST['username']);

$email = mysqli_real_escape_string($db, $_POST['email']);


var_dump($username);

var_dump($email);

$last_user = $_SESSION['username'];


var_dump($last_user);

$last_user如果匹配的转储$email您知道上述错误适用并且是您的脚本行为不端的原因。您可能还会发现字符串值存在一些问题(可能在某些时候出现意外突变),这会导致 SQL 查询中的比较失败。


查看完整回答
反对 回复 2022-10-14
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号