2013-11-01 2 views
0

Проблемы с передачей параметра в sql-запрос, если в нем есть пробелы. КодPHP PDO PostgreSQL issue

$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 никогда не нуждаются в котировках - параметры не заменяются «на месте», запрос «готов» к РСУБД (вроде создания процедуры), и он вызывается с использованием параметров (в качестве параметров перешли к процедуре). –

+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