我刚收到一个查询鳕鱼:
SELECT o.id,o.sort_order,od.object FROM i_objects o, i_objects_description od
WHERE o.id=od.objects_id AND o.object_status = ? AND od.languages_id = ?
ORDER BY o.sort_order ASC
我想知道它是什么“?”这个查询意味着什么? 如果我运行此查询,它会给我这个错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?
我正在使用PEAR这是我的功能:
function getArrayObjects( $language_id )
{
$q = 'SELECT o.id,o.sort_order,od.object FROM ' . TABLE_OBJECTS . ' o, ' . TABLE_OBJECTS_DESCRIPTION . ' od ';
$q.= 'WHERE o.id=od.objects_id AND o.object_status = ? AND od.languages_id = ? ';
$q.= 'ORDER BY o.sort_order ASC';
$sth = $this->_db->prepare( $q );
$res = $sth->execute( array( 'active', $language_id ) );
//var_dump($res);echo "<br>";echo "<br>";echo "<br>";
$objects = array();
while( $row = $res->fetchRow())
{
$objects[$row['id']] = $row;
}
return $objects;
}
答案 0 :(得分:6)
它是参数的占位符。在您的查询中,您有:
AND o.object_status = ? AND od.languages_id = ?
然后你执行它:
$res = $sth->execute( array( 'active', $language_id ) );
因此,当数据库服务器实际执行查询时,object_status
为'active'
且language_id
为$language_id
。
这样做是为了防止SQL注入。另一个原因是效率。使用预准备语句时,数据库不需要每次都解析/编译查询。它使用模板并只替换其中的值。 (更多内容:Prepared statement)
答案 1 :(得分:2)
?
是占位符,其值在$sth->execute( array( 'active', $language_id ) )
语句中填充。
此构造的主要目的之一是防止 sql注入攻击。
答案 2 :(得分:1)
它用于动态设置值,换句话说就是占位符
答案 3 :(得分:1)
这些是“参数化查询”。在评估“?”时被给定的值替换(称为绑定)。它们可以防止sql注入,并且可以优化查询。