【问题标题】:SQL Multiple requestSQL 多请求
【发布时间】:2012-03-12 19:29:42
【问题描述】:

$catIDs 是一系列值,显示如下:11,12,13,14, ...

在我的 sql 请求中我输入:WHERE c.IsActive = 1 AND c.PkID = '" . $catIDs . "'

但它不接受多个参数

使用以下代码,它只显示最后一个值(不是全部)

我尝试使用爆炸来消除“,”并使用简单的 for 使用数组

    $result = doQuery("SELECT DISTINCT c.PkID, c.CategoryName
                        FROM  " . HC_TblPrefix . "categories c 
                        WHERE c.IsActive = 1 AND c.PkID = '" . $catIDs . "'
                        ORDER BY c.CategoryName");

    $donnee=explode(",",$catIDs);

    for($i=0;$i<sizeof($donnee);$i++)       
     {
        $resultCat = doQuery("SELECT c.PkID, c.CategoryName
                        FROM " . HC_TblPrefix . "categories c
                        WHERE c.IsActive = 1 AND c.PkID = '" . $donnee[$i] . "'
                        ORDER BY c.CategoryName");
    }   

        if(!hasRows($resultCat))
            return 0;

        echo '
        <ul>';
        while($row = mysql_fetch_row($resultCat)){
            echo '
        <li><a itemprop="eventType" href="'/index.php?com=searchresult&amp;t='.$row[0].'" rel="nofollow">'.cOut($row[1]).'</a></li>';
        }
        echo '
        </ul>';

【问题讨论】:

  • 在 MySQL 中,可以使用 IN。 xxx IN (a, b, c,...)
  • 多个请求在哪里...???
  • $catIDs 的来源是什么?它来自请求吗?

标签: php mysql sql


【解决方案1】:

试试这个:

$result = doQuery("SELECT DISTINCT c.PkID, c.CategoryName
                    FROM  " . HC_TblPrefix . "categories c 
                    WHERE c.IsActive = 1 AND c.PkID IN ('". implode("', '", explode(",", $catIDs)) ."')
                    ORDER BY c.CategoryName");

你的循环只返回最后一个结果的原因是因为你每次都覆盖$resultCat,所以当你的循环完成时,它只有最后一次循环迭代的结果。无论如何,这真的不是做你想做的事的好方法。使用上面的解决方案。

【讨论】:

  • 鉴于 OP 不清楚 $catIDs 的结构,这可能是最安全的方法。
  • 假设这是用户输入,您可能应该在再次内爆之前用 intval 循环分解结果。
  • @nnichols:同意,假设这是用户输入。值得指出的是,对于任何输入清理,都应该使用mysql_real_escape_string 来防止SQL Injection
【解决方案2】:

如果 $catIDs 是一个字符串,那么这就足够了。

$result = doQuery("SELECT DISTINCT c.PkID, c.CategoryName
                        FROM  " . HC_TblPrefix . "categories c 
                        WHERE c.IsActive = 1 AND c.PkID IN (" . $catIDs . ")
                        ORDER BY c.CategoryName");

如果 $catIDs 是一个数组,那么这将起作用。

$result = doQuery("SELECT DISTINCT c.PkID, c.CategoryName
                        FROM  " . HC_TblPrefix . "categories c 
                        WHERE c.IsActive = 1 AND c.PkID IN (" . implode(",", $catIDs) . ")
                        ORDER BY c.CategoryName");

【讨论】:

  • 只是指出(对于从这篇文章中获得帮助的任何其他人),此解决方案适用于查找整数值(看起来像 OP 想要的那样),但这不起作用带有字符串值。为此,您需要用单引号将每个逗号分隔值括起来。
【解决方案3】:
SELECT DISTINCT c.PkID, c.CategoryName 
FROM  " . HC_TblPrefix . "categories c 
WHERE c.IsActive = 1 AND c.PkID IN ('" . $catIDs . "')

它的格式必须像这样('1','4235','4312')

【讨论】:

  • 这不会在每个条目之间加上单引号,因此您将搜索字符串'1,4235,4312'
  • 那不是 PHP - str_replace(",", "', '", $catIDs)
  • 我试图提供帮助(而不是批评)。我举了一个例子,软件开发人员可以为他们的语言获得正确的语法,我认为这是理所当然的。
  • 对不起,如果我的 cmets 走错了路,但我并不是要批评你的帮助。我只是想指出需要纠正的地方,以便你的方法起作用。我认为您可能会接受我的 cmets 中的建议并通过更新来改进您的答案。在旁注中,不是我对此表示反对。我很早就学会了不要阻止人们提出解决方案,除非有充分的理由。
  • 感谢您花时间回复和解释,非常感谢。谢谢。
猜你喜欢
  • 2016-09-13
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2015-08-02
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多