web-dev-qa-db-ja.com

PDO fetchAll配列を1次元に

これは簡単な質問かもしれませんが、それを解決する方法を理解するのに苦労しています。ユーザーが「カスタム」または「すべて」のスタッフを選択してジョブに割り当てることができるフォームがあります。

カスタムが選択されている場合、ユーザーは各チェックボックスをクリックしてスタッフを選択し、それらをジョブテーブルに挿入します。これにより、以下の配列が生成されます(3、1、10はスタッフIDです)

Array
(
    [0] => 3
    [1] => 1
    [2] => 10
)

「すべてのスタッフ」が選択されている場合、最初にselectステートメントを照会してすべてのスタッフIDをスタッフテーブルから取得し、次に上記と同じようにジョブテーブルに挿入します。ただし、これにより配列が生成されます。

Array
(
    [0] => Array
        (
            [staffID] => 1
            [0] => 1
        )

    [1] => Array
        (
            [staffID] => 23
            [0] => 23
        )

    [2] => Array
        (
            [staffID] => 26
            [0] => 26
        )

    [3] => Array
        (
            [staffID] => 29
            [0] => 29
        )
)

上記の配列を最初の配列に変換するにはどうすればよいですか?

以下のコードを使用してデータベースにクエリを実行し、すべてのスタッフIDを取得してから挿入します。

    $select = $db->prepare("SELECT staffID FROM staff");
    if($select->execute())
    {
       $staff = $select->fetchAll();
    }

    for($i = 0; $i<count($staff); $i++)
    {
    $staffStmt = $db->prepare("INSERT INTO staffJobs (jobID, userID) VALUES (:jobID, :staffID)");
    $staffStmt->bindParam(':jobID', $jobID, PDO::PARAM_INT);
    $staffStmt->bindParam(':staffID', $staff[$i], PDO::PARAM_INT);

    $staffStmt->execute();              

}

最初の配列は正常に挿入されますが、最後の配列はstaffIDにゼロを挿入します。

助言がありますか?

ありがとう=)。

43
Elliott

マニュアルの 例2 をご覧ください。最初のクエリでは、次を使用できます。

$staff = $select->fetchAll(PDO::FETCH_COLUMN, 0);

そして、2番目の配列は最初の配列と同じ形式になります。

97
jeroen

for内にprint_r($staff[$i])があれば、おそらく

_    Array
    (
        [staffID] => 1
        [0] => 1
    )
_

つまり、代わりに_$staff[$i]['staffID']_を使用する必要があります。


現在のコードで動作する他の選択肢は、PDOStatement::fetchColumn()の代わりに fetchAll() を使用することです。

3
chelmertz

FetchAllにフェッチスタイルを与える必要があります

$staff = $select->fetchAll(PDO::FETCH_NUM);

このリンク から

2
Steve Mallory