web-dev-qa-db-fra.com

PDO fetchAll tableau à une dimension

cela peut être une question simple, mais j'ai du mal à comprendre comment la résoudre. J'ai un formulaire qui permet à l'utilisateur de sélectionner soit "personnalisé" ou "tout" le personnel "à affecter à un emploi.

Si personnalisé est sélectionné, l'utilisateur sélectionne le personnel en cliquant sur chaque case à cocher, je les insère ensuite dans un tableau des travaux. Cela produit le tableau ci-dessous (3, 1, 10 sont les ID du personnel)

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

Si "tout le personnel" est sélectionné, je demande d'abord une instruction select pour obtenir tous les ID de personnel de la table des employés, puis je les insère dans la table de travail de la même manière que ci-dessus. Cependant, cela produit le tableau:

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
        )
)

Comment puis-je convertir le tableau ci-dessus dans le premier tableau affiché?

J'utilise le code ci-dessous pour interroger la base de données pour obtenir tous les ID de personnel, puis les insérer.

    $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();              

}

Le premier tableau insère bien, cependant le dernier tableau insère des zéros pour le staffID.

Aucune suggestion?

Merci =).

43
Elliott

Jetez un oeil à exemple 2 dans le manuel. Dans votre première requête, vous pouvez utiliser:

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

Et votre deuxième tableau aura la même forme que le premier tableau.

97
jeroen

Si vous print_r($staff[$i]) à l'intérieur du for vous obtiendrez probablement

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

ce qui signifie que vous devez utiliser $staff[$i]['staffID'] à la place.


L'autre alternative, qui devrait fonctionner avec votre code actuel, consiste à utiliser PDOStatement::fetchColumn() au lieu de fetchAll().

3
chelmertz

Vous devez donner à fetchAll un style fetch

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

De ce lien

2
Steve Mallory