我有一个网站,用户可以登录并将项目添加到列表中。
用户登录并且会话存储他们的电子邮件,我用它来在用户表中识别它们。
然后,他们可以输入一个列表项并添加到包含其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(默认值)。
答案 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']
,而不是在插入中执行子查询。