Joomla数据库选择IN条件

时间:2018-04-07 04:19:26

标签: php mysql joomla3.0

使用常规的mysql命令,我们使用SELECT foo WHERE bar IN(a,b,c) 我正在寻找的是,如何在joomla select数据库中做到这一点?

我试过了:



apt-get install mono-utils mono-runtime-sgen mono-runtime-common \
                mono-runtime-boehm mono-runtime-dbg mono-xbuild




那么伙计们......请帮忙吗?

2 个答案:

答案 0 :(得分:0)

$ db-> quote函数接受一个值或一个数组。您可以使用内爆功能尝试下面的代码 -

而不是 -

$db->quote(.'(13,14,15)'.)

试试这个 -

$db->quote(array(13,14,15))

,最终查询将是 -

$query
    ->select(array('a.id', 'a.promo', 'a.harga', 'a.dp', 'a.image', 'a.teaser' , 'b.title','b.created'))
    ->from($db->quoteName('#__cck_store_form_paket_trip', 'a'))
    ->join('LEFT', $db->quoteName('#__content', 'b') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.catid') . ' IN (' . implode(',', $db->quote(array(13,14,15))) . ')' )
    ->order($db->quoteName($orderby) . ' '.$order)
    ->setLimit($limit,$start)
    ;

答案 1 :(得分:0)

IN条件引用静态值对“稳定性”和“安全性”而言完全没有用。这些数据点不是静态的攻击注入向量。您的查询没有中断的风险,因为您已正确编写了整数值。引用数组值只会增加不必要的代码膨胀,导致效率略有下降,并使代码更难阅读。

在Joomla Stack Exchange的How to Use IN Clause in Joomla Query上查看我非常全面的答案。

相反,您的查询可以安全/安全地编写为:

$query = $db->getQuery(true)
    ->select(["id", "a.promo", "a.harga", "a.dp", "a.image", "a.teaser", "a.title", "a.created"])
    ->from("#__cck_store_form_paket_trip a")
    ->innerJoin("#__content b USING (id)")
    ->where("b.catid IN (13,14,15)")
    ->order($db->qn($orderby) . ($order == "DESC" ? " DESC" : ''))
    ->setLimit($limit, $start);

说明:

  • select()方法不包含任何MySQL关键字或可变形字符,因此这些静态值均不需要加引号/转义。
  • 出于相同的原因,from()方法不需要qn()
  • 请使用Joomla稍短的join('LEFT',...),而不是常用的leftJoin()语法。更好的是,由于您的WHERE要求取消了与a中的null行连接的所有b行的资格,因此更适合使用innerJoin()
  • 由于两个表中要连接的列具有相同的名称,因此可以享受USING的甜美语法。这也意味着在查询中其他地方引用id时,您无需指定表别名。
  • where()方法(如我的文章开头所述)可以静态编写。即使您传入了在脚本前面静态编写的数组,您也可以像这样安全地使用它:

    ->where("b.catid IN (" . implode(',', $arrayOfIntegers) . ")")
    
  • 因为可以安全地假设$orderby是从用户输入派生的,所以您应该继续在qn()方法中实现order()。因为ASC是默认的排序方向,所以我仅有条件地将DESC写入查询中(IOW,如果排序方向为ASC,则将其忽略)。

  • setLimit()很好用,因为Joomla对方法进行了硬编码以将传入的值转换为整数。

如果要查看生成的sql查询,请使用:

echo $query->dump();

要运行基本的诊断检查,可以使用以下操作,但切勿向公众展示$query->dump()或原始$e->getMessage()字符串!

// never show $query->dump() to the public
JFactory::getApplication()->enqueueMessage($query->dump(), 'info');
$db->setQuery($query);
try {
    if (!$result = $db->loadAssocList()) {
        echo "No Qualifying Rows";
    } else {
        echo "<table>";
            echo "<tr><th>", implode("</th><th>", array_keys($result[0])), "</th></tr>";
            foreach ($result as $row) {
                echo "<tr><td>", implode("</td><td>", $row), "</td></tr>";
            }
        echo "</table>";
    }
} catch (Exception $e) {
    // never show getMessage() to the public
    JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error');
}