mysql - 将用户 ID 添加到 MySQL 用户列表表时出现不稳定问题

标签 mysql

我有一个网站,用户可以在其中登录并向列表中添加项目。

用户登录, session 存储他们的电子邮件,我用它在用户表中识别他们。

然后,他们可以输入一个列表项并添加到包含他们的 ID 和他们的列表项的列表中。

有时会添加 ID,有时会出现空值(但是,始终会添加列表项文本)。这看起来很不稳定,因为大多数时候都包含 ID。

有什么想法吗?表类型是 MyISAM。顺便说一句,我是编程新手。

这是我的代码示例:

<?php 
session_start();
$item = $_REQUEST['item'];
$email = $_SESSION['email'];

if ($item)
{

mysql_connect("localhost","root","") or die("We couldn't connect!");

mysql_select_db("table");

$query = mysql_query("SELECT ID FROM users WHERE email='".$_SESSION['email']."'");
$result = mysql_result($query,0);
$user_id = $result;

mysql_query("INSERT INTO items (user_ID,item_name) VALUES('$user_id','$item')");

因此,每次我自己登录我的网站进行测试时,都没有问题。但越来越多的用户尝试添加项目,它会创建一条记录,其中 item_name 正确显示,但 user_ID 设置为 0(默认值)。

最佳答案

首先,请阅读我在对您问题的评论中所说的有关 SQL 注入(inject)攻击的内容。

最好将 user_id 存储在 $_SESSION 中,这样您就不必每次都根据电子邮件查询它...但是如果您坚持只在 $_SESSION 中包含电子邮件,那么您实际上只需要一个查询。调整后的代码:

<?php 
session_start();
$item = mysql_real_escape_string($_REQUEST['item']);

if (!empty($item) && isset($_SESSION['email']))
{
    mysql_connect("localhost","root","") or die("We couldn't connect!");
    mysql_select_db("table");

    mysql_query("INSERT INTO items (user_ID, item_name) VALUES ((SELECT ID FROM users WHERE email='{$_SESSION['email']}'), '$item')");
}

正如 Jeff Watkins 所说, session 可能会超时,因此最好先检查它是否使用 isset() 设置。

否则,如果您将 userid 存储在 session 中,您可以直接将其引用为 $_SESSION['user_id'] 而不是在插入中执行子查询。

关于mysql - 将用户 ID 添加到 MySQL 用户列表表时出现不稳定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988512/

相关文章:

sql - MySQL:指定我希望返回的行的顺序

php - 将数组的多个值插入数据库

mysql - 创建存储过程时是否需要 `definer`?

mysql - 验证连接表中两个 id 的唯一性

php - prestashop下的OrderConfirmationController.php页面可以执行自定义模块

php - 从两个表中检索信息

mysql - 按相似字符串分组

php - 当数据发送到 mySQL 时如何将数据添加到特定表单元素

MySQL游标默默地删除尾随空格

MYSQL 查询替换字符串的一部分