抱歉,我认为这个问题有很多,但我仍然没有得到这个问题的解决方案,所以请解决我的脚本:( 抱歉,我的英语不好。
<?php
class Validate{
private $_passed = false,
$_error = 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 a minimum of {$rule_value} characters.");
}
break;
case 'max':
if (strlen($value) > $rule_value) {
$this->addError("{$item} must be a maximum of {$rule_value} characters.");
}
break;
case 'matches':
if($value != $source[$rule_value]){
$this->addError("{$rule_value} mus match {$item}");
}
break;
case 'unique':
$check = $this->_db->get($rule_value, array($item,'=',$value));
if($check->count()){
$this->addError("{$item} alredy exist.");
}
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;
}
}
多数民众赞成是我的班级验证。
和我的DB类
<?php
class DB {
private static $_instance = null;
private $_pdo,
$_query,
$_error = false,
$_results,
$_count = 0;
private function __construct() {
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());
}
}
public static function getInstance() {
if(!isset(self::$_instance)) {
self::$_instance = new DB();
}
return self::$_instance;
}
public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)){
$x = 1;
if (count($params)) {
foreach ($params as $param) {
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()){
$this->_results = $this->_query->fetchALL(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else {
$this->_error = true;
}
}
return $this;
}
public function action($action, $table , $where = array()){
if(count($where) ===3 ){
$operators = array('=','<','>','>=','<=');
$field = $where[0];
$operator = $where[1];
$value = $where[2];
if(in_array($operator, $operators)){
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
if(!$this->query($sql, array($value))){
return $this;
}
}
}
return false;
}
public function get($table, $where){
return $this->action('SELECT *', $table, $where);
}
public function delete($table, $where){
return $this->action('DELETE *', $table, $where);
}
public function insert($table, $fields = array()){
$keys = array_keys($fields);
$values = '';
$x = 1;
foreach($fields as $field){
$values .= '?';
if($x < count($fields)){
$values .= ', ';
}
$x++;
}
$sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES({$values})";
if(!$this->query($sql, $fields)->error()){
return true;
}
return false;
}
public function update($table, $id, $fields){
$set = '';
$x = 1;
foreach ($fields as $name => $value) {
$set .= "{$name} = ?";
if($x < count($fields)){
$set .= ',';
}
$x++;
}
die($set);
$sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";
}
public function results(){
return $this->_results;
}
public function first(){
return $this->results()[0];
}
public function error(){
return $this->_error;
}
public function count(){
return $this->_count;
}
}
答案 0 :(得分:0)
你没有检查返回值$check
,你假设它是一个对象而且显然不是。
case 'unique':
$check = $this->_db->get($rule_value, array($item,'=',$value));
if($check->count()){
$this->addError("{$item} alredy exist.");
}
break;
始终检查返回值...特别是如果您要立即调用它们的方法......
答案 1 :(得分:0)
感谢你的回答乔,我得到了解决方案。在我编辑之前
case 'unique':
$check = $this->_db->get($rule_value, array($item,'=',$value));
if($check->count()){
$this->addError("{$item} alredy exist");
}
break;
编辑后结束
case 'unique':
$check = DB::getInstance();
$check->get($rule_value, array($item,'=',$value));
if($check->count()){
$this->addError("{$item} alredy exist");
}
break;
谢谢:)