我想知道如何绑定where子句中的值。我明白这是出于安全原因必须做的事情。
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query
->select("*")
->from($db->quoteName("food"))
->where("taste = :taste")
->bind(':taste', 'sweet');
$db->setQuery($query);
$rows = $db->loadAssocList();
我收到了这个错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 在第3行':taste'附近SQL = SELECT * FROM
food
WHERE taste =:taste
我的代码基于this post。它说在Joomla 3.1中只有“ PDO / Sqlite和PDO / Oracle支持预备语句”,我使用的是Joomla 3.2.1和MySQL,以及我的Joomla配置MySQLi。可能是这个问题吗?
我很困惑,因为我不知道API / Class必须遵循什么。
即使我开始怀疑是否必须使用JFactory :: getDbo()来选择/插入/更新/删除Joomla DB中的数据。
提前致谢。
答案 0 :(得分:5)
据我所知,你不能使用预准备语句,也不能将值与Joomla绑定。
如果您从Joomla文档(http://docs.joomla.org/Secure_coding_guidelines#Constructing_SQL_queries)中读取安全编码指南,他们不会讨论预准备语句,只讨论使用强制转换或引用来避免SQL注入。
答案 1 :(得分:1)
在Joomla中,通常来自JTable的check()
,bind()
,store()
三元组可防止注射。
JDatabaseQueryPreparable
有一个您可能想要查看的绑定方法。您可能还想查看JDatabaseQueryLimitable
的docblock。
我建议的一件事是,当你得到那个错误时,通常是因为你的查询确实存在问题(通常是错误的引用或者是空的,不需要为空。要查看生成的查询,使用
echo $query->dump();
然后尝试直接在sql中运行它。
另外一般情况下,使用$db->quote()
和$db->quoteName()
是明智的,如果您使用API,则不会遇到引用问题。我想你可能有一个引用问题但是在不知道你的字段名称的情况下很难知道。
答案 2 :(得分:0)
在Joomla4中,可以使用bind()
方法将数据绑定到命名参数。这个问题已经问了很多年了,终于到了CMS。
语法与帖子中的代码完全一样
$taste = "sweet";
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select("*")
->from($db->quoteName("food"))
->where($db->quoteName("taste") . " = :taste")
->bind(":taste", $taste);
$db->setQuery($query);
$rows = $db->loadAssocList();