2017-05-29 101 views
0

我想讓用戶對徽標進行評分。該查詢應選擇該用戶尚未評分的下一個徽標。複雜連接的SQL查詢

在review.php我們選擇一個標誌:

<?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. 

感謝您的幫助!

回答

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作爲主鍵。如果以其他方式命名,則當然需要修改查詢。

該查詢說「選擇沒有審查該用戶做出標識」

+0

工程就像一個魅力。非常感謝你。如果能夠解決這個問題,我會在今天剩下的時間裏解決這個問題。 – blogo

+0

是的,tbllogos.id作爲主鍵。 – blogo

+0

請注意,沒有ORDER BY的LIMIT是相當無意義的 – Strawberry

1

你的意思是「在接下來的頁面,我們收集的形式向用戶填寫的數據,並允許他進行我們的數據庫的SQL注入攻擊」

留下一旁的時刻,看看你第一查詢

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

現在看看你插入

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

兩個表是不同的。除非tblreviews表中有觸發器,否則tbllogos中任何記錄的狀態都不會改變。

修復:在tbllogos表中進行更新。

UPDATE tbllogos set status = 'dead' where id = ? 

還要注意,您正在重定向用戶而不檢查插入是否成功。

+0

非常感謝@ e4c5我發送到數據庫之前有點消毒它。對不起,我知道我應該顯示所有代碼,但我想將問題保持在可消化的大小。我會在重定向之前檢查插入是否成功,謝謝提醒。 – blogo