我有一个网站,用户可以在其中登录并向列表中添加项目。
用户登录, 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/