Hier ist mein 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();
Ich erhalte den Fehler in der letzten Zeile wie folgt: Aufruf der undefinierten Methode mysqli_stmt :: get_result ()
Hier ist der Code für 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();
}
}
}
Wenn ich diese Zeile schreibe:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Es wird "Erklärung NICHT vorbereitet" gedruckt . Wenn ich die Abfrage direkt in der IDE ersetze? Markierungen mit Werten, es funktioniert gut. Bitte beachten Sie, dass das Objekt $ conn in anderen Abfragen im Projekt einwandfrei funktioniert.
Jede Hilfe bitte .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
mithilfe eines HTML-Formulars mit POST-Methode korrekt übermittelt wurdenAntworten:
Bitte lesen Sie die Benutzerhinweise zu dieser Methode:
http://php.net/manual/en/mysqli-stmt.get-result.php
Es erfordert den mysqlnd-Treiber ... wenn er nicht auf Ihrem Webspace installiert ist, müssen Sie mit BIND_RESULT & FETCH arbeiten!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
quelle
mysqli_stmt::get_result()
ist nur unter PHP v5.3.0 oder höher verfügbar.php_mysqli_mysqlnd.dll
? Ich hätte nurphp_mysqli.dll
in meinemext
Ordner.Wenn der MySQL Native Driver (mysqlnd) -Treiber nicht verfügbar ist und daher bind_result und fetch anstelle von get_result verwendet , lautet der Code wie folgt :
quelle
$EmailVerfied
wird durch den Aufruf von erstelltbind_result()
.Ihrem System fehlt der mysqlnd-Treiber!
Wenn Sie neue Pakete auf Ihrem (Debian / Ubuntu-basierten) Server installieren können, installieren Sie den Treiber:
und starten Sie dann Ihren Webserver neu:
quelle
Für diejenigen, die nach einer Alternative suchen,
$result = $stmt->get_result()
habe ich diese Funktion entwickelt, mit der Sie$result->fetch_assoc()
das stmt-Objekt nachahmen können, aber direkt verwenden:Wie Sie sehen, wird ein Array erstellt und mit den Zeilendaten abgerufen. Da es
$stmt->fetch()
intern verwendet wird, können Sie es so aufrufen, wie Sie es aufrufen würdenmysqli_result::fetch_assoc
(stellen Sie nur sicher, dass das$stmt
Objekt geöffnet ist und das Ergebnis gespeichert ist):quelle
$statement->store_result();
vor dem Aufruf der Funktion erforderlich ist, können Sie es einfach in die Funktion aufnehmen.Mit PHP Version 7.2 habe ich nur nd_mysqli anstelle von mysqli verwendet und es hat wie erwartet funktioniert.
Schritte, um es in Godaddy Hosting Server zu aktivieren-
quelle
Ich weiß, dass dies bereits beantwortet wurde, was das eigentliche Problem ist, aber ich möchte eine einfache Problemumgehung anbieten.
Ich wollte die Methode get_results () verwenden, hatte aber keinen Treiber, und ich bin nicht irgendwo, wo ich das hinzufügen kann. Also, bevor ich anrief
Ich habe ein leeres Array erstellt und dann die Ergebnisse als Schlüssel in diesem Array gebunden:
so dass diese Ergebnisse leicht an Methoden übergeben oder zur weiteren Verwendung in ein Objekt umgewandelt werden können.
Hoffe, das hilft jedem, der etwas Ähnliches tun möchte.
quelle
Ich habe den gleichen Fehler auf meinem Server erhalten - PHP 7.0 mit der bereits aktivierten Erweiterung mysqlnd .
Lösung war für mich (dank dieser Seite ) war die abzuwählen mysqli Erweiterung und wählen Sie nd_mysqli statt.
NB - Möglicherweise können Sie auf die Erweiterungsauswahl in Ihrem cPanel zugreifen. (Ich greife über die Option PHP-Version auswählen auf meine zu .)
quelle
session_start()
machte mich die Verwendung der PHP- Funktion zu einem nicht existierenden Wert. Dann habe ich auf7.2
PHP aktualisiert und die Erweiterung vonmysqli
aufnd_mysqli
(behoben) geändert . Aber ich habe zwei Fragen, was ist der Unterschied zwischen den beiden? und ob es eine Sicherheitslücke für die Verwendung dieser Erweiterung geben würde?Mir ist klar, dass es eine Weile her ist, dass es zu dieser Frage neue Aktivitäten gegeben hat. Aber, wie andere Poster kommentiert haben,
get_result()
ist es jetzt nur in PHP verfügbar, indem der native MySQL-Treiber (mysqlnd) installiert wird. In einigen Fällen ist es möglicherweise nicht möglich oder wünschenswert, mysqlnd zu installieren. Daher dachte ich, es wäre hilfreich, diese Antwort mit Informationen darüber zu veröffentlichen, wie Sie die angebotenen Funktionen erhaltenget_result()
- ohne sie zu verwendenget_result()
.get_result()
wird / wurde oft kombiniertfetch_array()
, um eine Ergebnismenge zu durchlaufen und die Werte aus jeder Zeile der Ergebnismenge in einem numerisch indizierten oder assoziativen Array zu speichern. Im folgenden Code wird beispielsweise get_result () mit fetch_array () verwendet, um eine Ergebnismenge zu durchlaufen und die Werte aus jeder Zeile im numerisch indizierten Array $ data [] zu speichern:Wenn dies
get_result()
jedoch nicht verfügbar ist (da mysqlnd nicht installiert ist), führt dies zu dem Problem, wie die Werte aus jeder Zeile einer Ergebnismenge in einem Array ohne Verwendung gespeichert werden könnenget_result()
. Oder wie man alten Code migriert, der verwendet wirdget_result()
, um ohne ihn ausgeführt zu werden (z. B.bind_result()
stattdessen), während der Rest des Codes so wenig wie möglich beeinflusst wird.Es stellt sich heraus, dass das Speichern der Werte aus jeder Zeile in einem numerisch indizierten Array nicht so einfach ist
bind_result()
.bind_result()
erwartet eine Liste skalarer Variablen (kein Array). Es ist also einige Arbeit erforderlich, um die Werte aus jeder Zeile der Ergebnismenge in einem Array zu speichern.Natürlich kann der Code leicht wie folgt geändert werden:
Dies erfordert jedoch, dass wir $ data [0], $ data [1] usw. im Aufruf von explizit einzeln auflisten
bind_result()
, was nicht ideal ist. Wir wollen eine Lösung, bei der wir nicht explizit $ data [0], $ data [1], ... $ data [N-1] auflisten müssen (wobei N die Anzahl der Felder in der select-Anweisung ist). im Anruf anbind_results()
. Wenn wir eine Legacy-Anwendung mit einer großen Anzahl von Abfragen migrieren und jede Abfrage möglicherweise eine andere Anzahl von Feldern in derselect
Klausel enthält, ist die Migration sehr arbeitsintensiv und fehleranfällig, wenn wir eine Lösung wie die oben beschriebene verwenden .Idealerweise möchten wir einen Ausschnitt aus dem Drop-In-Ersetzungscode, um nur die Zeile zu ersetzen, die die
get_result()
Funktion und die while () -Schleife in der nächsten Zeile enthält. Der Ersetzungscode sollte dieselbe Funktion haben wie der Code, den er ersetzt, ohne die Zeilen davor oder die Zeilen danach zu beeinflussen - einschließlich der Zeilen innerhalb der while () - Schleife. Idealerweise möchten wir, dass der Ersatzcode so kompakt wie möglich ist, und wir möchten nicht, dass der Ersatzcode basierend auf der Anzahl der Felder in derselect
Klausel der Abfrage angepasst wird.Bei der Suche im Internet habe ich eine Reihe von Lösungen gefunden, die
bind_param()
mitcall_user_func_array()
(z. B. dynamisch mysqli_stmt-Parameter binden und dann Ergebnis binden (PHP) ) verwendet werden. Die meisten Lösungen, die ich gefunden habe, führen jedoch dazu, dass die Ergebnisse in einem assoziativen Array gespeichert werden, nicht ein numerisch indiziertes Array, und viele dieser Lösungen waren nicht so kompakt, wie ich es gerne hätte, und / oder waren nicht als "Drop-In-Ersatz" geeignet. Aus den Beispielen, die ich gefunden habe, konnte ich jedoch diese Lösung zusammenschustern, die der Rechnung entspricht:Natürlich kann die for () - Schleife in einer Zeile zusammengefasst werden, um sie kompakter zu machen.
Ich hoffe, dies hilft jedem, der nach einer Lösung sucht, mit der
bind_result()
er die Werte aus jeder Zeile in einem numerisch indizierten Array speichert und / oder nach einer Möglichkeit sucht, Legacy-Code mithilfe von zu migrierenget_result()
. Kommentare willkommen.quelle
Hier ist meine Alternative. Es ist objektorientiert und ähnelt eher MySQL / Mysqli-Dingen.
Verwendung:
quelle
Ich habe zwei einfache Funktionen geschrieben, die die gleiche Funktionalität
$stmt->get_result();
bieten wie , aber den mysqlnd-Treiber nicht benötigen.Sie ersetzen einfach
$result = $stmt->get_result();
mit$fields = bindAll($stmt);
und
$row= $stmt->get_result();
mit$row = fetchRowAssoc($stmt, $fields);
.(Um die Anzahl der zurückgegebenen Zeilen zu ermitteln, können Sie diese verwenden
$stmt->num_rows
.)Sie müssen nur diese beiden Funktionen platzieren, die ich irgendwo in Ihrem PHP-Skript geschrieben habe . (zum Beispiel ganz unten)
Wie es funktioniert :
Mein Code verwendet die
$stmt->result_metadata();
Funktion, um herauszufinden, wie viele und welche Felder zurückgegeben werden, und bindet dann die abgerufenen Ergebnisse automatisch an vorab erstellte Referenzen. Klappt wunderbar!quelle