Проблеми с OOP не връща true

Jorko

Registered
Значи здравейте тука си млатя главата с орехи нямам си и аз друга работа проблема е че класа принципно трябва да ми върне успешно до колкото мисля а той не връща нищо обаче ако си има някаква грешка си я връща а ся да видим кой ще помогне и ако е грозен кода не се чудете :D :oops:

PHP:
<?php
	class MySql{
		private $host;
		private $user;
		private $pass;
		private $db;
		
		public function __construct($set_host, $set_user, $set_pass, $set_db){
			$this->host = $set_host;
			$this->user = $set_user;
			$this->pass = $set_pass;
			$this->db = $set_db;
			
			mysql_connect($this->host,$this->user,$this->pass) or die("Немога да се свържа");
			mysql_select_db($this->db) or die("Немога да намеря Базата с данни");
			mysql_query("SET NAMES 'UTF8'");
			return true;
		}
	}
	Class Users{
		public $username;
		public $password;
		public $email;
		public $user_id;
		
		public function __construct() {}
		
		private function _doQuery($query){
			return mysql_query($query);
		}
			
		public function userAdd($set_user,$set_password,$set_email){
			$this->username = trim(htmlspecialchars(addslashes($set_user)));
			$this->password = htmlspecialchars(addslashes($set_password));
			$this->email = trim(htmlspecialchars(addslashes($set_email)));
			
			$this->_checkErrors($this->username, 1, 5, 40, 1);
			$this->_checkErrors($this->username, 1, 5, 40, 1);
			$this->_checkErrors($this->email, 3, 5, 40, 1);
			
			if($this->_checkErrors == true){
			echo "Успешно";
			}
			
		}
		
		private function _checkErrors($var,$type,$minlenght,$maxlenght,$required){
			if($type == 0){
				if(!is_numeric($var)){
					echo "".$var." не е число";
					return false;
				}
			}
			if($type == 1){
				if(!preg_match("/^[A-Za-z0-9_]+$/",$var)){
					echo "".$var." може да съдържа само букви, цифри и _";
					return false;
				}
			}
			if($type == 2){
				if(!preg_match("/^[A-Za-z]+$/", $var)){
					echo "".$var." може да съдържа само букви";
				}
			}
			if($type == 3){
				if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/", $var)){
					echo "".$var." не е валиден email";
					return false;
				}
			}
			if($required == 1){
				if(empty($var)){
					echo "".$var." е задължително поле";
					return false;
				}
			}
			if(mb_strlen($var) < $minlenght){
				echo "".$var." трябва да бъде по дълго от ".$minlenght."";
				return false;
			}
			if(mb_strlen($var) > $maxlenght){
				echo "".$var." не трябва да бъде по дълго от ".$maxlenght."";
				return false;
			}
			return true;
		}
	
	}
	
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
    <title>{$admintitle} - {$title}</title>
	<meta name="robots" content="NOINDEX,NOFOLLOW" />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<link rel="stylesheet" href="css/style.css" type="text/css" />
  </head>
  <body>
	<?php 
		$con = new MySql("localhost","root","","sunshop");
		$newUser = new Users;
		$newUser->userAdd("bogat", "grozen", "afg@abv.bg");
		
	?>
  </body>
  </html>

EDIT: Мисля че разбрах от къде е проблема и че съм царвул щото структурата ми е грешна все пак ако имате други предложения пишете ;)

EDIT 2:Оправих го и стая структура по следния начин if(!$this->_checkErrors)
 
Промела ти идва тук : от 45 до 48 ред. Нямаш таква променлива.
1) След като изпълниш проверката, тази инфорамция която връща не се прихваща от никъде.
Окей, кода се изпълнява, изписва съобщение ако не валидно. Но ако е валидно , това true се обезсмиля.
Тябва да я прихванеш.
2) Имаш такъв метод, на който се опитваш да използваш като променлива.А такава не си създал. Трябва да бъде създадена, след това да я ползваш.
Аз бих го направил така.
PHP:
    private $checkErrorsVars = array();

    private function _doQuery($query) {
        return mysql_query($query);
    }

    public function userAdd($set_user, $set_password, $set_email) {
        $this->username = trim(htmlspecialchars(addslashes($set_user)));
        $this->password = htmlspecialchars(addslashes($set_password));
        $this->email = trim(htmlspecialchars(addslashes($set_email)));

        $this->checkErrorsVars[$this->username] = $this->_checkErrors($this->username, 1, 5, 40, 1);
        $this->checkErrorsVars[$this->username] = $this->_checkErrors($this->username, 1, 5, 40, 1);
        $this->checkErrorsVars[$this->email] = $this->_checkErrors($this->email, 3, 5, 40, 1);
        
        $passValidation = 0;
        foreach ($this->checkErrorsVars as $chErrsVar)
        {
            if($chErrsVar == false)
                continue;
            else
                $passValidation++;
        }
        
        if($passValidation == count($this->checkErrorsVars))
        {
            Echo "Uspeshno ";
        }
    }
 
