我有一个php脚本,它返回一些带有特殊字符的值,特别是单引号(')和'at符号'(@)。包含这些字符的值不会插入到数据库中。我在mysql数据库上看到了一个帖子(http://stackoverflow.com/questions/2584066/php-how-to-insert-special-characters-into-a-database)。 我的问题是如何在Postgresql数据库中完成。
见下面的php代码:
<?php
require 'table.php';
// Opens a connection to a PostgresSQL server
$connection = pg_connect("dbname=postgis user=postgres password=local");
// Execute query
foreach ($xml->item as $entry){
$georss = $entry->children($namespaces['georss']);
list($lat, $lng) = explode(' ', (string)$georss->point);
$query = "INSERT INTO geognews(title, link, author, latitude, longitude) VALUES ('" . $entry->title . "', '" . $entry->link . "', '" . $entry->children($namespaces['dc'])->creator . "', '" . $lat . "', '" . $lng . "')";
$result = pg_query($query);
printf ("These values are inserted into the database - %s %s %s", $entry->title, $entry->link, $entry->children($namespaces['dc'])->creator, $lat, $lng);
}
pg_close();
?>
答案 0 :(得分:2)
使用pg_query_params(),这是避免SQL注入的最简单方法。因此引用'和其他有风险的东西。
答案 1 :(得分:1)
您有以下几种选择:
您可以包装动态数据pg_escape_string()
(以及其他类型的相关函数)以正确编码特殊字符。这将需要对您发布的代码进行最少量的更改。
您可以使用预准备语句并将动态数据绑定为参数。有关如何执行此操作的示例,请参阅pg_prepare()
的文档。准备好的陈述是recommended way to protect against SQL Injection。
您可以将PDO与参数化查询结合使用。这为您提供了参数化查询和通用数据库抽象层的安全性和性能优势。
最后一个选项是首选。