简体   繁体   English

PHP PDO PostgreSQL问题

[英]PHP PDO PostgreSQL issue

Having problems passing a parameter to a sql query if the parameter has spaces in it. 如果参数中包含空格,则在将参数传递给sql查询时遇到问题。 The code is 该代码是

$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.'%'));

However if sensor contains any spaces the query fails. 但是,如果sensor包含任何空格,查询将失败。 How can I resolve this? 我该如何解决? I've tried putting quotes in the parameter, quotes in the query, but nothing works. 我尝试将引号放在参数中,将引号放在查询中,但没有任何效果。

You may pass space characters in prepared statements parameters without quotes or any special care. 您可以在准备好的语句参数中传递空格字符,而无需引号或进行任何特殊处理。

Here's a demo: 这是一个演示:

<?
$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();
}
?>

It yields no error and displays the proper result: 它不会产生任何错误并显示正确的结果:

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

If the datatype of the column to match is of type CHAR(n) as opposed to VARCHAR(n) or TEXT , be aware that trailing spaces are treated as non significant. 如果要匹配的列的数据类型是CHAR(n)类型,而不是VARCHAR(n)TEXT ,请注意尾随空格将被视为不重要。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM