不能在类外调用 PDO 中的函数

Posted

技术标签:

【中文标题】不能在类外调用 PDO 中的函数【英文标题】:Can't call a function in PDO outside the class 【发布时间】:2017-01-23 02:47:48 【问题描述】:

我想使用 PDO 在 php 中创建一个登录页面,并且我创建了这个类,其中包括用于登录的函数 login。

<? php

class Utente 

  private $db;


  function __construct($conn) 
    $this - > db = $conn;
  


  public static
  function login($nome_utente, $password) 



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

    if ($nome_utente == '') 
      echo "Fill the name";
    

    try 

      $stmt = $this - > db - > prepare("SELECT * FROM utente WHERE nome_utente = :nome_utente AND password=:password");
      $stmt - > execute();
      $utenteRow = $stmt - > fetch(PDO::FETCH_NUM);

      if ($utenteRow > 0) 

        echo "You are logged in";

       else echo "The username doesnt match with the password!";


     catch (PDOException $e) 
      echo $e - > getMessage();
    

  
?>

<!-- begin snippet: js hide: false console: true babel: false -->
<form action="" method="POST">
  Name
  <input type="text" name="nome_utente" />PAS
  <input type="text" name="password" />
  <input type="submit" name="submit" value="login" />
</form>

现在我想调用这个函数来查看登录结果。我在另一个php文件中创建这个新类来调用它:

<?php
class Call

  public  function call()
    
        $var=Utente::login();
        return $var;
    

?>

问题是当我使用类调用执行 secon 文件时,我看到一个空白页。我做错了什么吗?有人可以告诉我如何以正确的方式登录用户吗?谢谢!

【问题讨论】:

尝试将- &gt; 更改为-&gt;,那里没有空格。 【参考方案1】:

你创建的不是一个类,而是一个函数。类的使用方式不同。

class Utente 

  private $db;

  function __construct($conn) 
    $this->db = $conn;
  

  public function login($nome_utente, $password)
  
      $stmt = $this->db->prepare("SELECT * FROM utente WHERE nome_utente = ?");
      $stmt->execute([$nome_utente]);
      $row = $stmt->fetch();
      if ($row && password_verify($password, $row['password']) 
        return $row;
      
  

那你就得这样用

$utente = new Utente($db);
$var = $utente->login($_POST['nome_utente'], $_POST['password']);
if (!$var) 
    echo "The username doesnt match with the password!";

但这对你来说可能太复杂了,所以你最好暂时忘记类并坚持使用函数

【讨论】:

嗯,OP 的代码有很多错误,但这可能是需要修复的第一件事...... @YourCommonSense +1 @YourCommonSense 密码验证功能在哪里? @Doee 你可以查看其他答案中的链接 @YourCommonSense 好的,谢谢。 utente 类的对象:$utente = new Utente($db);我必须在另一个类中创建吗?【参考方案2】:

主要问题是您没有存储状态:登录脚本完成后,没有设置/更改任何内容,因此在下一个请求时服务器不知道有登录用户。

成功登录后,您应该将状态存储在例如session 变量中。然后,您可以在启动脚本时检查是否设置了该会话变量以及值是什么。

除此之外,您永远不应该存储纯文本密码,例如参见How can I store my users' passwords safely?

关于你的最后一个脚本/课程。你在哪里使用它?另请注意,login() 方法不返回任何内容,因此$var 将为空。

编辑:顺便说一句,您应该在调用 Utente::login() 方法时向它发送 2 个参数,或者从方法定义中删除这些参数,因为无论如何您都不使用它们。

【讨论】:

以上是关于不能在类外调用 PDO 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

在类外创建函数,然后使用类的实例化对象进行调用

在类外创建函数,然后使用类的实例化对象进行调用

类中的@staticmethod

类的属性类的方法类的内置方法

C++模板类中的成员函数以及模板函数在类外定义的方式

C++中static函数类外定义的时候为啥不写static?