我在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个字段正在更新。
听到了什么问题。 感谢帮助!
答案 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()
或PostgreSQLpg_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'