【问题标题】:Non-static method PDO::quote() cannot be called statically,非静态方法 PDO::quote() 不能被静态调用,
【发布时间】:2016-09-02 17:48:42
【问题描述】:

$username = $_POST['username']; 
$password = $_POST['password'];


 $db = new PDO('mysql:host='.$DB_HOST.';dbname='.$DB_DATABASE.'', ''.$DB_USER.'', ''.$DB_PASSWORD.'');

$query = $db->query("SELECT * FROM login_details WHERE username=:username AND password=:password");
$query->bindValue(':username', $username, PDO::PARAM_STR);
$query->bindValue(':password', $password, PDO::PARAM_STR);
$query->execute();
$row_count = $query->rowCount();

尝试从数据库中进行简单的用户名和密码检查.. 我已经超出了沮丧的程度......

【问题讨论】:

  • 您的问题标题和您的实际问题不同。
  • 顺便说一句,您的标题和错误屏幕截图说明了两种不同的情况。
  • 你使用的是query,而你应该使用prepare
  • 并且根据这个非静态方法 PDO::quote() 不能被静态调用...,看来quote() 是一个实例方法,你试图从类本身调用它。先创建一个对象,然后调用它的方法quote()
  • @JonStirling 因为您指出了评论本身中的错误,因此我随后发表了评论,以防 OP 发现它有用。 :-)

标签: php mysql pdo passwords


【解决方案1】:

改用准备。

$username = $_POST['username']; 
$password = $_POST['password'];

$db = new PDO('mysql:host='.$DB_HOST.';dbname='.$DB_DATABASE.'', ''.$DB_USER.'', ''.$DB_PASSWORD.'');

$query = "SELECT * FROM login_details WHERE username=:username AND password=:password";
$statement = $db->prepare($query);
$statement->bindValue(':username', $username, PDO::PARAM_STR);
$statement->bindValue(':password', $password, PDO::PARAM_STR);


$statement->execute();
$row_count = $statement->rowCount();

echo $row_count;

更多信息here

【讨论】:

    【解决方案2】:

    用下面的代码检查一下...

    $stmt = $db->prepare("SELECT * FROM login WHERE username=:username AND password=:password");
        $stmt->bindValue(":username", $username, PDO::PARAM_STR);
        $stmt->bindValue(":password", $password, PDO::PARAM_STR);
        $stmt->execute();
    

    for pdo $stmt 通过 $db->prepare("sql") 而不是查询来支持。然后你可以将参数绑定到准备好的语句并执行它。

    【讨论】:

      【解决方案3】:

      如果您在 Google 上搜索标题中的错误,这是第一个结果,以下是解决 PDO::quote() 问题的方法。

      如果您有一个 PDO 实例/连接正在运行,只需连接到它。

      //PDO::quote();
      $pdo->quote();
      

      如果您正在使用数据库,您应该在文件顶部设置连接,所以这应该不是问题。

      如果您在没有 PDO 连接的情况下需要类似的功能,可以使用以下功能。

      function escape($value) {
          $search =  ["\\",   "\x00", "\n",  "\r",  "'",  '"', "\x1a"];
          $replace = ["\\\\", "\\0",  "\\n", "\\r", "\'", '\"', "\\Z"];
      
          return str_replace($search, $replace, $value);
      } 
      

      您也可以使用类似的方法,但您需要使用 htmlspecialchars_decode() 来撤消,具体取决于您的用例:

      function escape($value) {
          return strip_tags(htmlspecialchars($value));
      }
      

      或者只是混合搭配两者。虽然这可能会产生一些意想不到的结果,因为会有重叠。

      【讨论】:

        猜你喜欢
        • 2023-02-22
        • 1970-01-01
        • 2015-07-03
        • 2014-09-08
        • 2013-03-20
        • 2011-03-02
        • 1970-01-01
        • 2023-01-16
        相关资源
        最近更新 更多