Вот мой код:
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();
Я получаю сообщение об ошибке в последней строке как: Вызов неопределенного метода mysqli_stmt :: get_result ()
Вот код для 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();
}
}
}
Если я напишу эту строку:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Он печатает «Заявление НЕ подготовлено» . Если я запустил запрос прямо в IDE, заменив? отмечает со значениями, работает нормально. Обратите внимание, что объект $ conn отлично работает с другими запросами в проекте.
Любая помощь, пожалуйста .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
правильно ли отправлены эти переменные, используя HTML-форму с методом POSTОтветы:
Прочтите примечания пользователя для этого метода:
http://php.net/manual/en/mysqli-stmt.get-result.php
Для этого требуется драйвер mysqlnd ... если он не установлен в вашем веб-пространстве, вам придется работать с BIND_RESULT & FETCH!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
источник
mysqli_stmt::get_result()
доступно только в PHP v5.3.0 или выше.php_mysqli_mysqlnd.dll
? Я бы толькоphp_mysqli.dll
вext
папке.Поэтому, если драйвер MySQL Native Driver (mysqlnd) недоступен и, следовательно, с использованием bind_result и fetch вместо get_result , код становится следующим:
источник
$EmailVerfied
создается при вызовеbind_result()
.В вашей системе отсутствует драйвер mysqlnd!
Если вы можете установить новые пакеты на свой сервер (на базе Debian / Ubuntu), установите драйвер:
а затем перезапустите свой веб-сервер:
источник
для тех, кто ищет альтернативу,
$result = $stmt->get_result()
я сделал эту функцию, которая позволяет имитировать,$result->fetch_assoc()
но напрямую использовать объект stmt:как вы можете видеть, он создает массив и извлекает его с данными строки, поскольку он используется
$stmt->fetch()
внутри, вы можете вызывать его так же, как вы бы вызывалиmysqli_result::fetch_assoc
(просто убедитесь, что$stmt
объект открыт и результат сохранен):источник
$statement->store_result();
это необходимо перед вызовом функции, почему бы просто не включить ее в функцию?В PHP версии 7.2 я просто использовал nd_mysqli вместо mysqli, и он работал должным образом .
Шаги по включению его на сервер хостинга godaddy-
источник
Я знаю, что на этот вопрос уже был дан ответ относительно реальной проблемы, однако я хочу предложить простой обходной путь.
Я хотел использовать метод get_results (), но у меня не было драйвера, и я не могу его добавить. Итак, прежде чем я позвонил
Я создал пустой массив, а затем просто связал результаты как ключи в этом массиве:
чтобы эти результаты можно было легко передать в методы или преобразовать в объект для дальнейшего использования.
Надеюсь, это поможет всем, кто хочет сделать что-то подобное.
источник
Я получал ту же ошибку на своем сервере - PHP 7.0 с уже включенным расширением mysqlnd .
Решением для меня (благодаря этой странице ) было отменить выбор расширения mysqli и вместо этого выбрать nd_mysqli .
NB - Вы можете получить доступ к селектору расширений в cPanel. (Я получаю доступ к своей через опцию Select PHP Version .)
источник
session_start()
функции PHP сделало меня несуществующим значением. Затем я обновился до версии7.2
PHP и изменил расширениеmysqli
наnd_mysqli
(исправлено). Но у меня два вопроса: в чем разница между ними? и есть ли какие-либо пробелы в безопасности при использовании этого расширения?Я понимаю, что уже давно не было никаких новых действий по этому вопросу. Но, как прокомментировали другие
get_result()
авторы, теперь это доступно только в PHP после установки собственного драйвера MySQL (mysqlnd), и в некоторых случаях установка mysqlnd может быть невозможной или нежелательной. Итак, я подумал, что было бы полезно опубликовать этот ответ с информацией о том, как получить предлагаемую функциональностьget_result()
- без использованияget_result()
.get_result()
Часто используется в сочетании с,fetch_array()
чтобы перебирать набор результатов и сохранять значения из каждой строки набора результатов в числовом индексе или ассоциативном массиве. Например, приведенный ниже код использует get_result () с fetch_array () для циклического просмотра набора результатов, сохраняя значения из каждой строки в массиве $ data [] с числовой индексацией:Однако, если
get_result()
он недоступен (поскольку mysqlnd не установлен), это приводит к проблеме того, как сохранить значения из каждой строки набора результатов в массиве без использованияget_result()
. Или как перенести устаревший код, который используетсяget_result()
для работы без него (например, используяbind_result()
вместо него), при этом как можно меньше влияя на остальную часть кода.Оказывается, сохранение значений из каждой строки в массиве с числовым индексом не так просто использовать
bind_result()
.bind_result()
ожидает список скалярных переменных (не массив). Итак, требуется некоторое усилие, чтобы заставить его сохранять значения из каждой строки набора результатов в массиве.Конечно, код можно легко изменить следующим образом:
Но это требует, чтобы мы явно перечисляли $ data [0], $ data [1] и т. Д. По отдельности в вызове
bind_result()
, что не идеально. Нам нужно решение, которое не требует от нас явного перечисления $ data [0], $ data [1], ... $ data [N-1] (где N - количество полей в операторе выбора) в звонкеbind_results()
. Если мы переносим устаревшее приложение с большим количеством запросов, и каждый запрос может содержать разное количество полей вselect
предложении, миграция будет очень трудоемкой и подвержена ошибкам, если мы будем использовать решение, подобное приведенному выше. .В идеале нам нужен фрагмент кода «вставной замены» - чтобы заменить только строку, содержащую
get_result()
функцию и цикл while (), на следующей строке. Код замены должен иметь ту же функцию, что и код, который он заменяет, не затрагивая ни одну из строк до или любую из строк после, включая строки внутри цикла while (). В идеале мы хотим, чтобы код замены был как можно более компактным, и мы не хотим, чтобы код замены зависел от количества полей вselect
предложении запроса.Поискав в Интернете, я нашел ряд решений, которые используются
bind_param()
сcall_user_func_array()
(например, динамически связывают параметры mysqli_stmt, а затем связывают результат (PHP) ), но большинство решений, которые я нашел, в конечном итоге приводят к тому, что результаты сохраняются в ассоциативном массиве, а не массив с числовой индексацией, и многие из этих решений были не такими компактными, как хотелось бы, и / или не подходили в качестве «заменяемых элементов». Однако из примеров, которые я нашел, я смог сколотить это решение, которое отвечает всем требованиям:Конечно, цикл for () можно свернуть в одну строку, чтобы сделать его более компактным.
Я надеюсь, что это поможет любому, кто ищет решение, использующее
bind_result()
для хранения значений из каждой строки в массиве с числовой индексацией и / или ищущий способ переноса устаревшего кода с использованиемget_result()
. Комментарии приветствуются.источник
Вот моя альтернатива. Он объектно-ориентированный и больше похож на mysql / mysqli.
Использование:
источник
Я написал две простые функции, которые предоставляют те же функциональные возможности, что и
$stmt->get_result();
, но не требуют драйвера mysqlnd.Вы просто заменяете
$result = $stmt->get_result();
с участием$fields = bindAll($stmt);
и
$row= $stmt->get_result();
с$row = fetchRowAssoc($stmt, $fields);
.(Чтобы получить количество возвращенных строк, вы можете использовать
$stmt->num_rows
.)Вам просто нужно поместить эти две функции, которые я написал, где-нибудь в вашем PHP-скрипте . (например, прямо внизу)
Как это работает :
Мой код использует эту
$stmt->result_metadata();
функцию, чтобы выяснить, сколько и какие поля возвращаются, а затем автоматически привязывает полученные результаты к заранее созданным ссылкам. Работает как шарм!источник