php - 通过 PostgreSQL 数据库的 PhP 表单更改用户和密码问题
问题描述
我需要创建一个表单来直接修改pg_shadow表的usename和passwd。
只能使用以下查询进行修改:
ALTER USER oldLogin RENAME TO newLogin;
ALTER USER newLogin WITH ENCRYPTED PASSWORD newPassword;
话虽如此,我写了一个 User.class.php : User(private $_userID; private $_login; private $_password;)
然后在UserManager.class.php中我写了一个:public static function update (User $person)。一旦选择了新的标识符,当单击“修改”时显然会执行此功能。
这是我的功能更新:
public static function update(User $person)
{
$db = DbConnect::getDb();
$q0=$db->prepare('SELECT usename as login FROM pg_shadow u WHERE usesysid = :idUser;');
$q0->bindValue ( ':idUser', $person->getIdUser());
$res0= $q0->execute(); //Query to get the old usename thanks to the id.
$old = $q0->fetch(PDO::FETCH_ASSOC);
$q1 = $db->prepare("ALTER USER :oldLogin RENAME TO :login;");
$q2 = $db->prepare("ALTER USER :login WITH ENCRYPTED PASSWORD :password;");
$q1->bindValue ( ':oldLogin', $old['login']);
$q1->bindValue ( ':login', $person->getLogin());
$q2->bindValue ( ':login', $person->getLogin());
$q2->bindValue ( ':password', $person->getPassword());
$res1 = $q1->execute();
$res2 = $q2->execute();
}
显然,它不起作用......你能帮帮我吗?
好吧,我尝试替换$q1
,只是为了进行简单的测试:
$q1 = $db->prepare("ALTER USER 'user1' RENAME TO 'newUser1';");
//It didn't work
$q1 = $db->prepare("ALTER USER user1 RENAME TO 'newUser1';");
//It didn't work
$q1 = $db->prepare("ALTER USER 'user1' RENAME TO newUser1;");
//It didn't work
$q1 = $db->prepare("ALTER USER user1 RENAME TO newUser1;");
//It work
解决方案
您的问题是您正在尝试对ALTER USER
. 那是行不通的。
您必须构建包含参数值的查询字符串。使用该pg_escape_literal
函数以避免 SQL 注入。
只有最后一个不带参数的语句有效,因为用户名是标识符而不是字符串文字,所以它们应该不加引号或用双引号引起来。
推荐阅读
- python - 使用 /insights edge 的 Instagram Graph API 问题
- spring - 具有由多个线程调用的方法的 Spring 组件
- python - django select_related() 和 django-mptt。如何一次获取所有兄弟姐妹?
- python - 将列格式代码应用于多个数据框
- sql - 如何加入 2 个表并仅保留最新记录
- python - Keras 的损失一度陷入 CNN
- python - 将参数传递给python中的深层嵌套函数
- php - 路由中的可选参数取决于参数位置
- apache-spark - 将 Spark 数据帧合并到现有的 ACID 事务 Hive 表中?
- firebase - Firestore 通配符变量不起作用