1

ユーザーがログインしてリストにアイテムを追加できるサイトがあります。

ユーザーがログインすると、セッションに電子メールが保存されます。これを使用して、ユーザーテーブルでユーザーを識別します。

次に、リストアイテムを入力し、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(デフォルト)に設定されているレコードを作成します。

4

1 に答える 1

0

まず、あなたの質問へのコメントで SQL インジェクション攻撃について私が言ったことを読んでください。

を に保存することをお勧めしuser_idます$_SESSION。これにより、電子メールに基づいて毎回クエリを実行する必要がなくなります。しかし、電子メールを に格納することだけを主張する場合は$_SESSION、実際にはクエリが 1 つだけ必要になります。調整されたコード:

<?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()ます。

それ以外の場合、ユーザー ID をセッションに保存した場合$_SESSION['user_id']は、挿入でサブクエリを実行する代わりに、直接参照することができます。

于 2012-06-12T01:22:15.747 に答える