Php Postgres查询中引号中的变量

Php Postgres查询中引号中的变量,php,postgresql,quotes,Php,Postgresql,Quotes,这可能是一个愚蠢的问题,但我在谷歌上搜索了一天中大部分时间的答案,结果一无所获。我正试图让下面的代码正常工作,但找不到任何关于如何在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' ")

这可能是一个愚蠢的问题,但我在谷歌上搜索了一天中大部分时间的答案,结果一无所获。我正试图让下面的代码正常工作,但找不到任何关于如何在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));
如果我用一个值对语句进行硬编码,它可以正常工作,但前提是我包含单引号。我已经尝试了几乎所有我能找到的方法来转义单引号或将引号附加到字符串中,但我能得到的只是解析错误

我遗漏了什么显而易见的东西


编辑:更改代码段以澄清我获取的变量不包含引号。尝试添加引号的任何方法都会失败。

您应该使用准备好的语句。这将解决您的报价问题,并消除SQL注入的主要风险。试着这样做:

$stmt = $conn->prepare("SELECT Members FROM programs WHERE programID = ?");
$stmt->bind_param("s", $foo);

$foo = "5555";
$stmt->execute();

你应该使用事先准备好的语句。这将解决您的报价问题,并消除SQL注入的主要风险。试着这样做:

$stmt = $conn->prepare("SELECT Members FROM programs WHERE programID = ?");
$stmt->bind_param("s", $foo);

$foo = "5555";
$stmt->execute();

让我们学习一个完整的例子。假设您从设置名称
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数据库对象抽象层
PDO
,而不是使用传统的
pg
函数。 在这种情况下(忽略您案例中可能需要的选项):


让我们学习一个完整的例子。假设您从设置名称
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数据库对象抽象层
PDO
,而不是使用传统的
pg
函数。 在这种情况下(忽略您案例中可能需要的选项):


如果我错了,请纠正我,但我认为我已经在使用一个事先准备好的语句。我应该改变方法吗?@AdamAndrews:AFAIK您使用的是一个准备好的语句,因为它似乎是PostgreSQL C API的一个非常薄的包装,这也意味着您没有注入问题。不是PHP的人,但我猜PHP会尝试在双引号字符串中插入
$1
占位符(因此Dario的单引号),而
'$1'
在SQL中是字符串文字,而
$1
是编号占位符(因此Dario的
$1
),如果我错了,请纠正我,但我想我已经在使用一份事先准备好的声明了。我应该改变方法吗?@AdamAndrews:AFAIK您使用的是一个准备好的语句,因为它似乎是PostgreSQL C API的一个非常薄的包装,这也意味着您没有注入问题。不是一个PHP的家伙,但我猜PHP会尝试在双引号字符串中插入
$1
占位符(因此Dario的单引号),而
'$1'
在SQL中是字符串文字,而
$1
是一个编号占位符(因此Dario的
$1
)。关于为什么要使用
$1
而不是SQL字符串中错误的
'$1'
的额外解释可能会有所帮助,并可能有助于避开不了解
pg\u query\u参数
工作原理的人。只是一个小建议。在您的示例中,foo的值已经有引号了。我的函数使用GET并绘制一个不带引号的$foo值。因此,我认为我需要重新表述我的问题,即如何正确地在值周围添加引号。我试图将其转换为字符串并附加单引号,但似乎不起作用。@AdamAndrews我已经大大扩展了我的答案。我希望现在一切都清楚了。关于为什么要使用
$1
而不是SQL字符串中错误的
'$1'
的额外解释可能会有所帮助,并可能有助于避开那些不了解
pg_query_params
工作原理的人。只是一个小建议。在您的示例中,foo的值已经有引号了。我的函数使用GET并绘制一个不带引号的$foo值。因此,我认为我需要重新表述我的问题,即如何正确地在值周围添加引号。我试图将其转换为字符串并附加单引号,但似乎不起作用。@AdamAndrews我已经大大扩展了我的答案。我希望现在一切都清楚了。