• 1399/11/13

Fatal error Call to a member function prepare() on null :

با سلام

من دارم پروژه را از اول مرور می کنم و چند تغییر مختصر دادم

4 تا فایل دیتابیس, ساخت جدول, ادمین و index.php را ساختم

بجای شروع از category

با کلاس Auth شروع کردم

این کلاس هم ساختم و فایل login , register هم ساختم

یه یوزر بطوردستی اضافه کردم ادمین

حالا وقتی می خواهم رجیستر یا لاگین کنم

آین خطا رو میده

Fatal error: Call to a member function prepare() on null in C:\Program Files (x86)\Ampps\www\Review\Dashboard\DB.php on line 39

در واقع داره به کوئری من ایراد وارد میکنه

دقیقا به خطی که با ستاره مشخص کردم ایراد میگیره

    public function select($sql,$values=null)
    {
        try{
            //display * table
            if($values==null){
                return $result=$this->conn->query($sql);
            }
            // display special table
            else{
    
               * $stmt=$this->conn->prepare($sql);
         
                $result=$stmt->execute($values);
                return $result;
            }
        }
        catch(PDOException $e){
            echo "There is wrong in select method in Database <br>". $e->getMessage();
            return false;
        }
    }

مقدار sql$ ورودی آن

C:\Program Files (x86)\Ampps\www\Review\Dashboard\DB.php:37:string 'SELECT * FROM `users` WHERE `email`=?;' (length=38)

مقدار values$ ورودی

C:\Program Files (x86)\Ampps\www\Review\Dashboard\DB.php:37:string 'massih.eydavi@gmail.com' (length=23)

دیتابیس را چک کردم وصل میشه

مشکل میتونه کجا باشه؟

  • 1399/11/13
  • ساعت 11:25

کوئری داخل کلاس Auth

   $user = $db->select("SELECT * FROM `users` WHERE `email`=?;", [$request['email']])->fetch();

  • 1399/11/13
  • ساعت 11:29

با سلام خدمت شما همراه عزیز

 

نمیشه حدس زد ولی هر‌بخشی که مربوط میشه به کوئری select باید چک کنید خطای سینتکسی میتونه باشه


  • 1399/11/13
  • ساعت 12:12

بله حق با شماست

حدس من اینه نمی تونم به دیتابیس وصل بشم بخاطر همین کوئری خطا میده

آیا این شکل تعریف دیتابیس درست است؟

<?php
namespace DataBase;
use PDO;
use PDOException;

//define constant
define('DB_HOST','localhost');
define('DB_NAME','blog');
define('DB_USER','root');
define('DB_PASSWORD','mysql');
class DataBase{
    // private $option =[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION , PDO::ATTR_DEFAULT_FETCH_MODE=>  PDO::FETCH_ASSOC , PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"];
    //connect to database
    function __construct()
        {
          try{
               $conn=new PDO("mysql:host=".DB_HOST ."; dbname=".DB_NAME,
                  DB_USER,
                    DB_PASSWORD,
                    $this->option);
 
                  }
          catch(PDOException $e){
       echo  'There is Error for Connecting to Database ....!!! <br>'. $e->getMessage();
                    }
            }
    // operation CRUD        
    public function select($sql,$values=null)
    {
        try{
            //display * table
            if($values==null){
                return $result=$this->conn->query($sql);
            }
            // display special table
            else{

                $stmt=$this->conn->prepare($sql);
                var_dump($stmt);
                die;
                $result=$stmt->execute($values);
                return $result;
            }
        }
        catch(PDOException $e){
            echo "There is wrong in select method in Database <br>". $e->getMessage();
            return false;
        }
    }
            
    public function insert($tableName,$fields,$values)
    {
        try{
            $stmt=$this->conn->prepare("INSERT INTO `".$tableName."`(".implode(',',$fields).", `created_at`)VALUES (:".implode(',:',$fields).", now();");
            $stmt->execute(array_combine($fields,$values));
            return true;

        }
        catch(PDOException $e){
            echo "There is wrong in Insert method in Database <br> ".$e->getMessage();
            return false;
        }
    } 
    
    public function update($tableName,$id,$fields,$values)
    {
        $sql="UPDATE `".$tableName."`SET";
        foreach(array_combine($fields,$values) as $field=>$value){

            if($value){
                $sql.="`".$field."`=?";
            }
            else{
                $sql.="`".$field."`= NULL";
            }
        }
        $sql.=", `updated_at` =now() WHERE `id`=?";
        
        try{
            $stmt=$this->conn->prepare($sql);
            $stmt->execute(array_merge(array_filter(array_values($values)),[$id]));
            return true;
        }
        catch(PDOException $e){
            echo "There is wrong in Update method in Database <br>".$e->getMessage();
            return false;

        }
    }

    public function delete($tableName,$id)
    {
        $sql="DELETE FROM `".$tableName."` WHERE `id`=?;";
        try{
            $stmt=$this->conn->prepare($sql);
            $stmt->execute($id);
            return true;
        }
        catch(PDOException $e){
            echo "There is wrong in Delete method in Database <br> ".$e->getMessage();
            return false;
        }

    }
}

?>

  • 1399/11/13
  • ساعت 12:13

اگر‌‌به دیتابیس وصل نشید خب میوفته توی 

catch

و خطارو نشون میده


  • 1399/11/13
  • ساعت 14:50

کلا برای خودم یه کلاس مجزا تعذیف کردم خواستم وصل بشم به دیتابیس و اطلاعات رو بگیرم

<?php
namespace DataBase;
use PDO;
use PDOException;
class DataBase{
    private $connection;
    private $option = array(PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
    private $dbHost= "localhost";
    private $dbName= "blog";
    private $dbUsername="root";
    private $dbPassword = "mysql";

    function __construct()
    {
        try{
            $this->connection = new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName,$this->dbUsername,
                $this->dbPassword,$this->option);
        }
        catch (PDOException $e){
            echo "<div style='color:red;'> There is some problem in connection :</div>". $e->getMessage();
        }

    }
        }
        $db=new DataBase();
        $db=$conn->query("SELECT * FROM `users` WHERE `email`='massih.eydavi@gmail.com' ;");

وقتی فراخوانی میکنم دقیقا همون خطای بالا رو میده

Fatal error Call to a member function prepare() on null

ولی وقتی مستقیم تو phpmyadmin این کوئری را میزنم دقیقا جوابو برمی گردونه

SELECT * FROM `users` WHERE `email`='massih.eydavi@gmail.com'

 


  • 1399/11/13
  • ساعت 15:13

از نوع private تعریف نکنید


  • 1399/11/13
  • ساعت 17:35

نکته خوبی بود گفتید

ممنون

ولی تاثیر نداشت

همون خطا پابرجاست


  • 1399/11/13
  • ساعت 17:36

دقیقا همون کدهایی که ما در دوره ‌پیشرفته زدیم رو بزنید


  • 1399/11/14
  • ساعت 06:59

بله با این کدها مشکل رفع شد

 

ممنون


  • 1399/11/14
  • ساعت 11:10

سلامت باشید


logo-enamadlogo-samandehi