2013-11-01 98 views
0

如果參數中有空格,將參數傳遞給sql查詢會出現問題。代碼是PHP PDO PostgreSQL問題

$statement="select di_timestamp, di_item_value 
from data_item 
where 
fk_fc_id=(select fc_id 
     from field_column 
     where 
     fc_description ilike :sensor 
     and 
     fk_mds_id=(select mds_id 
        from monitored_data_set 
        where fk_pa_id=(select pa_id 
         from pilot_ambient 
         where 
         pa_ambient_name ilike :room 
         and 
         fk_sp_id=(
          select sp_id 
          from School_Pilot 
          where sp_description ilike :name 
          ) 
         ) 
        ) 
       )"; 
$query = $databaseConn->prepare($statement); 
$query->execute(array(':sensor'=>$sensor,':room'=>$room,':name' => '%'.$school.'%')); 

但是,如果傳感器包含任何空格,則查詢失敗。我該如何解決這個問題?我試過把參數引號,查詢中的引號,但沒有任何工作。

+0

PDO準備的語句參數應該永遠不需要引號 - 參數不會被替換「就地」查詢由RDBMS「準備」(類似於創建過程)並且使用參數調用它(作爲參數傳遞給程序)。 –

+0

但是,它正在生產,它生產錯誤,報價或沒有報價。有誰知道如何解決這個問題? – James

+0

_query failed_意味着拒絕並顯示錯誤消息(哪一個?),或者結果不符合您的期望? –

回答

1

您可以在準備好的語句參數中傳遞空格字符而不用引號或任何特別的注意。

這裏的一個演示:

<? 
$pdo = new PDO('pgsql:dbname=test'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$query = "SELECT 1 WHERE 'abc de' ilike :pattern"; 
try { 
    $stmt = $pdo->prepare($query); 
    $stmt->execute(array(":pattern"=>'ABc %')); 
    var_dump($stmt->fetchAll()); 
} 
catch(PDOException $e){ 
    echo "Error". $e->getMessage(); 
} 
?> 

它產生沒有錯誤並顯示適當的結果:

 
array(1) { 
    [0]=> 
    array(2) { 
    ["?column?"]=> 
    int(1) 
    [0]=> 
    int(1) 
    } 
} 

如果列相匹配的數據類型是CHAR(n)型的,而不是VARCHAR(n)TEXT ,請注意尾部空格被視爲無效。

+0

微妙的錯誤(對我來說!)我使用單引號來構建執行數組,你使用雙引號。一旦我改爲雙引號,它工作得很好。感謝您的幫助,感激。 – James