嗨,我正试图将页面中的值发布到MySQL数据库中,但密码字段必须通过encrypt命令加密。
到目前为止,我有这个-
$sql="INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`)
VALUES
('$_POST[userid]', encrypt(".$_POST['passwd']."),'$_POST[uid]','$_POST[gid]','$_POST[homedir]','$_POST[shell]','$_POST[count]','$_POST[accessed]','$_POST[modified]')";
脚本连接到DB fine,但输出为"错误:字段列表中的未知列'test34'"
谢谢。
此语句:
encrypt(".$_POST['passwd'].")
该值周围没有任何引号,因此mysql将其作为列名。例如,如果您的密码是test123,那么查询的这一部分看起来像:
encrypt(test123)
而你真正需要的是
encrypt('test123')
所以,你可以通过添加单引号来解决这个问题
$sql="INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`)
VALUES
('$_POST[userid]', encrypt('".$_POST['passwd']."'),'$_POST[uid]','$_POST[gid]','$_POST[homedir]','$_POST[shell]','$_POST[count]','$_POST[accessed]','$_POST[modified]')"
然而,在这段代码中还有更大的问题。您无法转义这些值,因此请打开SQL注入。想想如果你的密码包含一个引号会发生什么,比如test'123:
encode('test'123')
这显然是一个语法错误。事实上,它允许任何人通过在$_POST中创建特殊参数来执行任意SQL表达式。
所以,您真正应该做的是要么转义您放入查询的所有内容,要么使用带有占位符的PDO。例如,查看本教程http://www.phpeveryday.com/articles/PDO-Positional-and-Named-Placeholders-P551.html