Fatal error: Uncaught Error: "...." on bool Hibaüzenetet dob

Fatal error: Uncaught Error: "...." on bool Hibaüzenetet dob
2021-01-27T19:35:57+01:00
2021-01-28T09:44:52+01:00
2022-12-06T17:15:40+01:00
Lyna260
OOP & PDO
A regisztrációkor azt kellene elérni hogy ne legyen két azonos username -el felhasználó, de ez a hibaüzenet jelenik meg:
"Fatal error: Uncaught Error: Call to a member function count() on bool in C:\xampp\htdocs\sitename\classes\Validate.php:45 Stack trace: #0 C:\xampp\htdocs\sitename\register.php(10): Validate->check(Array, Array) #1 {main} thrown in C:\xampp\htdocs\sitename\classes\Validate.php on line 45"
 Tutorialról tanulom, neki erre a megoldásra nincs hiba.

validate.php
(felhasználó regisztrálásának ellenőrzése)

public function check($source, $items = array()){ foreach($items as $item => $rules){ foreach ($rules as $rule => $rule_value){ //echo "{$item} {$rule} kell lennie {$rule_value}<br>"; $value = $source[$item]; $item = escape($item); if($rule === 'required' && empty($value)){ $this->addError("Kötelező kitölteni: {$item}"); } else if(!empty($value)) { switch($rule){ case 'min': if(strlen($value) < $rule_value){ $this->addError("{$item} minimum {$rule_value} karaktert kell tartalmaznia!"); //$this->addError("{$item} minimum {$rule_value} karaktert kell tartalmaznia."); } break; case 'max': if(strlen($value) > $rule_value){ $this->addError("{$item} maximum {$rule_value} karaktert tartalmazhat!"); //$this->addError("{$item} minimum {$rule_value} karaktert kell tartalmaznia."); } break; case 'matches': if($value != $source[$rule_value]){ $this->addError("{$rule_value} egyeznie kell vele {$item}"); } break; case 'unique': $check = $this->_db->get($rule_value, array($item, '=', $value)); if ( $check -> count()) { //Erre a sorra kapom a hibás üzenetet! $this->addError("{$item} felhasználó már létezik."); } break; } } //echo $value; } }
db.php ( count() ) function definiálása:

class DB { private static $_instance = null; private $_pdo, $_query, $_error = false, $_results, $_count = 0; public function count(){ return $this->_count; }
register.php az űrlap és a tömbök(arrays):
if(Input::exists()){ //echo $_POST['username']; $validate = new Validate(); $validation = $validate->check($_POST, array( 'username' => array( 'required' => true,//STACK TRACE (ez a 10. sor) 'min' => 2, 'max' => 20, 'unique' => 'users' ), 'password' => array( 'required' => true, 'min' => 6 ), 'passwordConfirm' => array( 'required' => true, 'matches' => 'password' ), 'name' => array( 'required' => true, 'min' => 4, 'max' => 50 ) )); if($validation->passed()){ //regisztrálás echo "Sikerült."; } else { //nem sikerül regisztrálni print_r($validation->errors()); } }


?>
Mutasd a teljes hozzászólást!
Van egy elírásod a DB osztály action metódusban. Nézd vissza a videót és hasonlítsd össze a kódot
Mutasd a teljes hozzászólást!

  • A hibát kicsit előbb kell keresni, valószínűleg itt:

    $this->_db->get(...
    Ez a get függvény bool-lal tér vissza a hibaüzenet szerint.
    Mutasd a teljes hozzászólást!
  • ugyanaz amit írtál  " $this->_db->get(. . . . ); " //bemásoltam az elejét, nem tűnt el a hiba

    $check = $this->_db->get($rule_value, array($item, '=', $value)); if ( $check -> count()) { $this->addError("{$item} már létezik."); }

    function

    public function count(){ return $this->_count; }
    Mutasd a teljes hozzászólást!
  • Nem érted...
    A $this->_db objektum get függvénye logikai (igaz/hamis) értékkel tér vissza valami miatt, ennek az okát kellene kideríteni, mert jól látszik, hogy te valami objektum visszatérési értékre számítasz tőle!

    A logikai (bool) változónak (jelen esetben: $check) pedig sosem lesz count() függvénye, amit aztán meghívhatnál...
    Mutasd a teljes hozzászólást!
  • elméleti részét tanulom, legalábbis próbálom érteni, a bool(true/false) nagyjából ismerem, de nem igaz hamissal kellene visszatérnie ha a felhasználó létezik vagy sem(?), ha létezik akkor true értékkel kellene visszatérni akkor nem engedi regisztrálni


    Ezt találtam amiben a _db van:

    private $_passed = false, $_errors = array(), $_db = null; public function __construct(){ $this->_db = DB::getInstance(); } -------------------------------------- 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')); //echo 'Kapcsolat'; } catch(PDOException $e) { die($e->getMessage()); } } public static function getInstance(){ if(!isset(self::$_instance)){ self::$_instance = new DB(); } return self::$_instance; }
    Mutasd a teljes hozzászólást!
  • Elég fáradt vagyok, de harmadszor is leírom: get

    Tehát azt a get függvényt kellene előguberálni, majd megnézni, hogy mit csinál, és hogy mivel kellene visszatérnie, mert vagy valami hiba történik benne, vagy egyszerűen nem úgy működik, ahogy elképzelted!
    Mutasd a teljes hozzászólást!
  • ahh megvan:

    class Input { public static function exists($type = 'post'){ switch($type){ case 'post': return (!empty($_POST)) ? true : false; break; case 'get': return (!empty($_GET)) ? true : false; break; default: return false; break; } } //GET public static function get($item){ if(isset($_POST[$item])){ return $_POST[$item]; }else if(isset($_GET[$item])){ return $_GET[$item]; } return ''; } }
    Mutasd a teljes hozzászólást!
  • Nem ez lesz az... valahol a DB osztályban kellene lennie!
    Mutasd a teljes hozzászólást!
  • db classban lévő get:

    public function get($table, $where){ return $this->action('SELECT *', $table, $where); }
    Mutasd a teljes hozzászólást!
  • Nagyszerű, akkor a következő az action függvény, mert ez adja vissza bool-t
    Félve kérdezem meg:
    - a mysql adatbázis (a megfelelő táblákkal) megvan?
    - a kapcsolódás sikeres?
    Mutasd a teljes hozzászólást!
  • Igen ott minden megvan, felvétel is működik update is a táblára - csak a tábláról lekérdezés nem sikerül

    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 = "SELECT * FROM users WHERE username = 'Alex'"; $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; if($this->query($sql, array($value))->error()){ return $this; } } } return false; }
    Mutasd a teljes hozzászólást!
  • Na akkor ennek az elején ellenőrizd (debug, echo, var_dump), hogy mik jöttek be paraméterül!

    Elméletileg akkor fog logikai hamissal (false) visszatérni, ha:
    - a $where tömb nem három elemű, vagy
    - a $where[1] (ami ugye az operátor) nem jó (=,>,<,>=,<= lehet csak)

    Én viszont most kiszállok sorry
    Mutasd a teljes hozzászólást!
  • Van egy elírásod a DB osztály action metódusban. Nézd vissza a videót és hasonlítsd össze a kódot
    Mutasd a teljes hozzászólást!
  • A reggeli kv után már én is látom
    Mutasd a teljes hozzászólást!
  • Nem találom hol van elírás videóról sem, már vagy 40 perce keresem,
    de ha erre gondoltok hogy nincs ! jel, vagy 3 zárójel van nyitva kicsit zavaró de annyi is van bezárva, próbáltam így is: - továbbra sem működik - csatoltam képet hogy van a videóban :D
    if(!$this-&gt;query($sql, array($value)))-&gt;error()) //value után 3. zárójel if(!$this-&gt;query($sql, array($value))-&gt;error())) //error után 3. zárójel //Mindkettő syntax hiba 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))->error()) { return $this; } } } return false; }
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • ha erre gondoltok hogy nincs ! jel

    Én pontosan erre gondoltam.
    A program eljut eddig a pontig?
    Az action függvény bejövő paramétereit ellenőrizted?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd