2014-07-13 108 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

我在等待更新,然后 –

相关问题