PHP从Postgres意外字符中选择

时间:2019-03-22 15:08:01

标签: php postgresql select pgadmin php-pgsql

我有一个用PHP编写的应用程序,我正在连接到PGSQL数据库并选择一些数据。直到我在查询中使用字符串连接运算符(||)为止,此操作均按预期进行。

我通过PGadmin连接到PGSQL db并生成了查询,所以我知道它肯定可以工作。然后,我复制了代码并将其粘贴到我的$query变量中。

我的代码在下面;

$dbconn = pg_connect("host=xxx dbname=xxx user=xxx password=xxx") or die('Could not connect: ' . pg_last_error());
$query = ' 
SELECT
f.date_gmt::date as "Date Assessed"
n.last_name || ', '' || n.first_name AS "Full Name" // line 12
FROM
fines as f
JOIN
record_metadata as r
ON
r.id = f.record_metadata_id
JOIN
fullname as n
ON
n.id = f.record_metadata_id
';

$result = pg_query($query) or die('Query failed: ' . pg_last_error());

echo "<table>\n";
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
    echo "\t<tr>\n";
    foreach ($line as $col_value) {
        echo "\t\t<td>$col_value</td>\n";
    }
    echo "\t</tr>\n";
}
echo "</table>\n";

pg_free_result($result);
pg_close($dbconn);

产生的错误是;

  

解析错误:语法错误,出现意外的“,”   / ...第12行的index.php

从代码中删除第12行即可解决此问题。但是,我需要这些数据,所以我需要更改什么才能实现自己想要的?

大概我不能简单地从PGSQL数据库复制工作查询并将其粘贴到我的PHP代码中?

2 个答案:

答案 0 :(得分:0)

您在用单引号分隔的字符串中有单引号:

'SELECT * FROM foo WHERE id = '123''

您需要逃脱它们。 IIRC,Postgres使用双打单打来做到这一点:

'SELECT * FROM foo WHERE id = ''123'''

或者反斜杠:

'SELECT * FROM foo WHERE id = \'123\''

答案 1 :(得分:0)

您没有转义引号'。 您有2个选择。

第一个使用反斜杠将其转义:

n.last_name || \', \'\' || n.first_name AS "Full Name"

第二个(建议)只需使用heredoc表示法即可:

$query = <<<QUERY
SELECT
f.date_gmt::date as "Date Assessed"
n.last_name || ', '' || n.first_name AS "Full Name"
FROM
fines as f
JOIN
record_metadata as r
ON
r.id = f.record_metadata_id
JOIN
fullname as n
ON
n.id = f.record_metadata_id
QUERY;

示例here

||是Postgres的串联运算符。我认为您在那里有错字,这行

n.last_name || ', '' || n.first_name AS "Full Name"

有错字,应该是

n.last_name || '', '' || n.first_name AS "Full Name"