[英]SQL query with complex join
我想允许用户对徽标进行评分。 查询应选择该用户尚未评级的下一个徽标。
在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.
谢谢你的帮助!
您需要在选择查询中使用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
作为主键。 如果以其他方式命名,则您当然需要修改查询。
该查询显示“选择没有对此用户进行评论的徽标”
您的意思是“在下一页上,我们将从用户填写的表单中收集数据,并允许他对我们的数据库进行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 = ?
另请注意,您在重定向用户时未检查插入是否成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.