130 votes

Appel à une méthode non définie mysqli_stmt::get_result

Voici mon code :

include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();

J'obtiens l'erreur sur la dernière ligne comme : Appel à une méthode non définie mysqli_stmt::get_result()

Voici le code pour conn.php :

define('SERVER', 'localhost');
define('USER', 'root');
define('PASS', 'xxxx');
define('DB', 'xxxx');
class Connection{
    /**
     * @var Resource 
     */
    var $mysqli = null;

    function __construct(){
        try{
            if(!$this->mysqli){
                $this->mysqli = new MySQLi(SERVER, USER, PASS, DB);
                if(!$this->mysqli)
                    throw new Exception('Could not create connection using MySQLi', 'NO_CONNECTION');
            }
        }
        catch(Exception $ex){
            echo "ERROR: ".$e->getMessage();
        }
    }
}

Si j'écris cette ligne :

if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';

Il imprime Déclaration NON préparée . Si j'exécute la requête directement dans l'IDE en remplaçant les marques ? par des valeurs, cela fonctionne bien. Veuillez noter que l'objet $conn fonctionne bien dans les autres requêtes du projet.

Toute aide est la bienvenue.......

0 votes

Je pense que tu as oublié $stmt = $conn->mysqli->stmt_init(); ?

0 votes

Veuillez vérifier si ces variables sont $_POST['EmailID'], $_POST['SLA'], $_POST['Password'] soumis correctement en utilisant un formulaire HTML avec la méthode POST

0 votes

@ajreal : Les variables sont affichées correctement. Je les ai testées en utilisant print_r($_POST).

160voto

bekay Points 575

Veuillez lire les notes de l'utilisateur pour cette méthode :

http://php.net/manual/en/mysqli-stmt.get-result.php

Il nécessite le pilote mysqlnd... S'il n'est pas installé sur votre espace web, vous devrez vous débrouiller avec les éléments suivants bind_result() & fetch() ¡!

5 votes

Merci beaucoup. Cela a fonctionné. J'ai décommenté le extension=php_mysqli_mysqlnd.dll en php.ini ; et redémarré les services Apache2.2 et MySQL. Dois-je décommenter la ligne extension=php_mysqli_libmysql.dll ? D'après une autre page, mysqlnd est plus rapide que libmysql. Aussi, puis-je m'attendre à ce que mysqlnd soit installé chez les fournisseurs de services d'hébergement les plus populaires ?

0 votes

J'ai testé le code en supprimant la ligne $stmt = $conn->mysqli->stmt_init() ; et le code fonctionnait toujours bien. Est-il conseillé de faire comme ça ?

1 votes

stmt_init() n'est nécessaire que pour une déclaration préparée procédurale . donc vous n'en avez pas besoin ! Regardez : link Quant à la libmysql Je ne sais pas. Et je ne compterais pas sur les fournisseurs d'hébergement pour l'installation de mysqlnd.dll ... mieux vaut essayer une solution de rechange !

57voto

Bert Regelink Points 1061

Ainsi, si le pilote MySQL Native Driver (mysqlnd) n'est pas disponible, et donc que l'utilisation de l'option bind_result y aller chercher au lieu de obtenir_résultat le code devient :

include 'conn.php';
$conn = new Connection();
$query = 'SELECT EmailVerified, Blocked FROM users WHERE Email = ? AND SLA = ? AND `Password` = ?';
$stmt = $conn->mysqli->prepare($query);
$stmt->bind_param('sss', $_POST['EmailID'], $_POST['SLA'], $_POST['Password']);
$stmt->execute();
$stmt->bind_result($EmailVerified, $Blocked);
while ($stmt->fetch())
{
   /* Use $EmailVerified and $Blocked */
}
$stmt->close();
$conn->mysqli->close();

0 votes

$stmt->bind_result me fait gagner du temps. C'est une excellente solution lorsque get_result n'est pas disponible.

2 votes

Question : d'où vient la variable $EmailVerfied ?

0 votes

@Akintunde007 : $EmailVerfied est créé par l'appel à bind_result() .

47voto

cyberboy Points 402

Il manque le pilote mysqlnd à votre système !

Si vous êtes en mesure d'installer de nouveaux paquets sur votre serveur (basé sur Debian/Ubuntu), installez le pilote :

sudo apt-get install php5-mysqlnd

puis redémarrez votre serveur web :

sudo /etc/init.d/apache2 restart

10voto

Kirkland Points 1105

Je sais que la réponse à cette question a déjà été donnée quant à la nature du problème, mais je souhaite proposer une solution de contournement simple.

Je voulais utiliser la méthode get_results() mais je n'avais pas le driver, et je ne suis pas quelque part où je peux le faire ajouter. Donc, avant d'appeler

$stmt->bind_results($var1,$var2,$var3,$var4...etc);

J'ai créé un tableau vide, puis j'ai lié les résultats en tant que clés dans ce tableau :

$result = array();
$stmt->bind_results($result['var1'],$result['var2'],$result['var3'],$result['var4']...etc);

afin que ces résultats puissent facilement être transmis à des méthodes ou convertis en un objet pour une utilisation ultérieure.

J'espère que cela aidera tous ceux qui cherchent à faire quelque chose de similaire.

1voto

Sudhir Points 50854

Ajoutez ceci avant prepare() :

$stmt = $mysqli->stmt\_init();

//Ref: http://php.net/manual/en/mysqli-stmt.get-result.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X