PHP:使用数据库中的 foreign 将用户表提取到 Auth 表 [已关闭]

PHP: Fetch users table to Auth table using foreign from the database [closed]

提问人:Klinton A 提问时间:11/4/2023 最后编辑:James ZKlinton A 更新时间:11/4/2023 访问量:41

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

15天前关闭。

我尝试获取用户数据并从数据库中获取到 Auth 数据库表数据。这整件事发生在RDBMS。在这种情况下,我遇到了一些错误。

当我编写此代码时,我遇到了一些错误,但我无法解决该错误

法典

<?php
require_once "Database.class.php";

class User
{ 
  private $conn;
  public function __call($name,$arguments){
    if(substr($name, 0, 3)== "get"){
      return $this->__get($property);
    }esleif(substr($name, 0, 3)== "set"){
      return $this->__set($name,$arguments[0]);
    }
  }

  public function __call($name, $arguments)
  {
    //$name="getFirstName";    //ForChecking Purpose
    $property = preg_replace("/[^0-9a-zA-Z]/","",substr($name,3));
    $property = strtolower(preg_replace('/\B([A-Z])/','_$1',$property));
    //echo $property; //ForChecking Purpose

  if(substr($name,0,3)== "get"){
    return $this->__get($property);
  }elseif(substr($name, 0, 3) == "set"){
    return $this->__set($name,$arguments[0]);
  }
  }


  public static function signup($user, $pass, $email, $phone)
  {
    $option = [
      'cost' => 8,
    ];
    $pass = password_hash($pass, PASSWORD_BCRYPT, $option);
    $conn = Database::getConnection();
    $sql = "INSERT INTO `Auth` (`username`, `password`, `email`, `phone`, `blocked`, `active`)
    VALUES ('$user', '$pass', '$email', '$phone', '0', '1');";
    $error = false;
    if ($conn->query($sql) === true) {
      $error = false;
    } else {
      // echo "Error:" . $sql . "<br>" . $conn->error;
      $error =  $conn->error;
    }
    //$conn->close();
    return $error;
  }

  public static function login($user, $pass)
  {
    $query = "SELECT * FROM `Auth` WHERE `username` = '$user'";
    $conn = Database::getConnection();
    $result = $conn->query($query);
    if ($result->num_rows == 1) {
      $row = $result->fetch_assoc();
      if (password_verify($pass, $row['password'])) {
        return new User($row['username']);
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

  public function __construct($username)
  {
    $this->conn = Database::getConnection();
    $this->username = $username;
    $sql = "SELECT `id` FROM `Auth` WHERE `username`='$username' LIMIT 1";
    $result = $this->conn->query($sql);
    if($result->num_rows){
      $row = $result->fetch_assoc();
      $this->id = $row['id']; //updating from the database
    }else{
    throw new Exception("Username doesn't exist");
  }

  //this function helps to set the data from the database
  private static function __set($var, $data)
  {
    if (!$this->conn) {
      $this->conn = Database::getConnection();
    }
    $sql = "UPDATE `users` SET `$var`='$data' WHERE `id` = '$this->id';";
    if ($this->conn->query($sql)) {
      return true;
    } else {
      return false;
    }
  }

  
  //this function helps to retrieve data from the database
  private function __get($var)
  {
    if (!$this->conn) {
      $this->conn = Database::getConnection();
    }
    $sql = "SELECT `$var` FROM `users` WHERE `id` = '$this->id'";
    $result = $this->conn->query($sql);
    if ($result->num_rows()) {
      return $result->fetch_assoc()["$var"];
    } else {
      return null;
    } 
  }

  public function authenticate()
  {
  }
}

错误信息

This Picture shows what's that error

但是不明白错误是什么,错误是提到大括号的。

PHP 错误处理 mysqli

评论

0赞 Professor Abronsius 11/4/2023
您似乎没有过多注意对上一个问题的评论,也没有实施基本的错别字更正。错误消息非常清楚 - 如果您搜索并计算大括号,您会发现有 27 个左大括号和 26 个大括号
0赞 Klinton A 11/4/2023
谢谢你告诉我,我站在哪个阶段可以专注于我的代码。

答:

0赞 Paul Allsopp 11/4/2023 #1

tl;dr 你有一个被错误拼写为 esleif 的 elseif。

这里有许多错误:

您有 2 种__call方法。

您正在定义一个调用 __get 和 __set 的 __call 方法,它们是神奇的函数......所以你根本不需要__call方法。

在第一个__call方法中,使用了名为 $property 的属性,但该属性不存在。

由于您拼错了 elseif,因此代码需要一个函数名称 esleif,然后会丢弃所有匹配的 { 和 }

还有更多...

我强烈建议您参加PHP编程课程,而不仅仅是从其他站点复制/粘贴,它们因不正确而臭名昭著。

HTH型

0赞 Ken Lee 11/4/2023 #2

您没有正确关闭__construct功能: (即缺少右大括号)

请更改

public function __construct($username)
  {
    $this->conn = Database::getConnection();
    $this->username = $username;
    $sql = "SELECT `id` FROM `Auth` WHERE `username`='$username' LIMIT 1";
    $result = $this->conn->query($sql);
    if($result->num_rows){
      $row = $result->fetch_assoc();
      $this->id = $row['id']; //updating from the database
    }else{
    throw new Exception("Username doesn't exist");
  }

public function __construct($username)
  {
    $this->conn = Database::getConnection();
    $this->username = $username;
    $sql = "SELECT `id` FROM `Auth` WHERE `username`='$username' LIMIT 1";
    $result = $this->conn->query($sql);
    if($result->num_rows){
      $row = $result->fetch_assoc();
      $this->id = $row['id']; //updating from the database
    }else{
    throw new Exception("Username doesn't exist");
  }
}

还有一个错别字“esleif”。(请正确复习班级中的所有代码)

最后但并非最不重要的一点是,请将您的查询语句更改为参数化的预准备语句,这些语句可以抵御 SQL 注入。