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 à la 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'EDI en remplaçant? marques avec des valeurs, cela fonctionne très bien. Veuillez noter que l'objet $ conn fonctionne correctement dans les autres requêtes du projet.
Toute aide s'il vous plaît .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
correctement soumises en utilisant un formulaire HTML avec la méthode POSTRéponses:
Veuillez lire les notes 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 travailler avec BIND_RESULT & FETCH!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
la source
mysqli_stmt::get_result()
n'est disponible que sur PHP v5.3.0 ou supérieur.php_mysqli_mysqlnd.dll
? J'aurais seulementphp_mysqli.dll
dans monext
dossier.Donc, si le pilote MySQL Native Driver (mysqlnd) n'est pas disponible, et donc en utilisant bind_result et fetch au lieu de get_result , le code devient:
la source
$EmailVerfied
est créé par l'appel àbind_result()
.Votre système n'a pas le pilote mysqlnd!
Si vous pouvez installer de nouveaux paquets sur votre serveur (basé sur Debian / Ubuntu), installez le pilote:
puis redémarrez votre serveur Web:
la source
pour ceux qui recherchent une alternative à
$result = $stmt->get_result()
j'ai créé cette fonction qui vous permet d'imiter le$result->fetch_assoc()
mais en utilisant directement l'objet stmt:comme vous pouvez le voir, il crée un tableau et le récupère avec les données de ligne, car il utilise en
$stmt->fetch()
interne, vous pouvez l'appeler comme vous l'appeleriezmysqli_result::fetch_assoc
(assurez-vous simplement que l'$stmt
objet est ouvert et que le résultat est stocké):la source
$statement->store_result();
c'est nécessaire avant d'appeler la fonction, pourquoi ne pas simplement l'inclure dans la fonction?Avec la version 7.2 de PHP, je viens d'utiliser nd_mysqli au lieu de mysqli et cela a fonctionné comme prévu.
Étapes pour l'activer dans le serveur d'hébergement de godaddy-
la source
Je sais que cela a déjà été répondu quant à quel est le problème réel, mais je veux offrir une solution de contournement simple.
Je voulais utiliser la méthode get_results () mais je n'avais pas le pilote, et je ne suis pas quelque part où je peux l'ajouter. Alors, avant d'appeler
J'ai créé un tableau vide, puis j'ai simplement lié les résultats sous forme de clés dans ce tableau:
afin que ces résultats puissent facilement être passés en méthodes ou transtypés en un objet pour une utilisation ultérieure.
J'espère que cela aidera tous ceux qui cherchent à faire quelque chose de similaire.
la source
J'obtenais cette même erreur sur mon serveur - PHP 7.0 avec l' extension mysqlnd déjà activée.
La solution était pour moi (grâce à cette page ) de désélectionner l' extension mysqli et de sélectionner nd_mysqli à la place.
NB - Vous pourrez peut-être accéder au sélecteur d'extensions dans votre cPanel. (J'accède au mien via l' option Select PHP Version .)
la source
session_start()
fonction PHP m'a fait comme une valeur inexistante. Ensuite, je suis passé à la version7.2
de PHP et j'ai changé l'extension demysqli
ennd_mysqli
(corrigé). Mais, j'ai deux questions, quelle est la différence entre les deux? et s'il y aurait une lacune dans la sécurité pour l'utilisation de cette extension?Je me rends compte que cela fait un moment qu'il n'y a pas eu de nouvelle activité sur cette question. Mais, comme d'autres auteurs l'ont commenté -
get_result()
n'est désormais disponible en PHP qu'en installant le pilote natif MySQL (mysqlnd), et dans certains cas, il peut ne pas être possible ou souhaitable d'installer mysqlnd. Donc, j'ai pensé qu'il serait utile de publier cette réponse avec des informations sur la façon d'obtenir la fonctionnalitéget_result()
offerte - sans utiliserget_result()
.get_result()
est / était souvent combiné avecfetch_array()
pour parcourir un jeu de résultats et stocker les valeurs de chaque ligne du jeu de résultats dans un tableau indexé numériquement ou associatif. Par exemple, le code ci-dessous utilise get_result () avec fetch_array () pour parcourir un jeu de résultats, en stockant les valeurs de chaque ligne dans le tableau $ data [] à indexation numérique:Cependant, si
get_result()
n'est pas disponible (car mysqlnd n'est pas installé), cela conduit au problème de savoir comment stocker les valeurs de chaque ligne d'un jeu de résultats dans un tableau, sans utiliserget_result()
. Ou comment migrer le code hérité quiget_result()
fonctionne sans lui (par exemple en utilisant à labind_result()
place) - tout en impactant le moins possible le reste du code.Il s'avère que stocker les valeurs de chaque ligne dans un tableau à indexation numérique n'est pas si simple à utiliser
bind_result()
.bind_result()
attend une liste de variables scalaires (pas un tableau). Il faut donc du temps pour stocker les valeurs de chaque ligne du jeu de résultats dans un tableau.Bien sûr, le code pourrait facilement être modifié comme suit:
Mais cela nous oblige à lister explicitement $ data [0], $ data [1], etc. individuellement dans l'appel à
bind_result()
, ce qui n'est pas idéal. Nous voulons une solution qui ne nous oblige pas à lister explicitement $ data [0], $ data [1], ... $ data [N-1] (où N est le nombre de champs dans l'instruction select) dans l'appel àbind_results()
. Si nous migrons une application héritée qui a un grand nombre de requêtes, et que chaque requête peut contenir un nombre différent de champs dans laselect
clause, la migration sera très laborieuse et sujette à des erreurs si nous utilisons une solution comme celle ci-dessus .Idéalement, nous voulons un extrait de code de «remplacement» - pour remplacer uniquement la ligne contenant la
get_result()
fonction et la boucle while () sur la ligne suivante. Le code de remplacement doit avoir la même fonction que le code qu'il remplace, sans affecter aucune des lignes avant, ni aucune des lignes après - y compris les lignes à l'intérieur de la boucle while (). Idéalement, nous voulons que le code de remplacement soit aussi compact que possible, et nous ne voulons pas avoir à adapter le code de remplacement en fonction du nombre de champs dans laselect
clause de la requête.En recherchant sur Internet, j'ai trouvé un certain nombre de solutions qui utilisent
bind_param()
aveccall_user_func_array()
(par exemple, lier dynamiquement les paramètres mysqli_stmt puis lier le résultat (PHP) ), mais la plupart des solutions que j'ai trouvées mènent finalement au stockage des résultats dans un tableau associatif, pas un tableau indexé numériquement, et beaucoup de ces solutions n'étaient pas aussi compactes que je le souhaiterais et / ou n'étaient pas adaptées en tant que «remplacements instantanés». Cependant, à partir des exemples que j'ai trouvés, j'ai pu bricoler cette solution, qui correspond à la facture:Bien sûr, la boucle for () peut être réduite en une seule ligne pour la rendre plus compacte.
J'espère que cela aidera tous ceux qui recherchent une solution en utilisant
bind_result()
pour stocker les valeurs de chaque ligne dans un tableau indexé numériquement et / ou qui recherchent un moyen de migrer le code hérité en utilisantget_result()
. Commentaires bienvenus.la source
Voici mon alternative. Il est orienté objet et ressemble plus à des choses mysql / mysqli.
Usage:
la source
J'ai écrit deux fonctions simples qui donnent les mêmes fonctionnalités que
$stmt->get_result();
, mais elles ne nécessitent pas le pilote mysqlnd.Vous remplacez simplement
$result = $stmt->get_result();
avec$fields = bindAll($stmt);
et
$row= $stmt->get_result();
avec$row = fetchRowAssoc($stmt, $fields);
.(Pour obtenir le nombre de lignes renvoyées, vous pouvez utiliser
$stmt->num_rows
.)Il vous suffit de placer ces deux fonctions que j'ai écrites quelque part dans votre script PHP . (par exemple tout en bas)
Comment ça marche :
Mon code utilise la
$stmt->result_metadata();
fonction pour déterminer combien et quels champs sont retournés, puis lie automatiquement les résultats récupérés à des références pré-créées. Fonctionne comme un charme!la source