2017-05-29 27 views
0

ユーザーがロゴを評価できるようにしたい。クエリは、このユーザーがまだ評価していない次のロゴを選択する必要があります。我々はロゴを選択review.phpで複雑な結合によるSQLクエリ

<?php 
$dbconnect = mysqli_connect("localhost", "***", "***", "***"); 
if (!isset($_SESSION)) { 
session_start(); 
} 
$thisuser = $_SESSION['uid'] 

$Recordsetlogos = mysqli_query($dbconnect, "SELECT * FROM tbllogos WHERE status = 'live' LIMIT 1"); //query 
$row_Recordsetlogos = mysqli_fetch_assoc($Recordsetlogos); 
?> 

これまでのところは良いです。

ユーザーは、ロゴを見て、評価を選択してフォームを送信します。

我々は、ユーザが記入したフォームからデータを収集し、次のページで

、我々は、データベース内の別のテーブルにレコードを挿入:

<?php 
$dbconnect = mysqli_connect("localhost", "***", "***", "***"); 

$did = $_POST['did']; // user ID 
$lid = $_POST['lid']; // logo ID 
$review = $_POST['review']; // rating 
$desrank = $_POST['desrank']; // user's rank 

$updateSQL = mysqli_query($dbconnect, "INSERT INTO tblreviews (did, lid, vote, desrank) VALUES ('$did', '$lid', '$review', '$desrank')"); 

mysqli_close($dbconnect); 

header("Location: review.php"); // send user back 
exit; 

ユーザーがバックreview.phpに到着し、評価します次のロゴ。

review.phpが読み込まれると、ユーザーが評価したのと同じロゴが表示されます。

これはおそらく単純な結合であることを認識していますが、私はその周りに頭を浮かべることはできません。ここで

は、それは...英語で、あなたの助けのための

Select from tbllogos 
where status = 'live' 
AND 
logo and $thisuser do not appear as a pair in tblreviews. 

おかげで何をすべきかです!一瞬のために取っているのまま「次のページで、我々は、ユーザが記入したフォームからデータを収集し、彼は私達のデータベースにSQLインジェクション攻撃を実行できるようにする」

答えて

2

選択したクエリにLEFT JOINが必要で、WHEREには結合行がない行のみがフィルタリングされます。

SELECT l.* FROM tbllogos l 
LEFT JOIN tblreviews r ON r.lid = l.id AND r.did = $thisuser 
WHERE l.status = 'live' AND r.lid IS NULL 
LIMIT 1 

プライマリキーとして列tbllogos.idがあるとします。どういうわけか他の名前が付いている場合は、もちろんクエリを変更する必要があります。

このクエリはe4c5 @

+0

魅力的な作品です。どうもありがとうございました。それは私にそれを理解する日の残りの部分を取っていただろう。 – blogo

+0

はい、tbllogos.idが主キーです。 – blogo

+0

ORDER BYのないLIMITはかなり意味がないことに注意してください – Strawberry

1

あなたが意味

、あなたを見て最初のクエリ

"SELECT * FROM tbllogos WHERE status = 'live' LIMIT 1" 

は、今すぐあなたのインサート

INSERT INTO tblreviews (did, lid, vote, desrank) VALUES ('$did', '$lid', '$review', '$desrank')"); 

二つのテーブルが異なっているを見てください。 tblreviewsテーブルにトリガが設定されていない限り、tbllogosのレコードのステータスが変更されることはありません。

修正:tbllogosテーブルを更新します。

また、挿入が成功するかどうかを確認せずにユーザーをリダイレクトすることにも注意してください。

+0

多くのおかげで、私は少しデータベースに送信する前にそれを無害化します「このユーザーによって行われたレビューがないのロゴを選択する」と言います。申し訳ありませんが、私はすべてのコードを表示する必要がありますが、私は消化可能なサイズに質問を抑えたいと思っていました。私はリダイレクトの前に挿入が成功したことを確認します。リマインダーのおかげです。 – blogo