Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error "Out of memory" usando mysqli

Estas en el tema de Error "Out of memory" usando mysqli en el foro de PHP en Foros del Web. Saludos a todos. Tengo un error y no sé cómo solucionarlo. He visto algunas soluciones, pero no sé aplicarlas en 1and1. Tengo el siguiente método ...
  #1 (permalink)  
Antiguo 18/07/2013, 07:44
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Error "Out of memory" usando mysqli

Saludos a todos. Tengo un error y no sé cómo solucionarlo. He visto algunas soluciones, pero no sé aplicarlas en 1and1.

Tengo el siguiente método en PHP:

Código PHP:
Ver original
  1. public function iniciar_sesion($usuario, $clave){
  2.         if ((isset($usuario)) && (isset($clave))){
  3.             $mysql = new mysqli($this->leer_bdweb_servidor(), $this->leer_bdweb_nombre(), $this->leer_bdweb_usuario(), $this->leer_bdweb_clave());
  4.             if(!isset($mysql->connect_error)){
  5.                 $consulta = "SELECT *
  6.                             FROM `Usuarios`
  7.                             WHERE `nombre` = '$this->nombre' AND `clave` = '$this->clave'";
  8.                 $resultado = $mysql->query($mysql, $consulta);
  9.                 if ($resultado->num_rows()){
  10.                     session_destroy();
  11.                     session_start();
  12.                     $_SESSION['usuario'] = $usuario;
  13.                     $this->escribir_acceso($this::REGISTRADO);
  14.                 }else{
  15.                     $this->terminar_sesion();
  16.                 }
  17.                 $resultado->close();
  18.             }else{
  19.                 session_destroy();
  20.                 session_start();
  21.                 $_SESSION['usuario'] = 'ERR'.$mysql->connect_errno;
  22.                 $this->escribir_acceso($this::ANONIMO);
  23.             }
  24.             $mysql->close($mysql);
  25.         }else{
  26.             $this->terminar_sesion();
  27.         }
  28.     }

El caso es que ésta función me provoca el siguiente error:

Código HTML:
Ver original
  1. Fatal error: Out of memory (allocated 56623104) (tried to allocate 65484 bytes) in /homepages/**/**********/htdocs/*************/recepcion.php on line 252

Mi página está en 1and1.

Si alguien puede ayudarme, se lo agradeceré con un montón de aplausos ()
  #2 (permalink)  
Antiguo 18/07/2013, 08:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error "Out of memory" usando mysqli

MySQL no es PHP. Tampoco la librería MYSQLI es tema del foro de MySQL, sino de PHP.

Movido al foro PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/07/2013, 08:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Error "Out of memory" usando mysqli

¿Que tienes en la línea 252?
  #4 (permalink)  
Antiguo 18/07/2013, 08:54
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Respuesta: Error "Out of memory" usando mysqli

segundo a GatorV y de todos modos puede que huela por algún lado a bucle infinito o desastrósamente grande... mira si esa linea 252 está dentro de algún bucle
  #5 (permalink)  
Antiguo 18/07/2013, 11:39
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error "Out of memory" usando mysqli

Para empezar esto debería marcar error:
Código PHP:
Ver original
  1. $consulta = "SELECT *
  2.                            FROM `Usuarios`
  3.                            WHERE `nombre` = '$this->nombre' AND `clave` = '$this->clave'";

WHERE `nombre` = '$this->nombre' AND `clave` = '{$this->clave}'";

Funciona a pesar de no estar entre llaves?

Bueno, un error que veo en el método es que creas una nueva conexión a base de datos sólo para inicio de sesión y ahí mismo la finalizas.

No sé si pueda afectar en el consumo de memoria, pero sí podría traerte problemas cuando tengas muchos usuarios visitando tu web, verán un mensaje de error por falta de conexiones disponibles.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 18/07/2013, 15:43
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Error "Out of memory" usando mysqli

Gracias a todos por vuestra colaboración. Intentaré afinar el problema según lo que me comentáis.

A GatorV, le indico lo que hay en la linea 252:

Código PHP:
Ver original
  1. $this->iniciar_sesion($_POST['usuario'], $_POST['clave']);

en el siguiente contexto:

