Aquí está mi 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();
Recibo el error en la última línea como: Llamada al método indefinido mysqli_stmt :: get_result ()
Aquí está el 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();
}
}
}
Si escribo esta línea:
if(!stmt) echo 'Statement prepared'; else echo 'Statement NOT prepared';
Imprime 'Declaración NO preparada' . ¿Si ejecuto la consulta directamente en el IDE reemplazando? marcas con valores, funciona bien. Tenga en cuenta que el objeto $ conn funciona bien en otras consultas del proyecto.
Cualquier ayuda por favor .......
$stmt = $conn->mysqli->stmt_init();
?$_POST['EmailID'], $_POST['SLA'], $_POST['Password']
enviaron correctamente utilizando un formulario HTML con el método POSTRespuestas:
Lea las notas de usuario para este método:
http://php.net/manual/en/mysqli-stmt.get-result.php
Requiere el controlador mysqlnd ... si no está instalado en su espacio web, tendrá que trabajar con BIND_RESULT & FETCH.
https://secure.php.net/manual/en/mysqli-stmt.bind-result.php
https://secure.php.net/manual/en/mysqli-stmt.fetch.php
fuente
mysqli_stmt::get_result()
solo está disponible en PHP v5.3.0 o superior.php_mysqli_mysqlnd.dll
? Solo lo tendríaphp_mysqli.dll
en miext
carpeta.Entonces, si el controlador MySQL Native Driver (mysqlnd) no está disponible y, por lo tanto, se usa bind_result y fetch en lugar de get_result , el código se convierte en:
fuente
$EmailVerfied
se crea mediante la llamada abind_result()
.¡A su sistema le falta el controlador mysqlnd!
Si puede instalar nuevos paquetes en su servidor (basado en Debian / Ubuntu), instale el controlador:
y luego reinicie su servidor web:
fuente
para aquellos que buscan una alternativa a
$result = $stmt->get_result()
, hice esta función que le permite imitar$result->fetch_assoc()
pero usando directamente el objeto stmt:como puede ver, crea una matriz y la obtiene con los datos de la fila, ya que se usa
$stmt->fetch()
internamente, puede llamarla tal como lo llamaríamysqli_result::fetch_assoc
(solo asegúrese de que el$stmt
objeto esté abierto y el resultado esté almacenado):fuente
$statement->store_result();
es necesario antes de llamar a la función, ¿por qué no incluirla en la función?Con PHP versión 7.2, utilicé nd_mysqli en lugar de mysqli y funcionó como se esperaba.
Pasos para habilitarlo en el servidor de alojamiento de godaddy
fuente
Sé que esto ya fue respondido en cuanto a cuál es el problema real, sin embargo, quiero ofrecer una solución alternativa simple.
Quería usar el método get_results (), sin embargo, no tenía el controlador y no estoy en ningún lugar donde pueda agregarlo. Entonces, antes de llamar
Creé una matriz vacía y luego enlacé los resultados como claves en esa matriz:
para que esos resultados puedan pasarse fácilmente a métodos o convertirse en un objeto para su uso posterior.
Espero que esto ayude a cualquiera que esté buscando hacer algo similar.
fuente
Recibí este mismo error en mi servidor: PHP 7.0 con mysqlnd extensión ya habilitada.
La solución fue para mí (gracias a esta página ) fue deseleccionar la extensión mysqli y seleccionar nd_mysqli en su lugar.
NB - Es posible que pueda acceder al selector de extensiones en su cPanel. (Accedo al mío a través de la opción Seleccionar versión de PHP ).
fuente
session_start()
función de PHP me convirtió en un valor inexistente. Luego actualicé a la versión7.2
de PHP y cambié la extensión demysqli
and_mysqli
(fijo). Pero tengo dos preguntas, ¿cuál es la diferencia entre las dos? y si habría alguna brecha en la seguridad para usar esa extensión?Me doy cuenta de que ha pasado un tiempo desde que hubo alguna actividad nueva sobre esta cuestión. Pero, como han comentado otros carteles,
get_result()
ahora solo está disponible en PHP mediante la instalación del controlador nativo de MySQL (mysqlnd) y, en algunos casos, puede que no sea posible o deseable instalar mysqlnd. Entonces, pensé que sería útil publicar esta respuesta con información sobre cómo obtener la funcionalidad queget_result()
ofrece, sin usarget_result()
.get_result()
es / se combinó a menudo confetch_array()
para recorrer un conjunto de resultados y almacenar los valores de cada fila del conjunto de resultados en una matriz asociativa o indexada numéricamente. Por ejemplo, el siguiente código usa get_result () con fetch_array () para recorrer un conjunto de resultados, almacenando los valores de cada fila en la matriz $ data [] indexada numéricamente:Sin embargo, si
get_result()
no está disponible (porque mysqlnd no está instalado), esto lleva al problema de cómo almacenar los valores de cada fila de un conjunto de resultados en una matriz, sin usarget_result()
. O cómo migrar el código heredado que solíaget_result()
ejecutarse sin él (por ejemplo, usarlo en subind_result()
lugar), mientras afecta al resto del código lo menos posible.Resulta que almacenar los valores de cada fila en una matriz indexada numéricamente no es tan sencillo de usar
bind_result()
.bind_result()
espera una lista de variables escalares (no una matriz). Por lo tanto, se necesita algo de esfuerzo para que almacene los valores de cada fila del conjunto de resultados en una matriz.Por supuesto, el código podría modificarse fácilmente de la siguiente manera:
Pero, esto requiere que enumeremos explícitamente $ data [0], $ data [1], etc. individualmente en la llamada a
bind_result()
, lo cual no es ideal. Queremos una solución que no requiera que tengamos que enumerar explícitamente $ datos [0], $ datos [1], ... $ datos [N-1] (donde N es el número de campos en la declaración de selección) en la llamada abind_results()
. Si estamos migrando una aplicación heredada que tiene una gran cantidad de consultas, y cada consulta puede contener una cantidad diferente de campos en elselect
cláusula, la migración será muy laboriosa y propensa a errores si usamos una solución como la anterior. .Idealmente, queremos un fragmento de código de 'reemplazo directo', para reemplazar solo la línea que contiene la
get_result()
función y el bucle while () en la siguiente línea. El código de reemplazo debe tener la misma función que el código que está reemplazando, sin afectar ninguna de las líneas anteriores o posteriores, incluidas las líneas dentro del bucle while (). Idealmente, queremos que el código de reemplazo sea lo más compacto posible, y no queremos tener que adaptar el código de reemplazo en función del número de campos en elselect
cláusula de la consulta.Buscando en Internet, encontré una serie de soluciones que se utilizan
bind_param()
concall_user_func_array()
(por ejemplo, enlazar dinámicamente los parámetros mysqli_stmt y luego enlazar el resultado (PHP) ), pero la mayoría de las soluciones que encontré finalmente conducen a que los resultados se almacenen en una matriz asociativa, no una matriz indexada numéricamente, y muchas de estas soluciones no eran tan compactas como me gustaría y / o no eran adecuadas como 'reemplazos directos'. Sin embargo, a partir de los ejemplos que encontré, pude improvisar esta solución, que se ajusta a los requisitos:Por supuesto, el ciclo for () se puede contraer en una línea para hacerlo más compacto.
Espero que esto ayude a cualquiera que esté buscando una solución que utilice
bind_result()
para almacenar los valores de cada fila en una matriz indexada numéricamente y / o busque una forma de migrar el código heredado usandoget_result()
. Comentarios bienvenidos.fuente
Esta es mi alternativa. Está orientado a objetos y se parece más a mysql / mysqli.
Uso:
fuente
He escrito dos funciones simples que brindan la misma funcionalidad que
$stmt->get_result();
, pero no requieren el controlador mysqlnd.Simplemente reemplaza
$result = $stmt->get_result();
con$fields = bindAll($stmt);
y
$row= $stmt->get_result();
con$row = fetchRowAssoc($stmt, $fields);
.(Para obtener el número de filas devueltas, puede usar
$stmt->num_rows
).Solo tiene que colocar estas dos funciones que he escrito en algún lugar de su script PHP . (por ejemplo, justo en la parte inferior)
¿Cómo funciona ?
Mi código usa la
$stmt->result_metadata();
función para averiguar cuántos y qué campos se devuelven y luego vincula automáticamente los resultados obtenidos a las referencias creadas previamente. ¡Funciona de maravilla!fuente