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