无法在课外调用PDO中的函数

时间:2016-09-15 07:08:44

标签: php html forms pdo login

我想使用PDO在php中创建一个登录页面,我创建了这个包含登录功能登录的类。

<? 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>

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

<?php
class Call
{
  public  function call()
    {
        $var=Utente::login();
        return $var;
    }
}
?>

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

2 个答案:

答案 0 :(得分:3)

你不是一个阶级而是一个职能。类的使用方式不同。

Editor > Embed In > Navigation Controller

然后你必须这样使用它

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

但它可能对你来说太复杂了,所以你最好忘记一段时间的课程并坚持使用

答案 1 :(得分:0)

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

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

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

关于你上一个剧本/班级。你在哪里用它?另请注意,login()方法不会返回任何内容,因此$var将为空。

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