使用常规的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

那么伙计们......请帮忙吗?
答案 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()
。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');
}