2014-02-05 133 views
2

我剛剛得到一個查詢鱈魚:「?」這是什麼意思?在SQL查詢?

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

@Sergio Tulentsev你會更具體嗎? – Chester

回答

5

它是參數的佔位符。在查詢你有這樣的:

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

+0

所以我們使用佔位符來防止sql注入?這是唯一的作用? – Chester

+1

@Chester主要是,是的。也爲了效率。當您使用準備好的語句時,數據庫不需要每次重新編譯查詢。它使用該模板並僅替換其中的值。 –

1

它是一種用於動態設置的值,換句話說佔位符

2

?是佔位符,其值填寫在$sth->execute(array('active', $language_id))語句中。

此構造的主要目的之一是防止sql注入攻擊

1

這些是「參數化查詢」。在評估「?」被替換爲給定的值(它被稱爲綁定)。它們可以防止sql注入,並可以優化查詢。