2014-07-13 137 views
0
的實例

嘿,大家好我得到這個錯誤:捕錯誤 - 參數必須是PDO

Catchable fatal error: Argument 1 passed to Users::__construct() must be an instance of PDO, none given, called in C:\xampp\htdocs\xampp\ooplogin\register.php on line 46 and defined in C:\xampp\htdocs\xampp\ooplogin\class\Users.php on line 9 

說真正的代碼工作,沒有問題,但你知道,如果我想使乾淨的代碼它shouldbt是有任何錯誤。

我的代碼:

<?php 
class Users { 
    /* Deklarovanie premennych */ 
    public $name = null; 
    public $email = null; 
    public $phone = null; 
    public $message = null; 

    public function __construct(PDO $db_con) 
    { 
     $this->db_con = $db_con; 
    } 

    public function storeFormValues($data) 
    { 
     if(isset($data['name'])) $this->name = stripslashes(strip_tags($data['name'])); 
     if(isset($data['email'])) $this->email = stripslashes(strip_tags($data['email'])); 
     if(isset($data['phone'])) $this->phone = stripslashes(strip_tags($data['phone'])); 
     if(isset($data['message'])) $this->message = stripslashes(strip_tags($data['message'])); 
     return $this; 
    } 

    public function message() 
    { 
     $correct = false; 
     try { 
      $sql = "INSERT INTO user(name, email, phone, message) VALUES (:name, :email, :phone, :message)"; 

      $stmt = $this->db_con->prepare($sql); 
      $stmt->bindValue("name", $this->name, PDO::PARAM_STR); 
      $stmt->bindValue("email", $this->email, PDO::PARAM_STR); 
      $stmt->bindValue("phone", $this->phone, PDO::PARAM_STR); 
      $stmt->bindValue("message", $this->message, PDO::PARAM_STR); 
      $stmt->execute(); 
      return 'Sprava bola uspesne odoslana!'; 
     }catch(PDOException $e) { 
      return $e->getMessage(); 
     } 
    } 

    public function displayAll() 
    { 
     try{ 
      $sql = "SELECT * FROM users LIMIT 10"; 
      $stmt = $this->db_con->prepare($sql); 
      $stmt->execute(); 
      return $this->$stmt;  
     }catch(PDOException $e) { 
      return $e->getMessage(); 
     } 
    }  
} 

try { 
    $db_con = new PDO(DB_HOST, DB_USER, DB_PASS); 
    $db_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db_con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
}catch(PDOException $e) { 
    return $e->getMessage(); 
} 


$Users = new Users($db_con); 
$Users->storeFormValues($_POST); 

echo $Users->message(); 
?> 

而且我的index.php樣子:

<?php if(!(isset($_POST['send']))) { ?> 

HTML FORM HERE 

<?php 
} else { 
    $Users = new Users; 
    $Users->storeFormValues($_POST); 
    if($Users->message()) { 
     echo "Sprava bola úspešne odoslana";  
    } else { 
     echo "Sprava nebola odoslana";  
    } 
} 

?> 

這裏是一個機會,有人可以幫我解決這個問題或解釋爲什麼它不工作?謝謝!

+0

你確定你的'$ db_con'連接正確嗎?當調用'new PDO()'時,你在'catch'中返回了$ e-> getMessage();',但是你可能沒有在任何地方看到這個錯誤。將其更改爲'echo $ e-> getMessage()'並確定它是否連接成功。常量'DB_HOST'的值是多少?這是一個有點懷疑,因爲它的名字_host_,其中PDO需要一個連接字符串,如「mysql:host = localhost; dbname = databasename」作爲其第一個參數。 –

+0

這是我的配置。我正在包括'定義的PHP(「DB_HOST」,「mysql:host = localhost; dbname = test」); define(「DB_USER」,「root」); define(「DB_PASS」,「」); \t define(「CLASS_PATH」,「class」);' 它成功連接,因爲它添加新的數據到數據庫,只是拋出錯誤,而這樣做 –

回答

1

你沒有像傳遞錯誤信息那樣傳遞PDO實例。

$Users = new Users; 

編輯:所有的 首先,不要複製/粘貼代碼,並期望它的工作。我會告訴你該怎麼做,但不會給你任何代碼。

當您在構造函數中使用參數創建一個類(沒有默認值)時,您必須傳遞參數才能使其工作。這就是你得到這個錯誤的原因。我向你展示的是發生錯誤的地方。用戶類需要一個PDO對象,但你什麼都沒有傳過。雖然你在類文件做到了:

$Users = new Users($db_con); 

五言你需要,你還需要爲你在你的類文件做初始化$ db_con變量。

這將解決您的問題。我也有一些建議。

  1. 把你的每個類放在一個單獨的文件中,不要在你的類中執行任何代碼在這些文件中。
  2. 將您的連接($ db_conn初始化)放入一個單獨的文件中,以便您可以在需要時再次調用它。
  3. includerequire功能,以瞭解如何從其他文件中的代碼申請1和2

這些都是很基本的建議。有更復雜但更好的方法來做同樣的事情,比如自動加載和IoC容器。但是當開始編碼時,爲了您的理智,您可以留下這些概念以便後續學習。 :)

+0

yea隊友,但我是編程新我真的不知道它是什麼對我來說意味着什麼,或者我該如何解決它:) –

+0

你在其他頁面做過。爲了清楚起見,我會更新我的答案。 –

+0

我在等待更新,然後 –

相關問題