【问题标题】:ALTER USER & PASSWORD problem via a PhP form with PostgreSQL database通过 PostgreSQL 数据库的 PhP 表单更改用户和密码问题
【发布时间】:2019-12-31 10:57:08
【问题描述】:

我需要创建一个表单来直接修改pg_shadow表的usename和passwd。

只能通过以下查询进行修改:

ALTER USER oldLogin RENAME TO newLogin;
ALTER USER newLogin WITH ENCRYPTED PASSWORD newPassword;

话虽如此,我写了一个 User.class.php : 用户(私人 $_userID;私人 $_login;私人 $_password;)

然后在 UserManager.class.php 我写了一个: 公共静态函数更新(用户 $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

【问题讨论】:

  • 您在查询中有错字(用户名而不是用户名)。 SELECT username as login FROM pg_shadow u WHERE usesysid = :idUser; 这是故意的还是可能是这个问题?
  • 是的,这是故意的,如您所见:postgresql.org/docs/9.3/view-pg-shadow.html
  • 哦。我知道了。那么,当方法被触发时,你得到的错误是什么?
  • @Etin : 看看我的新帖子...

标签: php postgresql forms rename alter


【解决方案1】:

您的问题是您正在尝试为ALTER USER 使用准备好的语句。那是行不通的。

您必须构建包含参数值的查询字符串。使用pg_escape_literal函数来避免SQL注入。

只有最后一个不带参数的语句会起作用,因为用户名是标识符而不是字符串文字,所以它们应该不加引号或用双引号引起来。

【讨论】:

    【解决方案2】:

    好的,

    嗯,我找到了如何让它工作,谢谢你们。

    这是我所做的修改:

        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);
    
        }
    

    【讨论】:

    • 这样好多了!如果你比我更喜欢这个答案,你可以接受。
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2023-03-11
    • 2014-01-16
    • 2011-05-29
    • 2015-04-02
    • 2011-12-30
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多