1

我在 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 个字段正在更新。

怎么回事听。感谢帮助!

4

2 回答 2

5

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

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

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

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

你应该这样做:

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

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

于 2012-04-19T21:20:17.810 回答
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'

于 2012-04-19T21:17:13.500 回答