Oto mój kod:
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();
Otrzymuję błąd w ostatnim wierszu jako: Wywołanie niezdefiniowanej metody mysqli_stmt :: get_result ()
Oto kod dla 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();
}
}
}
Jeśli napiszę ten wiersz:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Wyświetla komunikat „Oświadczenie NIE zostało przygotowane” . Jeśli uruchomię zapytanie bezpośrednio w IDE zastępując? oznacza wartościami, działa dobrze. Należy pamiętać, że obiekt $ conn działa dobrze w innych zapytaniach w projekcie.
Proszę o pomoc .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
przesłane poprawnie za pomocą formularza HTML z metodą POSTOdpowiedzi:
Przeczytaj uwagi użytkownika dotyczące tej metody:
http://php.net/manual/en/mysqli-stmt.get-result.php
Wymaga sterownika mysqlnd ... jeśli nie jest zainstalowany na Twojej przestrzeni internetowej, będziesz musiał pracować z BIND_RESULT & FETCH!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
źródło
mysqli_stmt::get_result()
jest dostępne tylko w wersji PHP 5.3.0 lub nowszej.php_mysqli_mysqlnd.dll
? Miałbym tylkophp_mysqli.dll
w swoimext
folderze.Więc jeśli sterownik MySQL Native Driver (mysqlnd) nie jest dostępny, a zatem używając bind_result i fetch zamiast get_result , kod wygląda następująco:
źródło
$EmailVerfied
jest tworzony przez wywołaniebind_result()
.W Twoim systemie brakuje sterownika mysqlnd!
Jeśli możesz zainstalować nowe pakiety na swoim serwerze (opartym na Debianie / Ubuntu), zainstaluj sterownik:
a następnie zrestartuj serwer WWW:
źródło
dla tych, którzy szukają alternatywy dla
$result = $stmt->get_result()
stworzyłem tę funkcję, która pozwala naśladować,$result->fetch_assoc()
ale używając bezpośrednio obiektu stmt:jak widać, tworzy tablicę i pobiera ją z danymi wiersza, ponieważ używa
$stmt->fetch()
wewnętrznie, możesz ją wywołać tak, jak byś wywołałamysqli_result::fetch_assoc
(tylko upewnij się, że$stmt
obiekt jest otwarty, a wynik jest zapisany):źródło
$statement->store_result();
jest to konieczne przed wywołaniem funkcji, dlaczego po prostu nie uwzględnić jej w funkcji?W wersji PHP 7.2 użyłem tylko nd_mysqli zamiast mysqli i wszystko działało zgodnie z oczekiwaniami.
Kroki, aby włączyć go do serwera hostingowego GoDaddy-
źródło
Wiem, że już udzielono odpowiedzi na temat tego, jaki jest rzeczywisty problem, jednak chcę zaproponować proste obejście.
Chciałem użyć metody get_results (), ale nie miałem sterownika i nie jestem gdzieś, gdzie mogę to dodać. Więc zanim zadzwoniłem
Utworzyłem pustą tablicę, a następnie powiązałem wyniki jako klucze w tej tablicy:
aby te wyniki można było łatwo przekazać do metod lub rzutować na obiekt w celu dalszego wykorzystania.
Mam nadzieję, że pomoże to każdemu, kto chce zrobić coś podobnego.
źródło
Otrzymałem ten sam błąd na moim serwerze - PHP 7.0 z już włączonym rozszerzeniem mysqlnd .
Rozwiązaniem było dla mnie (dzięki tej stronie ) odznaczenie rozszerzenia mysqli i zamiast tego wybranie nd_mysqli .
NB - Możesz mieć dostęp do selektora rozszerzeń w swoim cPanel. (Mam dostęp do mojego poprzez opcję Wybierz wersję PHP ).
źródło
session_start()
funkcji PHP sprawiło, że poczułem się jak nieistniejąca wartość. Następnie zaktualizowałem do wersji7.2
PHP i zmieniłem rozszerzeniemysqli
nand_mysqli
(naprawione). Ale mam dwa pytania, jaka jest różnica między nimi? i czy byłaby jakaś luka w bezpieczeństwie korzystania z tego rozszerzenia?Zdaję sobie sprawę, że minęło trochę czasu, odkąd pojawiły się nowe działania w tej kwestii. Ale, jak komentowali inni plakaty -
get_result()
jest teraz dostępny tylko w PHP po zainstalowaniu natywnego sterownika MySQL (mysqlnd), aw niektórych przypadkach może nie być możliwe lub pożądane zainstalowanie mysqlnd. Pomyślałem więc, że pomocne byłoby opublikowanie tej odpowiedzi z informacjami o tym, jak uzyskać oferowaną funkcjonalnośćget_result()
- bez użyciaget_result()
.get_result()
jest / był często łączony z,fetch_array()
aby zapętlić zestaw wyników i przechowywać wartości z każdego wiersza zestawu wyników w tablicy indeksowanej numerycznie lub asocjacyjnej. Na przykład poniższy kod wykorzystuje metodę get_result () z funkcją fetch_array () do przechodzenia przez zestaw wyników, przechowując wartości z każdego wiersza w tablicy $ data [] indeksowanej numerycznie:Jeśli jednak
get_result()
nie jest dostępny (ponieważ mysqlnd nie jest zainstalowany), prowadzi to do problemu z przechowywaniem wartości z każdego wiersza zestawu wyników w tablicy bez użyciaget_result()
. Albo jak przeprowadzić migrację starszego kodu,get_result()
który działa bez niego (np. Używającbind_result()
zamiast tego) - przy jak najmniejszym wpływie na resztę kodu.Okazuje się, że przechowywanie wartości z każdego wiersza w tablicy indeksowanej numerycznie nie jest tak proste w użyciu
bind_result()
.bind_result()
oczekuje listy zmiennych skalarnych (nie tablicy). Tak więc wymaga trochę pracy, aby przechowywać wartości z każdego wiersza zestawu wyników w tablicy.Oczywiście kod można łatwo zmodyfikować w następujący sposób:
Ale to wymaga od nas, abyśmy w wywołaniu funkcji wyraźnie wymieniali $ data [0], $ data [1] itd.
bind_result()
, Co nie jest idealne. Chcemy rozwiązania, które nie wymaga od nas jawnej listy $ data [0], $ data [1], ... $ data [N-1] (gdzie N to liczba pól w instrukcji select) w wezwaniu dobind_results()
. Jeśli przeprowadzamy migrację starszej aplikacji, która ma dużą liczbę zapytań, a każde zapytanie może zawierać inną liczbę pól wselect
klauzuli, migracja będzie bardzo pracochłonna i podatna na błędy, jeśli użyjemy rozwiązania takiego jak powyższe .Idealnie byłoby, gdybyśmy potrzebowali fragmentu kodu „zastępującego wstawianie” - aby zastąpić tylko wiersz zawierający
get_result()
funkcję i pętlę while () w następnym wierszu. Kod zastępczy powinien mieć taką samą funkcję jak kod, który zastępuje, bez wpływu na żadną z wierszy przed ani na wiersze po - w tym wiersze wewnątrz pętli while (). W idealnym przypadku chcemy, aby kod zastępczy był możliwie jak najbardziej zwarty i nie chcemy modyfikować kodu zastępczego na podstawie liczby pól wselect
klauzuli zapytania.Szukając w Internecie, znalazłem szereg rozwiązań, które używają
bind_param()
zcall_user_func_array()
(na przykład Dynamiczne wiązanie parametrów mysqli_stmt, a następnie wiązanie wyniku (PHP) ), ale większość rozwiązań, które znalazłem, ostatecznie prowadzi do przechowywania wyników w tablicy asocjacyjnej, a nie tablica indeksowana numerycznie, a wiele z tych rozwiązań nie było tak zwartych, jak bym chciał i / lub nie nadawało się jako „zamienniki typu drop-in”. Jednak z przykładów, które znalazłem, udało mi się zebrać razem to rozwiązanie, które pasuje do rachunku:Oczywiście pętlę for () można zwinąć w jedną linię, aby była bardziej zwarta.
Mam nadzieję, że pomoże to każdemu, kto szuka rozwiązania używającego
bind_result()
do przechowywania wartości z każdego wiersza w tablicy indeksowanej numerycznie i / lub szukającego sposobu na migrację starszego kodu przy użyciuget_result()
. Komentarze mile widziane.źródło
Oto moja alternatywa. Jest zorientowany obiektowo i bardziej przypomina rzeczy mysql / mysqli.
Stosowanie:
źródło
Napisałem dwie proste funkcje, które dają taką samą funkcjonalność jak
$stmt->get_result();
, ale nie wymagają sterownika mysqlnd.Po prostu wymieniasz
$result = $stmt->get_result();
z$fields = bindAll($stmt);
i
$row= $stmt->get_result();
z$row = fetchRowAssoc($stmt, $fields);
.(Aby uzyskać liczbę zwróconych wierszy, których możesz użyć
$stmt->num_rows
).Musisz tylko umieścić te dwie funkcje , które napisałem gdzieś w swoim skrypcie PHP . (na przykład na dole)
Jak to działa :
Mój kod używa tej
$stmt->result_metadata();
funkcji, aby dowiedzieć się, ile i które pola są zwracane, a następnie automatycznie wiąże pobrane wyniki z wstępnie utworzonymi odwołaniami. Działa jak marzenie!źródło