当我尝试从数据库中检查值时出现PHP错误消息

时间:2019-06-24 16:23:28

标签: php html oop

我是OOP PHP的新手,所以,上周我在寻找一个简单的教程,以进入这个新世界,我从Codecourse(Codecourse OOP PHP Login/Register System)找到了一个不错的教程,但是在第14个视频中,我遇到无法解决或找不到问题的错误,有人可以帮我吗?

这是错误:

  

致命错误:未捕获错误:在D:\ Rafael \ xampp \ htdocs \ sywork \ classes \ Validate.php:37中的bool上调用成员函数count()堆栈跟踪:#0 D:\ Rafael \ xampp \ htdocs \ sywork \ register.php(9):Validate-> check(Array,Array)#1 {main}放在第37行的D:\ Rafael \ xampp \ htdocs \ sywork \ classes \ Validate.php中

这是我的代码的链接:My Code

这是完整代码的链接(不是我的):Complete Code

这是我不断出错的档案:

<?php
class Validate{
private $_passed = false,
        $_errors = array(),
        $_db = null;

public function __construct(){
  $this->_db = DB::getInstance();
}

public function check($source, $items = array()){
  foreach($items as $item => $rules){
    foreach($rules as $rule => $rule_value){
      $value = trim($source[$item]);
      $item = escape($item);
      if($rule === 'required' && empty($value)){
        $this->addError("{$item} is required");
      } else if(!empty($value)){
        switch($rule){
          case 'min':
            if(strlen($value) < $rule_value){
              $this->addError("{$item} must be at minimum of {$rule_value} characters.");
            }
          break;
          case 'max':
          if(strlen($value) > $rule_value){
            $this->addError("{$item} must be at minimum of {$rule_value} characters.");
          }
          break;
          case 'matches':
            if($value != $source[$rule_value]){
              $this->addError("{$rule_value} must match {$item}.");
            }
          break;
          case 'unique':
            $check = $this->_db->get($rule_value, array($item, '=', $value));
            if($check->count()){
              $this->addError("{$item} already exists.");
            }
          break;
        }
      }
    }
  }
  if(empty($this->_errors)){
    $this->_passed = true;
  }

  return $this;
}

private function addError($error){
  $this->_errors[] = $error;
}

public function errors(){
  return $this->_errors;
}

public function passed(){
  return $this->_passed;
}
}
?>

另一个:

    <?php
  include_once 'core/init.php';
  if(Input::exists()){
    if(Token::check(Input::get('token'))){
      $validate = new Validate();
      $validation = $validate->check($_POST, array(
        'username' => array(
          //Mínimo e máximo de acordo com o banco de dados
          'required' => true,
          'min' => 2,
          'max' => 32,
          'unique' => 'users' //único na tabela users
        ),
        'password' => array(
          'required' => true,
          'min' => 2,
          'max' => 32
        ),
        'password_again' => array(
          'required' => true,
          'matches' => 'password'
        ),
        'name' => array(
          'required' => true,
          'min' => 2,
          'max' => 64
        )
      ));
      if($validation->passed()){
        $user = new User();
        echo $salt = Hash::salt(32);
        die();
        try{
          $user->create(array(
            'username' => '',
            'password' => '',
            'salt' => '',
            'name' => '',
            'joined' => '',
            'group' => ''
          ));
        } catch(Exception $e){
          die($e->getMessage());
        }
      } else{
        foreach($validation->errors() as $error){
          echo "{$error}<br>";
        }
      }
    }
  }
?>

<form method="post" action="">
  <input type="hidden" name="token" value="<?= Token::generate(); ?>">
  <div class="field">
    <label for="username">Username: </label>
    <input type="text" name="username" id="username" value="<?= escape(Input::get('username')); ?>">
  </div>
  <div class="field">
    <label for="password">Password: </label>
    <input type="password" name="password" id="password">
  </div>
  <div class="field">
    <label for="password_again">Enter Your Password Again: </label>
    <input type="password" name="password_again" id="password_again">
  </div>
  <div class="field">
    <label for="name">Name: </label>
    <input type="text" name="name" id="name" value="<?= escape(Input::get('name')); ?>">
  </div>
  <div class="field">
    <input type="submit" value="Register">
  </div>
</form>

1 个答案:

答案 0 :(得分:0)

Validate.php的第36行上,您将调用数据库处理类。该调用返回false作为错误指示。无需检查false的值,就可以检查计数(->count()),这就是发生错误的地方。

查看您的代码,我认为错误发生在SQL中,或者可能在数据库连接级别,例如表或列名拼写错误。

检查错误,至少出于调试目的是一件好事。因此,更改此代码段(Validate.php中的第36-39行):

$check = $this->_db->get($rule_value, array($item, '=', $value));
if($check->count()){
    $this->addError("{$item} already exists.");
}

对此:

$check = $this->_db->get($rule_value, array($item, '=', $value));
if (!$check) {
    $this->addError("Database error.");
} elseif ($check->count()){
    $this->addError("{$item} already exists.");
}

至少会以形式将错误显示为适当的文本,而不是运行时错误消息或HTTP 500错误。

但是,此错误检查对您没有多大帮助,但应检查每个可能发生错误的地方。为了使添加这些众多检查变得更加容易,发明了一些例外,但是我认为在您学习过程的这一阶段,现在就早点介绍这个主题了。

不过,异常可能对您有用,因为当前代码仅隐藏所有错误详细信息,而这对调试应用程序无济于事。

DB.php中有以下代码段:

try{
    $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db') , Config::get('mysql/username'),Config::get('mysql/password'));
} catch(PDOException $e){
    die($e->getMessage());
}

您可以在最上面的一行中添加此行,以确保不会引起任何错误:

$this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

因此,最终版本如下:

try{
    $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db') , Config::get('mysql/username'),Config::get('mysql/password'));
    $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die($e->getMessage());
}

这将帮助您查看查询到底出了什么问题。

由于我没有您的SQL,因此无法查看您的情况到底有什么问题。但是通过上面提到的更改,我可以看到该应用在尝试与数据库对话时失败,这意味着其余的都可以正常工作。