web-dev-qa-db-fra.com

Comment récupérer tout dans le tableau assoc à partir d'une instruction préparée?

J'essaie ce code:

    if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $result->execute();
        while ($data = $result->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

mais il lance l'erreur suivante

[Ven 15 juin 12:13:11 2012] [erreur] [client 127.0.0.1] PHP Erreur fatale: appel à la méthode non définie mysqli_stmt :: fetch_assoc () dans [monfichier.php]

Et j'ai aussi essayé:

if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $rows = $result->execute();
        while ($data = $rows->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

cela fait ceci:

[Ven Jun 15 12:22:59 2012] [erreur] [client 127.0.0.1] PHP Erreur fatale: appel à une fonction membre fetch_assoc () sur un non-objet dans [monfichier. php]

Que puis-je faire d'autre pour obtenir un résultat ou ce que je fais mal? J'ai besoin du tableau assoc de DB ressemblant à $data[0]["id"] = 1

14
AquaVita

En fait, vous pouvez faire cela assez facilement, vous ne pouvez pas le faire avec l'objet mysqli_stmt , vous devez extraire le sous-jacent mysqli_result , vous pouvez le faire en appelant simplement mysqli_stmt::get_result() . Remarque: cela nécessite l'extension mysqlnd (MySQL Native Driver) qui n'est pas toujours disponible.

Cependant, le point ci-dessous sur la recommandation de PDO sur MySQLi est toujours valable, et c'est un excellent exemple de pourquoi: l'API MySQLi userland n'a aucun sens. Il m'a fallu plusieurs années de travail intermittent avec MySQLi pour découvrir le mécanisme décrit ci-dessus. Maintenant, j'admets que séparer les concepts de l'instruction et de l'ensemble de résultats est logique, mais dans ce cas, pourquoi une instruction a-t-elle une méthode fetch()? Matière à réflexion (si vous êtes toujours assis sur la clôture entre MySQLi et PDO).

Pour être complet, voici un exemple de code basé (vaguement) sur le code d'origine dans la question:

// Create a statement
$query = "
    SELECT *
    FROM `mytable`
    WHERE `rows1` = ?
";
$stmt = $this->mysqli->prepare($query);

// Bind params and execute
$stmt->bind_param("i", $id);

// Extract result set and loop rows
$result = $stmt->get_result();
while ($data = $result->fetch_assoc())
{
    $statistic[] = $data;
}

// Proof that it's working
echo "<pre>";
var_dump($statistic);
echo "</pre>";
23
DaveRandom

Tu peux faire:

$conn = mysqli_connect('Host','username','password','database')
$query = 'select * from tablename';
$result = $conn->query($query);
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);

$data Contient tous les résultats dans un tableau d'association.

* Il convient de noter que cette fonction mysqli_fetch_all() fonctionne uniquement avec le package mysqlnd. http://php.net/manual/en/mysqli-result.fetch-all.php

7
manojadams