1

1つのフィールド「id」を持つ単純なテーブルがあり、このコードを実行すると...

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);

$sql = 'SELECT * FROM logolist';
$q = $dbh->query($sql);
while($r = $q->fetch()){ print_r($r); }

...私はこの出力を取得します:

Array
(
    [ID] => 2
    [0] => 2
)
Array
(
    [ID] => 4
    [0] => 4
)

ご覧のとおり、「ID」フィールドの下に[0]があります。さらにフィールドを追加すると、配列内にさらに多くの要素が追加され続けます。すべてのフィールドがその値を2回出力しているようなものです。

どうしてこれなの?

4

5 に答える 5

4

fetch()これは、属性がない場合は正常です(FETCH_BOTHデフォルトで設定されています)。古いように機能mysql_fetch_array()0、数値インデックスです。

連想に切り替えると、次のフィールドのみが表示されます。

while($r = $q->fetch(PDO::FETCH_ASSOC)){
    print_r($r);
}

PDOStatement::fetch-すべてのスタイル用。

于 2012-10-02T13:52:54.933 に答える
1

数値と連想の両方をフェッチしています。

PDOのドキュメントを確認してください。

http://php.net/manual/en/pdostatement.fetch.php

(PDO :: FETCH_BOTH(デフォルト)を使用しています)

于 2012-10-02T13:52:05.737 に答える
1
  while($r = $q->fetch(PDO::FETCH_ASSOC)){ print_r($r); }

PDO::FETCH_ASSOC数値インデックスなしで、関連キーを使用して値を取得するだけです。

于 2012-10-02T13:53:55.097 に答える
1

fetch数値的で連想配列を与える

http://www.php.net/manual/en/pdostatement.fetch.php

FETCH_ASSOC連想配列の取得にのみ使用できます

于 2012-10-02T13:56:10.277 に答える
1

MySQLの結果をフェッチするためのループがあるというこの慣習に遭遇し、なぜ人々がそれを行うのか疑問に思っているので、この答えを書き留めて、いくつかのことを片付けようとします。

1)結果をフェッチするためにループは必要ありません。2)結果が重複する理由は、連想配列とインデックスベースの配列を受け取っているためです。これがデフォルトの動作です。

あなたができることはこれです:

$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);

// Tell PDO to throw exceptions in case of a query error
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try
{
    $result = $dbh->query("SELECT * FROM logolist")->fetchAll(PDO::FETCH_ASSOC); 

    // Your result is now in $result array which is associative. 
    // If it's empty - no results were found. 
    // In case of an error, you'd go to catch block of the code and you'd echo out an error. 
}
catch(PDOException $e)
{
    echo "Error reported: ". $e->getMessage();
}
于 2012-10-02T13:56:15.927 に答える