Código PHP:
Ver original
  1. public function iniciar_sesion(){
  2.         //Se procesa la información.
  3.         if (isset($_POST['usuario'])){
  4.             if (isset($_POST['clave'])){
  5.                 $this->iniciar_sesion($_POST['usuario'], $_POST['clave']);
  6.                 header('Location: ' . $_SERVER['SERVER_NAME']);
  7.             }else{
  8.                 echo "          <p>\n";
  9.                 echo "            <em>Resultado:</em> Por favor, introduzca la clave.\n";
  10.                 echo "          </p>\n";
  11.             }
  12.         }else{
  13.             echo "          <p>\n";
  14.             echo "            <em>Resultado:</em> Por favor, introduzca su nombre de usuario.\n";
  15.             echo "          </p>\n";
  16.         }
  17.     }

Esta función es llamada:

Código PHP:
Ver original
  1. //Creación de la página.
  2. $web = new Recepcion(AUTOR,
  3.                      FECHA_CREACION,
  4.                      FECHA_MODIFICACION,
  5.                      VERSION);
  6.  
  7. $web->escribir_doctype();
  8. $web->iniciar_html();
  9.     $web->escribir_head();
  10.     $web->iniciar_body();
  11.         $web->escribir_capa_superpuesta();
  12.         $web->iniciar_contenedor();
  13.             $web->iniciar_encabezamiento();
  14.                 $web->escribir_menu_superior();
  15.                 $web->escribir_submenu_superior();
  16.                 $web->escribir_mensaje_de_informacion('');
  17.                 $web->escribir_mensaje_de_aviso('');
  18.                 $web->escribir_mensaje_de_exito('');
  19.                 $web->escribir_mensaje_de_error('');
  20.             $web->finalizar_encabezamiento();
  21.             $web->iniciar_columna_central();
  22.                 $web->iniciar_columna_izquierda();
  23.                     $web->titular_columna_izquierda(TITULO, SUBTITULO);
  24.                     $web->escribir_columna_izquierda();
  25.                     $web->indexar_inicio(HAY_ENLACE_AL_INICIO);
  26.                 $web->finalizar_columna_izquierda();
  27.                 $web->iniciar_columna_derecha();
  28.                     $web->escribir_columna_derecha_introduccion();
  29.                     if(isset($_POST['accion'])){
  30.                         if($_POST['accion']=='iniciar_sesion'){
  31.                             $web->escribir_columna_derecha_inicio_sesion();
  32.                         }elseif($_POST['accion']=='recuperar_clave'){
  33.                             $web->escribir_columna_derecha_recuperacion_clave();
  34.                         }elseif($_POST['accion']=='registrar_usuario'){
  35.                             $web->escribir_columna_derecha_registro_usuario();
  36.                         }else{
  37.                             //Nada.
  38.                         }
  39.                     }else{
  40.                         //Nada.
  41.                     }
  42.                     if(isset($_POST['recuperar_clave'])){
  43.                         $web->enviar_clave();
  44.                     }
  45.                     if(isset($_POST['iniciar_sesion'])){
  46.                         $web->iniciar_sesion();
  47.                     }
  48.                     if(isset($_POST['registrar_usuario'])){
  49.                         $web->registrar_usuario();
  50.                     }
  51.                 $web->finalizar_columna_derecha();
  52.             $web->finalizar_columna_central();
  53.         $web->finalizar_contenedor();
  54.     $web->finalizar_body();
  55.  $web->finalizar_html();

El parámetro "iniciar_sesion" es recibido del siguiente formulario:

