Este é meu código:
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();
Recebo o erro na última linha como: Chamada para o método undefined mysqli_stmt :: get_result ()
Aqui está o código para 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();
}
}
}
Se eu escrever esta linha:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Ele imprime 'Declaração NÃO preparada' . Se eu executar a consulta diretamente no IDE substituindo? marcas com valores, funciona bem. Observe que o objeto $ conn funciona bem em outras consultas no projeto.
Qualquer ajuda por favor .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
enviadas corretamente usando um formulário HTML com o método POSTRespostas:
Leia as notas do usuário para este método:
http://php.net/manual/en/mysqli-stmt.get-result.php
Requer o driver mysqlnd ... se não estiver instalado em seu espaço web, você terá que trabalhar com BIND_RESULT & FETCH!
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
fonte
mysqli_stmt::get_result()
só está disponível no PHP v5.3.0 ou superior.php_mysqli_mysqlnd.dll
? Eu só teriaphp_mysqli.dll
na minhaext
pasta.Portanto, se o driver nativo do MySQL (mysqlnd) não estiver disponível e, portanto, usando bind_result e fetch em vez de get_result , o código se torna:
fonte
$EmailVerfied
é criado pela chamada parabind_result()
.Seu sistema está sem o driver mysqlnd!
Se você conseguir instalar novos pacotes em seu servidor (baseado em Debian / Ubuntu), instale o driver:
e reinicie o seu servidor web:
fonte
para aqueles que procuram uma alternativa para
$result = $stmt->get_result()
eu fiz esta função que permite que você imite o$result->fetch_assoc()
mas usando diretamente o objeto stmt:como você pode ver, ele cria uma matriz e a busca com os dados da linha, uma vez que usa
$stmt->fetch()
internamente, você pode chamá-la da mesma forma que chamariamysqli_result::fetch_assoc
(apenas certifique-se de que o$stmt
objeto esteja aberto e o resultado armazenado):fonte
$statement->store_result();
for necessário antes de chamar a função, por que não incluí-lo na função?Com o PHP versão 7.2, usei apenas nd_mysqli em vez de mysqli e funcionou como esperado.
Passos para habilitá-lo no servidor de hospedagem godaddy-
fonte
Sei que já foi respondido qual é o problema real, no entanto, quero oferecer uma solução alternativa simples.
Eu queria usar o método get_results (), mas não tinha o driver e não estou em nenhum lugar onde possa adicioná-lo. Então, antes de ligar
Eu criei uma matriz vazia e, em seguida, apenas vinculei os resultados como chaves nessa matriz:
para que esses resultados possam ser facilmente passados para métodos ou convertidos para um objeto para uso posterior.
Espero que isso ajude quem está procurando fazer algo semelhante.
fonte
Eu estava recebendo este mesmo erro no meu servidor - PHP 7.0 com a extensão mysqlnd já habilitada.
A solução para mim (graças a esta página ) foi desmarcar a extensão mysqli e selecionar nd_mysqli .
NB - Você pode acessar o seletor de extensões no seu cPanel. (Eu acesso o meu através da opção Selecionar versão do PHP .)
fonte
session_start()
função do PHP me tornou um valor inexistente. Então eu atualizei para a versão7.2
do PHP e mudei a extensão demysqli
parand_mysqli
(fixo). Mas, eu tenho duas perguntas, qual é a diferença entre os dois? e se haveria alguma lacuna na segurança para usar essa extensão?Percebo que já faz um tempo que não houve qualquer nova atividade sobre essa questão. Mas, como outros participantes comentaram -
get_result()
agora está disponível apenas em PHP com a instalação do driver nativo MySQL (mysqlnd) e, em alguns casos, pode não ser possível ou desejável instalar mysqlnd. Então, achei que seria útil postar esta resposta com informações sobre como obter a funcionalidade queget_result()
oferece - sem usarget_result()
.get_result()
é / era frequentemente combinado comfetch_array()
para percorrer um conjunto de resultados e armazenar os valores de cada linha do conjunto de resultados em uma matriz indexada numericamente ou associativa. Por exemplo, o código a seguir usa get_result () com fetch_array () para percorrer um conjunto de resultados, armazenando os valores de cada linha no array $ data [] indexado numericamente:No entanto, se
get_result()
não estiver disponível (porque mysqlnd não está instalado), isso levará ao problema de como armazenar os valores de cada linha de um conjunto de resultados em um array, sem usarget_result()
. Ou como migrar o código legado que usaget_result()
para ser executado sem ele (por exemplo, usando aobind_result()
invés) - enquanto afeta o resto do código o mínimo possível.Acontece que armazenar os valores de cada linha em uma matriz indexada numericamente não é tão simples de usar
bind_result()
.bind_result()
espera uma lista de variáveis escalares (não uma matriz). Portanto, é necessário algum esforço para armazená-los em um array os valores de cada linha do conjunto de resultados.Claro, o código pode ser facilmente modificado da seguinte maneira:
Mas, isso exige que listemos explicitamente $ data [0], $ data [1], etc. individualmente na chamada para
bind_result()
, o que não é o ideal. Queremos uma solução que não exija que listemos explicitamente $ data [0], $ data [1], ... $ data [N-1] (onde N é o número de campos na instrução select) na chamada parabind_results()
. Se estivermos migrando um aplicativo legado que tem um grande número de consultas e cada consulta pode conter um número diferente de campos naselect
cláusula, a migração será muito trabalhosa e sujeita a erros se usarmos uma solução como a acima .Idealmente, queremos um snippet de código de 'substituição drop-in' - para substituir apenas a linha que contém a
get_result()
função e o loop while () na próxima linha. O código de substituição deve ter a mesma função do código que está substituindo, sem afetar nenhuma das linhas anteriores ou posteriores - incluindo as linhas dentro do loop while (). Idealmente, queremos que o código de substituição seja o mais compacto possível e não queremos ter que ajustar o código de substituição com base no número de campos naselect
cláusula da consulta.Pesquisando na internet, encontrei uma série de soluções que usam
bind_param()
comcall_user_func_array()
(por exemplo, vincular dinamicamente os parâmetros mysqli_stmt e depois vincular o resultado (PHP) ), mas a maioria das soluções que encontrei eventualmente levam ao armazenamento dos resultados em uma matriz associativa, não uma matriz indexada numericamente, e muitas dessas soluções não eram tão compactas quanto eu gostaria e / ou não eram adequadas como 'substituições imediatas'. No entanto, a partir dos exemplos que encontrei, fui capaz de remendar esta solução, que se encaixa no projeto:Claro, o loop for () pode ser reduzido em uma linha para torná-lo mais compacto.
Espero que isso ajude quem está procurando uma solução usando
bind_result()
para armazenar os valores de cada linha em uma matriz indexada numericamente e / ou procurando uma maneira de migrar o código legado usandoget_result()
. Comentários são bem-vindos.fonte
Aqui está minha alternativa. É orientado a objetos e é mais parecido com coisas mysql / mysqli.
Uso:
fonte
Eu escrevi duas funções simples que fornecem a mesma funcionalidade
$stmt->get_result();
, mas não requerem o driver mysqlnd.Você simplesmente substitui
$result = $stmt->get_result();
com$fields = bindAll($stmt);
e
$row= $stmt->get_result();
com$row = fetchRowAssoc($stmt, $fields);
.(Para obter o número de linhas retornadas que você pode usar
$stmt->num_rows
.)Você apenas precisa colocar essas duas funções que escrevi em algum lugar do seu script PHP . (por exemplo, bem na parte inferior)
Como funciona :
Meu código usa a
$stmt->result_metadata();
função para descobrir quantos e quais campos são retornados e, a seguir, vincula automaticamente os resultados buscados a referências pré-criadas. Funciona como um encanto!fonte