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

这次我试图在用户个人资料上进行最后一次看到。我在我的 phpmyadmin 中添加了一个名为 lastseen 的列,类型为“DATETIME”。当用户注销时,lastseen 应该更新为当前的日期和时间。所以我在我的注销脚本中创建了一个 SQL 来更新这个值。当我测试它时,它并没有像往常一样工作。尝试了很多东西,但没有任何帮助。我发现如果没有我的 WHERE 语句,日期只会按应有的方式更新,但遗憾的是所有用户。所以 SQL 中需要 WHERE 语句。我在没有它的情况下测试后将其添加回来,但它不再工作,这让我确定它与 WHERE 有什么关系,但我真的不明白是什么。


这是我的注销脚本:


<?php


session_start();


session_unset();  // Well.. One of these two  will definitely work!

session_destroy();


// Updating


include('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。



森林海
浏览 154回答 1
1回答

斯蒂芬大帝

您的代码中有一个错误,即当用户使用他们的电子邮件地址登录时,该地址存储在$_SESSION['username']. 在您的注销脚本中,您假设这实际上是他们的用户名,而实际上可能不是。将您的更新查询更改为这样的内容,您的问题可能会得到解决:UPDATE usersSET lastseen='$last_timestamp'WHERE username = '$last_user'&nbsp; 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 查询中的比较失败。
打开App,查看更多内容
随时随地看视频慕课网APP