Código PHP:
Ver original
  1. public function escribir_columna_derecha_inicio_sesion(){
  2.         echo "          <p>\n";
  3.         echo "            <em>Inicio de sesión</em>";
  4.         echo "          </p>\n";
  5.         echo "          <p>\n";
  6.         echo "            Por favor, rellene los campos abajo descritos\n";
  7.         echo "            si desea iniciar una sesión no anónima.\n";
  8.         echo "          </p>\n";
  9.         echo "          <p>\n";
  10.         echo "            Atenci&oacute;n: La p&aacute;gina se encuentra todav&iacute;a en construcci&oacute;n\n";
  11.         echo "            y no se almacenan de forma persistente los usuario. Es por ello que todas las sesiones son,\n";
  12.         echo "            por ahora anónimas.\n";
  13.         echo "          </p>\n";
  14.         echo "          <p>\n";
  15.         echo "            Disculpe la molestia y gracias por su confianza.\n";
  16.         echo "          </p>\n";
  17.         echo "          \n";
  18.         echo "          <form id='sesion' name='sesion' method='post' action='".$_SERVER['PHP_SELF']."'>\n";
  19.         echo "            <p>\n";
  20.         echo "              <label>\n";
  21.         echo "                Nombre de usuario*:\n";
  22.         echo "                <br/>\n";
  23.         echo "                <input id='usuario' name='usuario' type='text' size='30%' />\n";
  24.         echo "              </label>\n";
  25.         echo "            </p>\n";
  26.         echo "            <p>\n";
  27.         echo "              <label>\n";
  28.         echo "                Contraseña*:\n";
  29.         echo "                <br/>\n";
  30.         echo "                <input id='clave' name='clave' type='text' size='30%' />\n";
  31.         echo "              </label>\n";
  32.         echo "            </p>\n";
  33.         echo "            <p>\n";
  34.         echo "             <input id='iniciar_sesión' name='iniciar_sesion' type='submit' value='Iniciar' />\n";
  35.         echo "            </p>\n";
  36.         echo "          </form>\n";
  37.         echo "          \n";
  38.     }

Como podéis ver, no hay ninguna rutina de repetición en todo el código.

Respecto a las llaves, nunca he tenido problema en introducir el objeto y su método en una cadena destinada a ser una consulta SQL.

P.D. gnzsoloyo, gracias por cambiar el post. La verdad que cuando fui a publicarlo dudaba de ponerlo en un lado o en otro.
  #7 (permalink)  
Antiguo 18/07/2013, 15:59
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Error "Out of memory" usando mysqli

Cita:
Bueno, un error que veo en el método es que creas una nueva conexión a base de datos sólo para inicio de sesión y ahí mismo la finalizas.
Entiendo lo que me comentas, Triby. Sin embargo, la conexión con esa base de datos acaba ahí porque ya no se vuelve a utilizar. Distingo la base de parámetros de la web (que contiene sólo usuarios, contraseñas y correos) de la base de los datos de la información que contenga la web. Por otra parte, no preveo una visita masiva de la página. No obstante, agradezco tu sugerencia y si, aparte lo dicho, sigues pensando lo mismo, lo tendré en consideración.
  #8 (permalink)  
Antiguo 18/07/2013, 16:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Error "Out of memory" usando mysqli

Pues un problema de recursión, estas llamando a la misma función (iniciar_sesión) continuamente y eso hace que PHP se termine la memoria, aunque se me hace raro que no te marque error de tener dos funciones con el mismo nombre, ¿estas aplicando algún tipo de recursión?
  #9 (permalink)  
Antiguo 18/07/2013, 16:21
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error "Out of memory" usando mysqli

Se supone que debes tener una sola conexión a base de datos en todo tu sistema, para evitar consumir recursos innecesariamente abriendo y cerrando conexiones cada que necesites hacer una consulta.

Entonces, primero estableces la conexión a base de datos y envías la variable como parámetro a cada función que la requiera.

Aunque también podrías usar singleton (no recomendable según los entendidos), factory o algun otro patrón que te permita acceder a esa variable sin tener que crear conexiones nuevas cada vez.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 18/07/2013, 16:32
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Error "Out of memory" usando mysqli

Ya he visto dónde estaba el error. Sin darme cuenta había dado a un método de la clase extendida el mismo nombre que a otro de la extensora. En la línea 252 estaba llamando al método "iniciar_sesion()" de la clase padre dentro de la clase "iniciar_sesión()" de la clase hija, pero al no haberme dado cuenta que tenían el mismo nombre, el servidor realizaba una llamada recursiva. Lo he solucionado con un simple "parent::iniciar_sesion()".

Muchas gracias a todos por vuestra ayuda. Soy nuevo en este foro y veo que es fenomenal por la gente que lo formáis.

P.D. No daré el post por cerrado todavía, pues Triby me lanzó una propuesta que yo luego puntualicé y me gustaría seguir contando con su opinión.
  #11 (permalink)  
Antiguo 18/07/2013, 16:35
 
Fecha de Ingreso: julio-2013
Mensajes: 53
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Error "Out of memory" usando mysqli

Ah, jeje... :P no había visto vuestros posts. Gracias de nuevo. Tendré en cuenta tu idea Triby.
Ahora sí puedo marcar el tema como solucionado. Espero poder corresponder al favor.

Un saludo a todos.

Etiquetas: 1and1, memory, mysql, mysqli
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:00.