具有复杂连接的SQL查询

时间:2017-05-29 11:17:58

标签: php mysql sql

我想允许用户对徽标进行评分。查询应选择此用户尚未评级的下一个徽标。

在review.php上,我们选择了一个徽标:

word-break: break-all

到目前为止一切顺利。

用户看到徽标,选择评级并提交表单。

在下一页,我们从用户填写的表单中收集数据,然后将记录插入数据库中的另一个表:

<?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); 
?>

用户返回review.php,为下一个徽标评分。

当review.php加载时,它会显示用户刚评出的相同徽标。

我意识到这可能是一个简单的联接,但我无法理解它。

这是应该做的,用英语......

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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作为主键。如果以其他方式命名,您当然需要修改查询。

此查询显示&#34;选择此用户未进行审核的徽标&#34;

答案 1 :(得分:1)

你的意思是“在下一页,我们从用户填写的表格中收集数据,并允许他对我们的数据库进行SQL注入攻击”

暂时暂且不谈,请查看您的第一个查询

library(msleep)
head(msleep)
msleep_sub <- msleep %>% group_by(genus) %>% filter(n() ==1)
table(msleep$vore)
#   carni   herbi insecti    omni 
#      14      27       5      20
table(msleep_sub$vore)
#   carni   herbi insecti    omni 
#      19      32       5      20

现在看看你的插页

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

两张表不同。除非您在INSERT INTO tblreviews (did, lid, vote, desrank) VALUES ('$did', '$lid', '$review', '$desrank')"); 表上有触发器,否则tblreviews中任何记录的状态都不会发生变化。

修复:在tbllogos表中进行更新。

tbllogos

另请注意,您正在重定向用户,而不检查插入是否成功。