通过 PostgreSQL 数据库的 PhP 表单更改用户和密码问题
ALTER USER & PASSWORD problem via a PhP form with PostgreSQL database
我需要创建一个表单来直接修改pg_shadowtable的用户名和密码。
只能使用以下查询进行修改:
ALTER USER oldLogin RENAME TO newLogin;
ALTER USER newLogin WITH ENCRYPTED PASSWORD newPassword;
话虽这么说,我写了一个User.class.php:
用户(私人 $_userID;私人 $_login;私人 $_password;)
然后在UserManager.class.php我写了一个:
public 静态函数更新(用户 $person)。
选择新标识符后,单击 "Modify" 时显然会执行此功能。
这是我的功能更新:
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 注入。
只有最后一个不带参数的语句会起作用,因为用户名是标识符而不是字符串文字,所以它们应该不带引号或用双引号引起来。
好的,
嗯,我找到了如何让它工作,谢谢你们。
这是我所做的修改:
public static function update(User $newPerson)
{
$db = DbConnect::getDb();
$idUser=$newPerson->getIdUser();
$oldPerson=self::getById($idUser);
$oldLogin= pg_escape_string($oldPerson->getLogin());
$newLogin= pg_escape_string($newPerson->getLogin());
$newPassword= pg_escape_string($newPerson->getPassword());
$sql = "ALTER USER {$oldLogin} RENAME TO {$newLogin}; ALTER USER {$newLogin} WITH ENCRYPTED PASSWORD '{$newPassword}';";
pg_query($sql);
}
我需要创建一个表单来直接修改pg_shadowtable的用户名和密码。
只能使用以下查询进行修改:
ALTER USER oldLogin RENAME TO newLogin;
ALTER USER newLogin WITH ENCRYPTED PASSWORD newPassword;
话虽这么说,我写了一个User.class.php: 用户(私人 $_userID;私人 $_login;私人 $_password;)
然后在UserManager.class.php我写了一个: public 静态函数更新(用户 $person)。 选择新标识符后,单击 "Modify" 时显然会执行此功能。
这是我的功能更新:
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 注入。
只有最后一个不带参数的语句会起作用,因为用户名是标识符而不是字符串文字,所以它们应该不带引号或用双引号引起来。
好的,
嗯,我找到了如何让它工作,谢谢你们。
这是我所做的修改:
public static function update(User $newPerson)
{
$db = DbConnect::getDb();
$idUser=$newPerson->getIdUser();
$oldPerson=self::getById($idUser);
$oldLogin= pg_escape_string($oldPerson->getLogin());
$newLogin= pg_escape_string($newPerson->getLogin());
$newPassword= pg_escape_string($newPerson->getPassword());
$sql = "ALTER USER {$oldLogin} RENAME TO {$newLogin}; ALTER USER {$newLogin} WITH ENCRYPTED PASSWORD '{$newPassword}';";
pg_query($sql);
}