更新查询php postgres无缘无故失败

时间:2012-04-19 20:52:53

标签: php postgresql postgresql-8.4

我在PHP中使用这段代码并使用PostgreSQL作为数据库。我从GET获得所有参数。通过打印检查了它们。形成的查询在Postgres终端上执行,但是从PHP脚本失败。

这是一段代码。

<?php

$link = pg_connect("host=localhost dbname=postgres user=postgres password=password") or die('connection failed');

# Building the query
$newq=sprintf("update purchase_info set ....... comments=%s where id=%s",......,$comm,$id);

    print $newq; // This query runs on the postgres terminal
    $query=addslashes($newq); // to escape "" as one of my fields is comments
    $result=pg_query($link,$newq);

    if (!$result) {
        echo "An error occured.\n";
    }
    pg_close($link);
?>

其他查询在同一脚本中运行。此SQL语句有大约14个字段正在更新。

听到了什么问题。 感谢帮助!

2 个答案:

答案 0 :(得分:5)

你不应该使用addslashes引用PostgreSQL的字符串,你应该使用pg_escape_literal

  

pg_escape_literal()转义用于查询PostgreSQL数据库的文字。它返回PostgreSQL格式的转义文字。 pg_escape_literal()在数据前后添加引号。建议使用此功能,而不是pg_escape_string()

您绝不应该使用addslashes来引用数据库的字符串:

  

强烈建议使用DBMS特定的转义函数(例如MySQL mysqli_real_escape_string()或PostgreSQL pg_escape_string()

你应该这样做:

$newq = sprintf("update purchase_info set ... comments=%s where id=%d", ..., pg_escape_literal($comm), $id);

我假设id实际上也是一个数字。

答案 1 :(得分:4)

假设您确实要将参数注入SQL查询,正确的代码将是:

$newq=sprintf("update purchase_info set ... comments='%s' where id='%s'",
   pg_escape_string($comm), pg_escape_string($id));
// DO NOT USE to addslashes, it is not correct
$result=pg_query($link, $newq);

请注意格式字符串中%s周围的单引号。 此外,如果id是一个整数,最好使用%d(无引号)而不是'%s'