将用户ID添加到MySQL用户列表中的不稳定问题

时间:2012-06-11 22:50:01

标签: mysql

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

用户登录并且会话存储他们的电子邮件,我用它来在用户表中识别它们。

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

有时会添加ID,有时会显示为null(但是,始终会添加列表项文本)。这似乎不稳定,因为大多数时候都包含了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(默认值)。

1 个答案:

答案 0 :(得分:0)

首先,在您的问题的评论中阅读我所说的关于SQL注入攻击的内容。

最好将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')");
}

就像杰夫沃特金斯所说,会话可能会超时,所以首先检查是否使用isset()进行设置是个好主意。

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