这是什么意思 ”?”在SQL查询?

时间:2014-02-05 08:07:18

标签: sql pear

我刚收到一个查询鳕鱼:

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;

    }

4 个答案:

答案 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注入,并且可以优化查询。