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
答案 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
子句中添加任意表达式,以及DEFAULT
或NEW
等关键字。您不能将它们作为查询参数传递。
如果有可以传递的“特殊”客户端值,我会非常喜欢它,魔术常量被解释为像DEFAULT
这样的关键字。但是,它不会那样工作; DEFAULT
关键字在解析/计划时解释,而不是参数绑定时间。
此外,您必须在gen_salt
- 'md5'
中引用哈希类型,而不仅仅是md5
。
最后 - crypt
不是用于散列密码的可接受方式。