首先,我做了一个搜索查询,以帮助我根据关键字查找图像。我从'SELECT * FROM images WHERE image LIKE "%'.$search.'%"'
开始,这很好。然后我做了'SELECT * FROM images,images_2 WHERE images.image LIKE "%'.$search.'%"'
并且一切都行不通。我开始得到多个相同的图像,每个表都有不同的图像。愿有人可以帮我解决这个错误吗?
<?php
//You could always do it seperately
if (isset($_POST['submit-search'])){
$conn = mysqli_connect("localhost","root","****","photos");
$search = mysqli_real_escape_string($conn, $_POST['search']);
$sql = 'SELECT * FROM images WHERE images.image LIKE "%'.$search.'%"';
$result = mysqli_query($conn, $sql);
$queryResult = mysqli_num_rows($result);
echo "<p>Found ".$queryResult." quote(s)</p>";
if ($queryResult > 0){
while($row = mysqli_fetch_assoc($result)){
echo "<a href='uploads/".$row['image'].">";
echo "<img id='img_div' src='uploads/".$row['image']."'/>";
echo "</a>";
}
} else{
echo "There are no quotes matching your search.";
}
}?>
答案 0 :(得分:1)
使用第二个查询,指定两个表,您将获得重复项,因为您没有为images_2表指定任何条件。因此,它从图像_2返回所有内容。
您要做的是union
将两个表一起放入一个derived
表中,然后对该表进行查询。如果您需要进一步解释此查询中发生的情况,请告诉我们。我已经格式化了查询,使其更清晰:
select
image
from
(
select image from images
union
select image from images_2
)
as t -- Give this derived table a name
where
image LIKE '%{$search}%'
在旁注中,请查看使用预准备语句。将用户提供的值(例如从$ _POST或$ _GET)直接注入查询是危险的;并且逃避字符串不会保护你免受一切伤害。
答案 1 :(得分:1)
使用此SQL:
SELECT * FROM images, images_2 WHERE images.image LIKE "%'.$search.'%"
当您使用images, images_2
时,您正在加入图片和图片_2,但是没有加入的条件,因此您将从两个表中获得每个行的组合。
看起来您正在尝试从两个不同的图像表中获取图像,因此您需要做的事情可能是UNION
而不是JOIN
。当你加入这两个表时,它将来自两个表的记录组合到同一行中,但是使用union,它更像是从两个表中选择所有匹配的行。
虽然不知道表的其余结构,但很难说如何编写联合查询。假设这两个表在结构上完全相同,那就像是:
SELECT * FROM images WHERE images.image LIKE "%'.$search.'%"
UNION
SELECT * FROM images_2 WHERE images2.image LIKE "%'.$search.'%"
如果两个表不是在结构上相同,则只选择每个表中的相应列,而不是使用*
。