这可能是一个愚蠢的问题,但我一直在谷歌搜索一天中的大部分答案,无法到达任何地方。我试图让以下一些代码工作,但无法找到任何有关如何正确格式化PHP中准备好的Postgres请求的帮助。
$foo = $_GET[bar];
echo $foo; // 5555
//what I'm trying to do:
pg_prepare($dbconn,"table_query","SELECT Members FROM programs WHERE programID = '$1' ");
pg_execute($dbconn,"table_query", array($foo));
如果我用一个值对语句进行硬编码,它可以正常工作,但前提是我包含单引号。我已经尝试了几乎所有我可以找到的方法来逃避单引号或将引号附加到字符串,但我能得到的只是解析错误。
我错过了什么完全显而易见的事情?
修改:更改了代码段,以澄清我所获得的变量不包含引号。我试图添加引号的任何方法都失败了。
答案 0 :(得分:2)
让我们研究一个完整的例子。假设您从设置名称pid
的GET查询中获取了值。从您的示例查询中我希望该值是整数的十进制表示,不同于零。它是一个字符串,因为其他任何东西都不能来自GET查询。
$pid = $_GET['pid'];
// This is _very_ important.
// Anything that comes from outside must be validated or sanitized.
// FILTER_VALIDATE_INT refuses "0" too (correct if needed).
if (filter_var($pid, FILTER_VALIDATE_INT) === false) {
// Deal with invalid input
}
$result = pg_query_params($dbconn,
'SELECT Members FROM programs WHERE programID = $1',
array($pid)
);
pg_query_params
将$1
与$pid
绑定并正确引用,而您不能在语句周围使用双引号,因为PHP会错误地展开$1
。没有必要手动在$pid
周围加上引号,因为pg_query_params
负责处理这个问题。此外,PostgreSQL接受一个带引号但没有引号的整数值,因此在这种情况下,用引号弄乱是没有意义的。
您可以使用PHP数据库对象抽象层pg_
,而不是使用传统的PDO
函数。
在这种情况下(忽略您所需的可能选项):
$dsn = 'pgsql:host='. $host .';port=5432;dbname='. $database;
$dbh = new PDO($dsn, $user, $password);
$dbh->prepare('SELECT Members FROM programs WHERE programID = ?');
$result = $dbh->execute(array($pid)); // $pid as before
答案 1 :(得分:0)
你应该使用准备好的陈述。这应解决您的引用问题,并消除SQL注入的主要风险。尝试这样的事情:
$stmt = $conn->prepare("SELECT Members FROM programs WHERE programID = ?");
$stmt->bind_param("s", $foo);
$foo = "5555";
$stmt->execute();