根据联接表中的POST变量在SQL中搜索

丹尼尔

我尝试解决了一段时间,但没有解决。

我从装满移动设备的表中读取并列出了它们,并为用户提供了根据“移动设备名称”和“用户名”搜索列表的可能性。

这是我的代码:

        SELECT
        *
    FROM
        tbl_mobdev
    LEFT JOIN
        tbl_mobdev_type ON mobdev_type_id = mobdev_type
    LEFT JOIN
        tbl_marke ON marke_id = mobdev_type_marke
    LEFT JOIN
        tbl_user ON tbl_user.id = mobdev_user
    WHERE
        CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%'
    AND
        CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'
    AND
        mobdev_aktiv = '1'
    ORDER BY
        ".$_GET['sort']." ".$_GET['sort2']."

只要tbl_mobdev.mobdev_user包含一个User-ID,而所有不包含User-ID的表行都被排除,一切都会按预期进行。

有什么解决办法吗?

编辑:将“过滤器”放在tbl_user的LEFT JOIN中的解决方案不起作用。每行将显示类似以下结果的SQL。如果LIKE仅包含不匹配的结果,则不会加入该行,因此不会对该行进行过滤。

SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS  user_name, tbl_user.vorname AS user_vorname
FROM tbl_mobdev
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user
AND CONCAT( tbl_user.name, ' ', tbl_user.vorname ) LIKE '%%'
WHERE CONCAT( tbl_marke.marke_name, ' ', tbl_mobdev_type.mobdev_type_bezeichnung ) LIKE '%%'
AND mobdev_aktiv = '1'
ORDER BY marke_name ASC 
LIMIT 0 , 30

Edit2:将SQL设置为以下内容不会更改行为。

SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS user_name, tbl_user.vorname AS user_vorname
FROM tbl_mobdev
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user
AND CONCAT( tbl_user.name, ' ', tbl_user.vorname ) LIKE '%G%'
WHERE CONCAT( tbl_marke.marke_name, ' ', COALESCE( tbl_mobdev_type.mobdev_type_bezeichnung, '' ) ) LIKE '%%'
AND mobdev_aktiv = '1'
ORDER BY marke_name ASC 
LIMIT 0 , 30

没有匹配$ _POST ['user']的行仍不会被过滤掉。

我上传了一个带有模糊名称的行为的示例图片,左侧picute是一个没有任何过滤器的Select,右侧pictura是具有实际用户名的Select(已模糊显示,但其名称与mobdev_id'3'中的名称完全相同。

http://fs5.directupload.net/images/160404/tmdbyzws.png

如您所见,其他五行仍然存在,只是没有联接。我希望它们完全消失,因为它们与过滤器不匹配。

Edit3:好吧,我现在做到了……使用PHP的方式非常糟糕。我只是将代码留在此处,如果有人为此提出了更好的解决方案,请告诉我。

$query = "
    SELECT
        mobdev_id,
        mobdev_type_bezeichnung,
        marke_name,
        tbl_user.name AS user_name,
        tbl_user.vorname AS user_vorname
    FROM
        tbl_mobdev
    LEFT JOIN
        tbl_mobdev_type ON mobdev_type_id = mobdev_type
    LEFT JOIN
        tbl_marke ON marke_id = mobdev_type_marke
    LEFT JOIN
        tbl_user ON tbl_user.id = mobdev_user
    WHERE
        CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%'
        ";
if($_POST['user'])
{
    $query .= "
        AND
            CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'
        ";
}
$query .= "
    AND
        mobdev_aktiv = '1'
    ORDER BY
        ".$_GET['sort']." ".$_GET['sort2']."
    ";
埃特波姆

问题出在行中

    CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'

您在tbl_user上的LEFT JOIN将允许主查询返回,而与该行中是否有值无关。但是,该特定的WHERE子句行有效地覆盖了该行;如果tbl_user.name或tbl_user.vorname为null,则结果将始终为false。

如果需要执行类似的操作,则通常将测试放入JOIN语句的ON子句中。这样,它会过滤已存在的JOINed表,但不会在不存在的地方引起问题。

示例查询文本应确保在需要时过滤tbl_user,但在未指定任何内容时不过滤-

SELECT
    md.mobdev_id, 
    mdt.mobdev_type_bezeichnung, 
    m.marke_name, 
    u.name AS  user_name, 
    u.vorname AS user_vorname
FROM
    tbl_mobdev md
        LEFT JOIN tbl_mobdev_type mdt
            ON mdt.mobdev_type_id = md.mobdev_type
        LEFT JOIN tbl_marke m
            ON m.marke_id = mdt.mobdev_type_marke
        LEFT JOIN tbl_user u
            ON u.id = md.mobdev_user
            AND CONCAT(u.name,' ',u.vorname) LIKE '%".$_POST['user']."%'
WHERE
    CONCAT(m.marke_name,' ',COALESCE(mdt.mobdev_type_bezeichnung,'')) 
            LIKE '%".$_POST['m.marke_name']."%'
    AND md.mobdev_aktiv = '1'
ORDER BY
    ".$_GET['sort']." ".$_GET['sort2']."

两个助手-

  • 正如Rene M.上文所述,此代码是SQL注入漏洞。由于其当前的应用程序,它可能是安全的,但我仍然不会推出它。有人采用此应用程序或代码片段,然后在不进行全面审核的情况下将其联机移动的机会并不重要,那么您就会遇到问题。练习正确的做法-不要在代码中留下SQL Injection漏洞。
  • 请为您的表名加上别名!对于每个字段引用而言,每个表名都被完整写出的查询使其变得非常庞大。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据联接表中的POST变量在SQL中搜索

来自分类Dev

根据一列值联接SQL表中的多行

来自分类Dev

SQL:要根据表中的值更改联接的条件

来自分类Dev

根据oracle中的列值联接表

来自分类Dev

根据Hive中的条件联接表

来自分类Dev

SQL根据另一个表中的搜索结果在表中查找行

来自分类Dev

SQL根据联接表中链接记录的值匹配将列设置为指定值

来自分类Dev

SQL根据联接表中链接记录的值匹配将列设置为指定值

来自分类Dev

根据SQL Server 2008中用户定义的参数联接表和groupby结果

来自分类Dev

多个表中的Sql搜索

来自分类Dev

SQL:从联接表中查找总计

来自分类Dev

SQL Server中的条件表联接

来自分类Dev

SQL:如何从联接表中检索总数?

来自分类Dev

SQL-从联接表中检索列

来自分类Dev

从联接表中删除SQL无效

来自分类Dev

通过SQL中的联接更新表

来自分类Dev

SQL:从联接表中查找总计

来自分类Dev

自联接SQL Server 2008中的表

来自分类Dev

在SQL Server中创建联接表

来自分类Dev

如何使用联接从两个表中搜索数据

来自分类Dev

如何在我的搜索方法中访问此联接表?

来自分类Dev

与存储在Rails 3.2中的变量中的表名联接

来自分类Dev

SQL表联接与通配符变量

来自分类Dev

根据联接表中的最新行选择MySQL结果

来自分类Dev

根据从联接评估的条件对mysql表中的字段进行计数

来自分类Dev

在SQL中的表中搜索单词词典

来自分类Dev

根据表中的数据创建PHP变量

来自分类Dev

SQL-根据另一个表中的信息在一个表中搜索并返回多个结果

来自分类Dev

在 SQL Server 表中,如何根据对具有 JSON 值的列的 JSON 搜索过滤记录

Related 相关文章

热门标签

归档