2016-09-30 6 views
0

これはおそらく絶対的な質問ではありません。私はPDOに慣れていないので、投稿されている他のソリューションを理解できません。 私がしようとしているのは、データベース内のfetchallによって返されたクエリの結果を表示することです。PDOからの結果を表示

データベースクラスのインスタンスを作成するインデックスページを設定し、 FetchAllを呼び出してレコードを返します。

$db = new database($pdo); 
$sql = 'SELECT * FROM fruit'; 
$rows = $db->getData($sql); 
$count = $db->getCount($sql); 
echo $count; 
print_r($rows); 
foreach($rows as $fruit){ 
     echo $fruit->'fruitName'; 
} 

コードのすべての実行され、$行の配列は、データを取得した結果が取り込まれ、そしてカウントが正確である8の結果を持っていますが、私は出力できませんforeachのと結果!

データベースクラスは、参考のためにここにある:

class database 
{ 
    function __construct($pdo) 
    { 
     $this->pdo = $pdo; 
    } 
    function getData($sql) 
    { 
     $query = $this->pdo->prepare($sql); 
     $query->execute(); 
     return $query->fetchAll(); 
    } 
    function getCount($sql) 
    { 
     $query = $this->pdo->prepare($sql); 
     $query->execute(); 
     return $query->rowCount(); 
    } 
} 
+1

これは何ですか: 'print_r($ rows);'出力? –

+1

あなたの 'database'クラスは本当に純粋な' PDO'より価値のあるものを追加しません。実際には、 'database'クラスで書かれているので、同じクエリで行数とデータの両方を取得できないので、完全に不必要に2回クエリを実行しています。それを取り除き、 'PDO'を直接使用してください。 – deceze

+0

'print_r'はこのような配列を与えていました([0] => Array([fruid] => 1 [0] => 1 [fruitName] => apple [1] => apple [color] => green [2] => green'。コードの非効率性を知ることができます。実際にはcountメソッドを追加して、正しいデータを取得しているかどうかを再確認することができました。 –

答えて

0

あなたが$fruit->'fruitName'をエコーし​​ようとしているすべてのエラーを持っている場合は、$fruit['fruitName']のように、配列でアクセスしてみてください。これがPDOのfetchAll()メソッドが結果を返す方法です。

fetchAll()メソッドの最初のパラメータとしてPDO::FETCH_CLASSを渡し、2番目のパラメータとしてクラス名を渡すことで、オブジェクトの配列を指定することもできます。

はこちらをご覧ください:http://php.net/manual/fr/pdostatement.fetchall.php

・ホープ、このことができます!

+0

YES!フルーツ - > 'フルーツ名' '、私は '$フルーツ' 'フルーツ名' ''が必要でした。正直なところ、私は可能なすべての構文の組み合わせを試みたと思った!ありがとう –

+0

あなたのご質問は、あなたが探していたものであればありがとう。ありがとう。 –

0
  1. データベースクラスは意味をなさない。 のため、準備されたステートメントはすべてで使用されていないため、何も理由なく同じクエリを2回実行するためです。
  2. PDOのデフォルトフェッチモードはFETCH_BOTHです。これはオブジェクトを与えません。
  3. PHPのクラスプロパティは引用符なしで扱われます。

だからあなたのコードこのよう

class database 
{ 
    function __construct() 
    { 
     $host = '127.0.0.1'; 
     $db = 'test'; 
     $user = 'root'; 
     $pass = ''; 
     $charset = 'utf8'; 

     $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; 
     $opt = [ 
      PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
      PDO::ATTR_EMULATE_PREPARES => false, 
     ]; 
     $this->pdo = new PDO($dsn, $user, $pass, $opt); 
    } 
    function query($sql, $data = NULL) 
    { 
     $query = $this->pdo->prepare($sql); 
     $query->execute($data); 
     return $query; 
    } 
} 

$db = new database(); 
$sql = 'SELECT * FROM fruit'; 
$rows = $db->query($sql)->fetchAll(); 
$count = count($rows); 
echo $count; 
print_r($rows); 
foreach($rows as $fruit){ 
     echo $fruit->fruitName; 
} 

を作る最近、私はあなたが読む価値を見つけることの記事、Your first database wrapper's childhood diseasesを、書きました。

+0

ありがとう、私はちょっとこの後に行くだろう。 '$ data = NULL'という行は、' $ data'がデフォルトで 'NULL'パラメータの配列を含めることができますか? –

+0

@DavidJohnはい、正確です。プレースホルダがない場合は省略することができ、yoの場合はパラメータを含む配列を送信できますあなたの質問にプレースホルダーがあります。それは非常に便利です。 –