2

こんにちは、コードに問題があります。__construct() で Fatal error: Call to a member function prepare() on a non-object が発生していますが、それがなくても私のコードは機能しています。

class Animals{

public $db_fields;

 public function __construct(){
  $this->db_fields = $this->get_fields();

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


 public function get_fields(){
  global $dbh;

  $q = $dbh->prepare("DESCRIBE animals");
  $q->execute();
  $db_fields = $q->fetchAll(PDO::FETCH_COLUMN);

  return $db_fields;
 }
}
$f = new Animals();

/*** 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);
/*** echo a message saying we have connected ***/
echo 'Connected to database <br />';

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

フィールド(animal_id、animal_type、animal_name)を同じように機能させたいだけです

public $animal_id;
public $animal_type;
public $animal_name;
4

1 に答える 1

0

を作成した後Animalsにオブジェクトをインスタンス化する必要があります。そうしないと、関数で定義されません。$dbhget_fields()

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

$dbhそうは言っても、より良い設計は、依存性注入を使用して、次のようにオブジェクトをクラスに送信することです。

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

したがって、更新されたクラスは次のようになります。

class Animals{

    private $dbh;

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

    public function get_fields(){
        $q = $this->dbh->prepare("DESCRIBE animals");
    }
}

利益?変数を取り除きglobalます。通常、グローバル変数を要求することは設計が悪いため、回避したいと考えています。発生している問題に基づいて理由を確認できます-機能するには、グローバル状態を設定する必要があります。

于 2012-11-18T04:50:35.780 に答える