0

こんにちは、コードで問題が発生しています。以下の私の現在のコードを参照してください。私が達成したいのは、データベース フィールド (id、name、type) をパブリック属性として設定することです。

Ex:
public $id;
public $name;
public $type;

これで私を助けてくれることを願っています。:)

エラー:

Warning: Missing argument 1 for Animals::__construct() in C:\Program Files\xampp\htdocs\pdo_intro\index.php on line 8

Notice: Undefined variable: dbh in C:\Program Files\xampp\htdocs\pdo_intro\index.php on line 10

Fatal error: Call to a member function prepare() on a non-object in C:\Program Files\xampp\htdocs\pdo_intro\index.php on line 20

私の現在のコード

class Animals{

public $db_fields;
private $dbh;

public function __construct($dbh){

$this->dbh = $dbh;

$this->db_fields = $this->get_fields();

foreach($this->db_fields as $field){
$this->$field = "";
}
}

public function get_fields(){
$q = $this->dbh->prepare("DESCRIBE animals");
$q->execute();
$db_fields = $q->fetchAll(PDO::FETCH_COLUMN);

return $db_fields;
}

public function capitalizeType($t){
return ucwords($t);
}
}

/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = 'root';
/*** mysql password ***/
$password = '';
/*** mysql database***/
$dbname = 'animals';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$animal = new Animals($dbh);
/*** echo a message saying we have connected ***/

$sql = "SELECT * FROM animals";
$result = $dbh->query($sql);

while ($r = $result->fetchObject('animals')){
echo $animal->capitalizeType($r->animal_type) . "<br />";
}

$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>

私は __construct($dbh="") を試しましたが、それでもエラーは

Fatal error: Call to a member function prepare() on a non-object in C:\Program Files\xampp\htdocs\pdo_intro\index.php on line 20
4

2 に答える 2

3

あなたの問題はここにあるようです、

$dbh = new PDO("mysql:host=$hostname;dbname=$dbname;charset=utf8", $username, $password);
$animal = new Animals($dbh);

データベース接続が機能していません。ユーザー名とパスワードなどを確認してください。 $dbh がオブジェクトを返さない場合、構成の最初のパラメーターは空になります。デフォルト値を設定しても、コードの残りの部分はに依存するため、修正されません。 value がオブジェクトとして渡され、"" はオブジェクトではありません。

于 2012-11-18T08:45:12.433 に答える
0

ここ:

while ($r = $result->fetchObject('animals')){
    echo $animal->capitalizeType($r->animal_type) . "<br />";
}

クラスにデータをフェッチしてAnimalsいますが、新しいオブジェクトを作成している間、PDO はそのコンストラクターに何も渡しません。

また、プロパティについて心配する必要はありません。存在しない場合は、PDO が作成します。

于 2012-11-18T09:43:42.587 に答える