Искам да попитам и още нещи казаха ми че не било добре да ползвам echo в самия метод или клас вярно или невярно?
 
По твоят начин и аз смятам ,че не е добра идея. Има моменти когато се налага.Но в този случай не е добра идея.
Имаш опция ,да записваш грешките в масив или да изхвърляш изключение когато става нещо нередно.За момента продължай така, след като научиш онаследяванията започни с exception. Тъй като той действа малко по-различно.
 
Използвай return в следните случай :
1 ) Когато искаш да получиш някакъв отговор от метода
2 ) За да спреш даден метод да се изпълнява при невалидна проверка примерно.
Конструктора се изпълнява, прави каквото прави , но не връща нищо.
Бях забравил да го кажа.
Също не е нужно да пишеш :
public __construct() {} . Пропускай го пре-спокойно.
 
Един съвет и от мен ползвай " Сингълтон ".
Когато имаш oject който се отнася за дб-то забранявай инстанция на класа или може да го правиш abstract
http://en.wikipedia.org/wiki/Singleton_pattern.
 
macmen каза:
Един съвет и от мен ползвай " Сингълтон ".
Когато имаш oject който се отнася за дб-то забранявай инстанция на класа или може да го правиш abstract
http://en.wikipedia.org/wiki/Singleton_pattern.
И 1 абстрактен клас с какво би му помогнал ?
 
ако разбираш какво е abstract ще знаеш, че не трябва да имаш инстанция към connect към db-to.
 
даже си намерих и готов клас на singelton...

ето го и него
PHP:
<?php
class myDBH {
  private $db_info = array("host" => "localhost", "dbname" => "myDB", "username" => "myDB_user", "password" => "myDB_password");
  private $dbh;

  public static $instance = NULL;

  public function __construct(array $db_info = null) {
    if(isset($db_info)) {
      foreach($db_info as $key_name => $key_value) {
        if(!in_array($key_name, array("host", "db_name", "username", "password") || empty($key_value))) {
          throw new Exception("Invalid key passed!");
        }
        $this->db_info = $db_info;
      }
    }
    $this->dbh = new PDO("mysql:host={$this->db_info['host']};dbname={$this->db_info['db_name']}", $this->db_info['username'], $this->db_info['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
    $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  }

  public static function getInstance() {
    if(!isset(self::$instance)) {
      self::$instance = new myDBH();
    }
    return self::$instance;
  }

  public function fetch_rows($sql) {
    $rst = $this->dbh->query($sql);
    return $rst->fetchAll();
  }

  public function fetch_row($sql) {
    $rst = $this->dbh->query($sql);
    return $rst->fetch();
  }
}
?>

За да не се превръща темата в спор затварям я като дам точка на Главната страница(index) :D

ако искате може да отворим тема за OOP в която всеки може да изкаже по нещо тъкмо ще е полезна за новаците :?:

ПП: не че съм напреднал де ама...
 
macmen каза:
ако разбираш какво е abstract ще знаеш, че не трябва да имаш инстанция към connect към db-to.
Сега като се замисля, ти искаш да създадеш връзката с базата данни в абстрактен клас и да го имплементираш в обикновен клас ?
Ако е така , честно , не виждам смисъл.Но това , че аз не виждам смисъл, не значи, че няма смисъл :)
Аз бих го направил по следният начин :
PHP:
class dbClass {

///  mysql connection 
}

 class myNonDbClass {

/// code 

   public  function getInstance($object)
{
   if(is_a($object,get_called_class()))
     return $this;
   else 
    return $object;
}// getInstance
}// myNonDbClass
И ако искаш да преместим дискусията в Дъра-Бъра , за да не спамим на човека темата.
http://web-tourist.net/forum/viewtopic.php?p=639280#639280

Ето я и темата :)
 

Back
Горе