我通过关键字查询图像。为什么它会显示多个相同的图像?

时间:2017-06-29 17:59:54

标签: php image phpmyadmin

首先,我做了一个搜索查询,以帮助我根据关键字查找图像。我从'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.";
        }
    }?>

2 个答案:

答案 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.'%"

如果两个表不是在结构上相同,则只选择每个表中的相应列,而不是使用*