在postgres数据库中使用php选择带有Ampersand的字符串

时间:2014-12-07 19:05:52

标签: php database postgresql ampersand

我正在从学校开展一个小组项目,需要从带有php的Postgres数据库中进行选择。 我在psql dbms上测试了我的查询,然后在php界面中尝试了它们。这是我的测试查询: SELECT m.movieid, m.tomatourl FROM movies m WHERE title = 'Beowulf & Grendel'; 查询确实从我需要的数据库中返回信息,但是在php中使用它时它什么都不返回。 pg_last_error()什么也没说。

以什么方式可以确保我可以在其中选择带&符号的标题? 我已经尝试分离字符串并将它们与sql代码重新组合在一起:  SELECT m.movieid, m.tomatourl FROM movies m WHERE title = 'Beowulf '||chr(38)||' Grendel' 我试过逃避字符串 这是我的一些PHP代码的例子:

$query = 'SELECT m.movieid, m.tomatourl FROM movies m WHERE title = $1';
pg_prepare($conn, "getmovie", $query) or die(pg_last_error());
$result = pg_execute($conn, "getmovie", $i) or die("Query failed: ". pg_last_error());
$movie = pg_fetch_array($result, NULL, PGSQL_BOTH);

只要$i数组中的字符串中没有&符号,这就可以正常工作。 我只是将数据库更改为没有&符号,但我实际上无法控制它。 有没有办法使用php postgres函数做这样的select语句?

1 个答案:

答案 0 :(得分:2)

问题似乎是由传入sql的字符串周围的引号引起的,方法是将字符串直接传递给预准备语句,就像这样"Beowulf & Grendel" 什么时候必须像'Beowulf & Grendel'一样传递给数据库 它似乎即使它没有直接在字符串打印输出中显示在var_dump()中 实际上是将它作为SELECT m.movieid, m.tomatourl FROM movies m WHERE title = 'Beowulf & Grendel';发送它唯一能让它消失的是var_dump中的字符数,而不是字符串的打印输出。对此的解决方法是对传入的标题执行html_entity_decode()

特别感谢DarkBee和Daniel Verite帮助解决这个问题。