1

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

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

然后,他们可以输入一个列表项并添加到一个包含他们的 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(默认值)。

4

1 回答 1

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

就像 Jeff Watkins 所说,会话可能会超时,因此最好先检查它是否设置为使用isset().

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

于 2012-06-12T01:22:15.747 回答