mySQLi instruction préparée incapable de get_result()

Je suis totalement confus par mySQLi. Bien que j'ai été en utilisant la procédure mysql appels pour années, je veux me servir à faire des déclarations préparées à l'avance pour la db de sécurité/mySQL injection de la protection qu'il offre. Je suis en train d'écrire une instruction select simple (oui, je sais faire une procédure d'appel pour ce qui offre à l'amélioration de la performance). Lorsque vous exécutez, je reçois tous les échos jusqu'à ce que j'ai touché le $result = $stmt->get_result(); composant. Tout cela semble assez simple pour moi, mais je suis à une perte après des heures de lecture de manuels sur mySQLi. Des idées pourquoi ce serait défectueux?

*note: ceci est un environnement de test et, bien qu'aucune désinfection/échappement de caractères, je ne suis que de passage valide le contenu dans des variables $username et $email. Et aussi, j'ai cherché partout pour trouver la solution à mon problème.

function checkUsernameEmailAvailability($username, $email) {
    //Instantiate mysqli connection
    @$mysqli = new mysqli(C_HOST,C_USER,C_PASS,C_BASE) or die("Failed to connect to MySQL database...");
    if (!$mysqli)
    {
        echo 'Error: Could not connect to database.  Please try again later...';
        exit;
    } else {
        echo 'mysqli created';
    }

    /* Create a prepared statement */   
    if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
        echo '<br />MYSQLi: ';

        /* Bind parameters s - string, b - boolean, i - int, etc */
        $stmt -> bind_param("ss", $username, $email);
        echo '<br />paramsBound...';

        /* Execute it */
        $stmt -> execute();     
        echo '<br />Executed';

        $result = $stmt->get_result();
        echo '<br />Result acquired';

        /* now you can fetch the results into an array - NICE */
        $myrow = $result->fetch_assoc();
        echo '<br />Fetched';


        /* Close statement */
        /$stmt -> close();
        echo '<br />Done mysqli';
    }
}    

Aussi, dois-je pour instancier un mysqli chaque fois que j'appel une fonction? Je suis en supposant qu'ils ne sont pas persistants db se connecte comme dans la procédure de mysql. Oui, j'en suis conscient, c'est un problème de portée, et non je n'ai pas été en mesure de comprendre la portée de cette variable de classe. Quand je l'ai déclaré à l'extérieur de la fonction, il n'était pas disponible quand je suis entré dans la fonction.

Mise à JOUR
si je change la ligne 12 de:

if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {

:

    $stmt = $mysqli->stmt_init();
    if($stmt = $mysqli -> prepare("SELECT username,email FROM tb_users WHERE username=? OR email=?")) {
        if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';

Je reçois Déclaration qui n'est PAS préparé. Maintenant, je suis encore plus confus....

Mise à JOUR:
J'ai contacté mon fournisseur d'hébergement et apparemment mySQLi est pris en charge, et la mysqlnd pilote est présent. Peut-être il ya un moyen de simplement tester cela? Bien que, généralement, ils m'ont donné assez bien informés des réponses dans le passé.

Mise à JOUR...ENCORE une fois: j'ai vérifié mon serveur de capacités de moi-même et de découverte, tout en mysqli et PDO sont présents, mysqlnd est pas. Dès lors, je comprends pourquoi get_result() ne fonctionnera pas (mysqlnd nécessaire je pense), je ne comprends toujours pas pourquoi la déclaration préparée elle-même ne fonctionnera pas.

J'utilise PDO avec des exceptions moi-même (et peut certainement le recommander...) donc je ne connais pas bien les mysqli mais il semble que vous pouvez obtenir une description de votre erreur à l'aide de $stmt->error, voir php.net/manual/en/mysqli.error.php. Qu'est-ce que vous donner?
Je suis totalement inconnue avec PDO, il offre les mêmes avantages que mysqli déclarations préparées à l'avance? Je vais vérifier l' $stmt->fonction d'erreur tout de suite. Aussi, même si mon fournisseur de clains mysqlnd est présent, l'exécution de la fonction phpinfo() ne présente pas de référence à tous les...
activer le rapport d'erreur, affichage / enregistrement et dites-nous quel message d'erreur que vous obtenez. Avec cette information, c'est un no-brainer pour vous dire ce qui se passe ici. Tout le reste est juste en coup de poignard dans le noir et de formuler des hypothèses. Que vous coûtent les nerfs et le temps.
Comme je l'ai dit, je ne sais rien à propos de mysqli. En fait, j'aurais probablement mieux fait de la recherche mysqli plus avant d'essayer cette voie. Extrait AOP (ne savais même pas que c'était comparable à mysqli), et il a BEAUCOUP d'avantages. mineur de performances, mais toutes choses égales par ailleurs, les paramètres nommés et directe de l'objet, les résultats sont incroyables! pour ne pas mentionner db abstraction. En regardant de plus dans ce, sera mise à jour bientôt...
N'avaient aucun problème avec PDO! Code Final est le suivant, ne peut pas répondre à ma propre question, à cause de la réputation n'est pas encore assez. function checkUsernameEmailAvailability($username, $email) { $dsn = 'mysql:dbname='.C_BASE.';host='.C_HOST; $user = C_USER; $password = C_PASS; new PDO($dsn, $user, $password); $params = array(':username' => $username, ':email' => $email); $sth = $dbh->prepare('SELECT username,email FROM tb_users WHERE username = :username OR email = :email '); $sth->execute($params); $result = $sth->fetch(PDO::FETCH_ASSOC); print_r($result); }

OriginalL'auteur MaurerPower | 2012-05-05