pg_query_params插入默认值或使用函数时出错

时间:2014-02-02 08:54:07

标签: php postgresql

pg_query_params似乎没有按预期工作:

这有效:

INSERT INTO users (username,password,secretcode) VALUES 'test',crypt(:password,gen_salt(md5)), 'DEFAULT'

secretcode字段具有默认生成值

这不起作用:

pg_query_params($Db, 'INSERT INTO users (username,password,secretcode) VALUES ($1, $2, $3)', array ($USR,crypt($PWD,gen_salt(md5)),'DEFAULT');

密码字段包含字符串'crypt($ PWD,gen_salt(md5))'

secretcode字段包含'DEFAULT'字符串

这是正确的行为还是错误?

由于

Dan Perez

1 个答案:

答案 0 :(得分:3)

参数设计以准确发送您编写的文字文本。重点是它们不执行函数或以其他方式解释为SQL语法。

DEFAULT是一个关键字。这不是您提供的内容,而是发送文字 'DEFAULT'

同样,您将文本 crypt($PWD,gen_salt(md5))发送给PostgreSQL。

如果要使用查询插入,可以执行此操作,但必须修改SQL。 E.g。

pg_query_params(
  $Db,
  'INSERT INTO users (username,password,secretcode) VALUES ($1, crypt($2, gen_salt('md5')), DEFAULT)', array ($USR,$PWD)
);

如您所见,您可以在VALUES子句中添加任意表达式,以及DEFAULTNEW等关键字。您不能将它们作为查询参数传递。

如果有可以传递的“特殊”客户端值,我会非常喜欢它,魔术常量被解释为像DEFAULT这样的关键字。但是,它不会那样工作; DEFAULT关键字在解析/计划时解释,而不是参数绑定时间。

此外,您必须在gen_salt - 'md5'中引用哈希类型,而不仅仅是md5

最后 - crypt不是用于散列密码的可接受方式。