[PHP] Undefined variable: mysqli

E

Pues nada, que al pasar de PHP 5.4 a 5.6 me está petando el código y no se por qué.

<?

//Fichero de configuración de la base de datos

define("HOST", "localhost"); //Host
define("USER", "xxx"); //User
define("PASSWORD", "xxx"); //Pass
define("DATABASE", "xxx"); //Database
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);

?>
<?php
require_once('config.php'); //config de la base de datos

//creamos la cache
if ($stmt = $mysqli->prepare("XXXX")) { <- Aqui es donde tira el error.

El error que tira:

PHP Notice:  Undefined variable: mysqli in /home/elraro/XXX.php on line 24
PHP Fatal error:  Call to a member function prepare() on null in /home/elraro/XXX.php on line 24
vincen

Es hosting o es VPS/Dedicado? parece que se ha cascado al actualizar

Crea un phpinfo.php con

<?php
phpinfo();

y CONTROL + F y busca mysqli, a ver si te lo esta cargando.

1 respuesta
E

#2 es un dedicado, la web me funciona salvo el script este que ejecuto en segundo plano. mysqli está cargado y funcionando perfectamente.

No entiendo que está fallando xD

1 respuesta
vincen

#3 Es una funcion? le tienes puesto el "global $mysqli"?

1 respuesta
E

#4 no es función, ahora mismo no tengo nada programado en POO. Aunque debería hacerlo xD pero es extraño, ha estado funcionando hasta ahora, con la actualización hizo chof.

Kiroushi

Y por cosas como estas, niños, no se actualiza el servidor de producción.

2 1 respuesta
E

#6 es lo que tiene ser pobre, bastante que puedo pagar 1 servidor xD

2 respuestas
Kiroushi

#7 En un mismo servidor puedes crear 2 entornos sin problema alguno.

1 1 respuesta
E

#8 sin VMs o containers? si es así me vendría genial, aunque no tengo mucho tiempo para probar cosas :(

Me arrepiento de haber actualizado Debian, vaya tela xD

1 respuesta
vincen

#7 Prueba a sacar el prepare fuera

$stmt = $mysqli->prepare("XXXX");
if($stmt)
{
}
1 respuesta
E

#10 lo probé e ídem :S Estoy repasando la documentación y cambios de la versión 5.4 a la 5.6 pero no encuentro cambios relativos a ello...

RaymaN

¿Puedes poner todo el contenido que hay antes del problema? Solo pones 5 líneas pero el error dice que está en la 24, igual hay algo que no toca.

1 respuesta
B

Lo mismo te rechaza la petición, revisa la salida de $mysqli->connect_error .

1 respuesta
E

#12 no toca nada más, hay solo comentario de código y esto:

$timestamp = time();

//Cogemos la hora y el minuto, importante para actualizar jugadores a las horas en punto
$hora = date('H');
$minuto = date('i');

$protocolo_ping = false;

#13 eso pensé en un principio, así que aproveché y añadí código para comprobarlo, y nada:

/* verificar conexión */
if (mysqli_connect_errno()) {
    printf("Fallo en la conexion a la base de datos: %s\n", mysqli_connect_error());
    exit();
}
vincen

Estas usando la misma conexion de $mysql-> para otras cosas?

Definela así en el config.php:

$db_host = "localhost"; 
$db_name = "";
$db_user = "";
$db_pass = ""; 

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
GLOBAL $mysqli;
1 respuesta
Kiroushi

#9 Sí, se puede xD Puedes usar un PHP con fastcgi y otro con php-fpm, o varios con php-fpm (hasta donde creo recordar).

E

#15 estoy usándola sí y funciona perfecto.

Me estoy dando cuenta de que es algo a la hora de ejecutar ese script. Yo el script lo ejecuto mediante un cron, y es ahí donde me está tirando el error. Yo lo ejecuto con:

php script.php

1 respuesta
Kiroushi

#17 Ten en cuenta que php-cli y php-fpm (que seguramente sea el que estás usando) son dos procesos diferentes.

Haz un php -v en consola para ver qué versión estás ejecutando de php-cli, y luego un phpinfo(); para ver el fpm.

1 respuesta
E

#18

PHP 5.6.9-0+deb8u1 (cli) (built: Jun 5 2015 11:03:27)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies

edit: parece que es cli no?

1 respuesta
Kiroushi

#19 El cli es el command line, es el php con el que ejecutas scripts desde la línea de comandos.

El otro es un módulo que cargas o bien desde apache, o bien lo metes en un socket para que nginx o apache conecten.

¿phpinfo(); te da la misma versión que el command line?

1 respuesta
E

#20 la misma: PHP Version 5.6.9-0+deb8u1

Y sí, el php-cli está instalado y funciona, no entiendo por qué al hacer:

php script.php

me tira el error. Alucino xD 2 años sin modificar el script y me falla al actualizar xD

1 respuesta
Kiroushi

#21 ¿Has probado a poner todo el contenido de config.php y el script en el mismo fichero?

1 respuesta
E

#22 acabo de probarlo y así funciona. No lo entiendo xD

1 respuesta
Kiroushi

#23 Tal vez sea algún cambio de especificación entre el PHP 5.4 y 5.6.

Prueba a poner require DIR . '/config.php';

1 respuesta
E

#24 no, ahora han cambiado y en los require también es necesario añadir <?php al inicio, no es suficiente añadir <?

:ninjaedit:

Solucionado y lección aprendida xD

1 respuesta
B

#25 La forma corta estaba "deprecated" desde hace eones.

1 1 respuesta
E

#26 gracias por el apunte, revisaré los scripts, por si cometí ese error en alguno más. De todas formas, si lo eliminan, lo suyo es avisar, busqué en los cambios y na de na ;(

1 respuesta
B

#27 En realidad en php 5.6 las puedes usar pero tienes que activarlo en la config php.ini y supongo que por defecto te la desactivaría.
Lectura obligada https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md .

1
Cobre

a mi lo que me da la sensacion es que la variable $mysqli esta en diferentes ficheros, las variables se comparten asi ?
Son suposiciones no aseguro nada xd

prueba a poner $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); en el otro fichero.

1 respuesta
E

#29 al tu hacer un include o un require es como si "juntases varios trozos de papel" para que parezca 1 solo, y luego se ejecuta. Por tanto, si en un fichero tienes una variable y en otro haces un include o require, podrás leer esa variable (siempre que tenga la visibilidad correcta)