En local funciona, en el servidor no

  • Autor Autor AlexMnrs
  • Fecha de inicio Fecha de inicio
A

AlexMnrs

Beta
Verificación en dos pasos activada
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Buenas!

Hoy era el día en que iba a lanzar una web al público en la que llevo un tiempo trabajando, pero al parecer se va a retrasar debido a unos problemas que no me esperaba.

Básicamente en local el sitio funciona perfectamente, no tiene errores, pero al subirla al servidor tengo 1 problema, no funciona ni el login ni el registro.

Os voy a dejar el código de los archivos responsables de que estas dos secciones (login y registro) funcionen:

conectar.php

PHP:
<?php

include_once('inc/config.php');

// Validar formulario
if (!isset($_POST['usuario']) || $_POST['usuario'] == '' || $_POST['pass'] == '') exit;

    // sprintf nos devuelve un string formateado y de esa manera protegemos las peticiones de inyecciones sql
    $login = sprintf("SELECT * FROM ".$prefijo."_usuarios WHERE usuario=%s AND pass=%s OR email=%s AND pass=%s ",
                        formatearcadena($_POST['usuario'], "text"),
                        formatearcadena(md5($_POST['pass']), "text"),
                        formatearcadena($_POST['email'], "text"),
                        formatearcadena(md5($_POST['pass']), "text"));
    $consulta_login = mysqli_query($conexion, $login) or die('Error: ' . mysqli_error($conexion));
    $datos_login = mysqli_fetch_assoc($consulta_login);
    $cantidad_login = mysqli_num_rows($consulta_login); // 0 = No existe, 1 = Existe

    if ($cantidad_login == 1) {
        $_SESSION['id'] = $datos_login['id'];
        $_SESSION['usuario'] = $datos_login['usuario'];

        // LA SESSION DE ADMIN DESAPARECE CUANDO CIERRAS EL NAVEGADOR. FIX!!!
        if ($_SESSION['id'] == 1 && $_SESSION['usuario'] == "admin") {
            $_SESSION['admin'] = true;
        }

        if (isset($_POST['mantener-sesion']) && $_POST['mantener-sesion'] == 'on') {
            // Mantener la sesión iniciada
            setcookie('bci', $datos_login['id'], time()+30*24*60*60, '/');
            setcookie('bcu', $datos_login['usuario'], time()+30*24*60*60, '/');
        }

        echo 'correcto';
    } else echo 'error';

    mysqli_free_result($consulta_login);

?>

registrar.php

PHP:
<?php

include_once('inc/config.php');

// Validar formulario
if (!isset($_POST['nombre']) || $_POST['usuario'] == '' || $_POST['email'] == '' || $_POST['pass1'] == '') exit;

    // Comprueba si el usuario/email ya existe en la base de datos
    // sprintf nos devuelve un string formateado y de esa manera protegemos las peticiones de inyecciones sql
    $comprobar_existe = sprintf("SELECT * FROM ".$prefijo."_usuarios WHERE email=%s OR usuario=%s",
                        formatearcadena($_POST['email'], "text"),
                        formatearcadena($_POST['usuario'], "text"));
    $consulta_existe = mysqli_query($conexion, $comprobar_existe) or die('Error: ' . mysqli_error($conexion));
    $datos_existe = mysqli_fetch_assoc($consulta_existe);
    $cantidad_existe = mysqli_num_rows($consulta_existe); // 0 = No existe, 1 = Existe

    if ($cantidad_existe == 0) {
        // Insertar usuario
        $insertar = sprintf("INSERT INTO ".$prefijo."_usuarios (nombre, usuario, email, pass) VALUES (%s, %s, %s, %s)",
                    formatearcadena($_POST['nombre'], "text"),
                    formatearcadena($_POST['usuario'], "text"),
                    formatearcadena($_POST['email'], "text"),
                    formatearcadena(md5($_POST['pass1']), "text"));

        // Ejecutar la consulta
        $resultado_insertar = mysqli_query($conexion, $insertar) or die(mysqli_error($conexion));
        echo 'correcto';
    } else {
        echo 'existe';
    }

    mysqli_free_result($consulta_existe);

?>

validar.js

PHP:
var maximoCaracteresNombre = 30;
var maximoCaracteresUsuarioPass = 20;
var maximoCaracteresEmail = 100;

function conecta(usuario, pass) {
    if (limpiar(usuario) != '' && limpiar(pass) != '') {
            // Intentar llevar a cabo el login
            $.ajax({
                // Especificamos si será una petición POST o GET
                type: 'POST',
                // Le pasamos la URL para la petición
                url: 'inc/conectar.php',
                // Establecemos si la petición será guardada en la cache del navegador o no.
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache
                // al final de la URL de la petición
                cache: false,
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo
                // los datos que el usuario ha ingresado en el formulario de registro
                data: $('#frmConectar').serialize(),
                // Código a ejecutar si la petición es satisfactoria
                // la respuesta es pasada como argumento a la función
                success: function(respuesta) {
                    if (limpiar(respuesta) == 'correcto') {
                        // Recargar la página
                        window.location.reload();
                    } else if (limpiar(respuesta) == 'error') {
                        // Mostrar error
                        $('#login-erroneo').fadeIn(500);
                        $('#login-mensaje-error').text('Datos incorrectos. Vuelve a intentarlo.');
                    }
                }
            });
    } else {
        $('#login-erroneo').fadeIn(500);
        $('#login-mensaje-error').text('Todos los campos son obligatorios');
    }
}

function registro(nombre, usuario, email, pass1, pass2, verifica) {
    if (limpiar(nombre) != '' && limpiar(usuario) != '' && limpiar(email) != '' && limpiar(pass1) != '' && limpiar(pass2) != '' && limpiar(verifica) == '') {
        if (limpiar(pass1) != limpiar(pass2)) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('Las contraseñas no coinciden');
        } else if (limpiar(nombre).length > maximoCaracteresNombre) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El nombre es demasiado largo');
        } else if (limpiar(usuario).length > maximoCaracteresUsuarioPass) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El usuario es demasiado largo');
        } else if (limpiar(email).length > maximoCaracteresEmail) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El email es demasiado largo');
        } else if (limpiar(pass1).length > maximoCaracteresUsuarioPass) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('La contraseña es demasiado larga');
        } else {
            // Intentar llevar a cabo el registro
            $.ajax({
                // Especificamos si será una petición POST o GET
                type: 'POST',
                // Le pasamos la URL para la petición
                url: 'inc/registrar.php',
                // Establecemos si la petición será guardada en la cache del navegador o no.
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache
                // al final de la URL de la petición
                cache: false,
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo
                // los datos que el usuario ha ingresado en el formulario de registro
                data: $('#frmRegistro').serialize(),
                // Código a ejecutar si la petición es satisfactoria
                // la respuesta es pasada como argumento a la función
                success: function(respuesta) {
                    if (limpiar(respuesta) == 'correcto') {
                        $('#registro-erroneo').fadeOut(500);
                        $('#registro-correcto').fadeIn(500);
                        $('#registro-mensaje-ok').text('Usuario registrado satisfactoriamente. Redirigiendo a la página de login...');
                        setTimeout(function() {
                            window.location.href = url + "conectar";
                        }, 3000);

                    } else if (limpiar(respuesta) == 'existe') {
                        // Mostrar error
                        $('#registro-erroneo').fadeIn(500);
                        $('#registro-mensaje-error').text('El usuario o email ya está registrado');
                    }
                }
            });
        }
    } else {
        $('#registro-erroneo').fadeIn(500);
        $('#registro-mensaje-error').text('Todos los campos son obligatorios');
    }
}

function limpiar(valor) {
    var cadena = valor.split(' ').join('');
    return cadena;
}

Y en el formulario de registro, al botón le paso un onclick="registro(nombre.value, usuario.value, email.value, pass1.value, pass2.value, verifica.value);" y en el de login lo mismo pero onclick="conecta(usuario.value, pass.value);"

Como digo, en local funciona todo perfectamente. Puedo conectarme con mi cuenta, registrar nuevas, etc. lo normal. Sin embargo, en el servidor cuando pulso en el botón de conectarme o en el de registrar y miro el network en la consola de Chrome recibe un error 500 por respuesta:

K1ybEjn.png


Pero eso no es todo, he probado a subir la web a otro servidor, Hostinger en este caso que es el que uso para testear cosas, y tampoco funcionan los botones, pero el status en el network ya no es un 500 Internal Server Error, sino un 200 OK...

No sé qué puede estar pasando, pero me trae loco :ambivalence: a ver si podéis arrojarme un poco de luz porque estoy algo perdido ahora mismo...

Muchas gracias!
 
Intenta colocando la dirección absoluta en el url del ajax, una vez tuve un problema con eso.
 
Última edición:
Intenta colocando la dirección absoluta en el url del ajax, una vez tuve un problema con eso.

Si te refieres a esto:

PHP:
var url = 'http://miweb.com/';
var maximoCaracteresNombre = 30; 
var maximoCaracteresUsuarioPass = 20; 
var maximoCaracteresEmail = 100; 

function conecta(usuario, pass) { 
    if (limpiar(usuario) != '' && limpiar(pass) != '') { 
            // Intentar llevar a cabo el login 
            $.ajax({ 
                // Especificamos si será una petición POST o GET 
                type: 'POST', 
                // Le pasamos la URL para la petición 
                url: url + 'inc/conectar.php', 
                // Establecemos si la petición será guardada en la cache del navegador o no. 
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache 
                // al final de la URL de la petición 
                cache: false, 
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo 
                // los datos que el usuario ha ingresado en el formulario de registro 
                data: $('#frmConectar').serialize(), 
                // Código a ejecutar si la petición es satisfactoria 
                // la respuesta es pasada como argumento a la función 
                success: function(respuesta) { 
                    if (limpiar(respuesta) == 'correcto') { 
                        // Recargar la página 
                        window.location.reload(); 
                    } else if (limpiar(respuesta) == 'error') { 
                        // Mostrar error 
                        $('#login-erroneo').fadeIn(500); 
                        $('#login-mensaje-error').text('Datos incorrectos. Vuelve a intentarlo.'); 
                    } 
                } 
            }); 
    } else { 
        $('#login-erroneo').fadeIn(500); 
        $('#login-mensaje-error').text('Todos los campos son obligatorios'); 
    } 
} 

function registro(nombre, usuario, email, pass1, pass2, verifica) { 
    if (limpiar(nombre) != '' && limpiar(usuario) != '' && limpiar(email) != '' && limpiar(pass1) != '' && limpiar(pass2) != '' && limpiar(verifica) == '') { 
        if (limpiar(pass1) != limpiar(pass2)) { 
            $('#registro-erroneo').fadeIn(500); 
            $('#registro-mensaje-error').text('Las contraseñas no coinciden'); 
        } else if (limpiar(nombre).length > maximoCaracteresNombre) { 
            $('#registro-erroneo').fadeIn(500); 
            $('#registro-mensaje-error').text('El nombre es demasiado largo'); 
        } else if (limpiar(usuario).length > maximoCaracteresUsuarioPass) { 
            $('#registro-erroneo').fadeIn(500); 
            $('#registro-mensaje-error').text('El usuario es demasiado largo'); 
        } else if (limpiar(email).length > maximoCaracteresEmail) { 
            $('#registro-erroneo').fadeIn(500); 
            $('#registro-mensaje-error').text('El email es demasiado largo'); 
        } else if (limpiar(pass1).length > maximoCaracteresUsuarioPass) { 
            $('#registro-erroneo').fadeIn(500); 
            $('#registro-mensaje-error').text('La contraseña es demasiado larga'); 
        } else { 
            // Intentar llevar a cabo el registro 
            $.ajax({ 
                // Especificamos si será una petición POST o GET 
                type: 'POST', 
                // Le pasamos la URL para la petición 
                url: url + 'inc/registrar.php', 
                // Establecemos si la petición será guardada en la cache del navegador o no. 
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache 
                // al final de la URL de la petición 
                cache: false, 
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo 
                // los datos que el usuario ha ingresado en el formulario de registro 
                data: $('#frmRegistro').serialize(), 
                // Código a ejecutar si la petición es satisfactoria 
                // la respuesta es pasada como argumento a la función 
                success: function(respuesta) { 
                    if (limpiar(respuesta) == 'correcto') { 
                        $('#registro-erroneo').fadeOut(500); 
                        $('#registro-correcto').fadeIn(500); 
                        $('#registro-mensaje-ok').text('Usuario registrado satisfactoriamente. Redirigiendo a la página de login...'); 
                        setTimeout(function() { 
                            window.location.href = url + "conectar"; 
                        }, 3000); 

                    } else if (limpiar(respuesta) == 'existe') { 
                        // Mostrar error 
                        $('#registro-erroneo').fadeIn(500); 
                        $('#registro-mensaje-error').text('El usuario o email ya está registrado'); 
                    } 
                } 
            }); 
        } 
    } else { 
        $('#registro-erroneo').fadeIn(500); 
        $('#registro-mensaje-error').text('Todos los campos son obligatorios'); 
    } 
} 

function limpiar(valor) { 
    var cadena = valor.split(' ').join(''); 
    return cadena; 
}

Así es como lo tenía antes, pero pasa exactamente igual, no hay ninguna diferencia :ambivalence:
 
Y si la versión de php en tu hosting web no es la misma de la de tu servidor local?
 
Última edición:
Y si la versión de php en tu hosting web no es la misma de la de tu servidor local?

Le preguntaré al colega que me hostea, ya que el hospedaje es suyo y como tiene espacio de sobras me hizo el favor de darme alojamiento. Pero eso podría ser el problema? Toda la web está funcionando con normalidad excepto eso :ambivalence: pero también es raro que en su host los botones reciban un error 500 y en Hostinger por ejemplo no. No sé, me estoy volviendo loco :lol:
 
Puede ser, una vez me sucedió algo parecido y era por la versión de PHP, esto, ya que usaba algo con mysqli pero el host donde generaba el problema aun no soportaba algunas funciones.... Revisa esto, y ya luego mirar paso a paso la cuestión.
 
[MENTION=49560]AlexMnrs[/MENTION] si me das el URL tal vez pueda encontrarle el error...
 
Puede ser, una vez me sucedió algo parecido y era por la versión de PHP, esto, ya que usaba algo con mysqli pero el host donde generaba el problema aun no soportaba algunas funciones.... Revisa esto, y ya luego mirar paso a paso la cuestión.

Parece que en el hosting se usa la versión 5.5 de PHP y yo en local tengo la 5.6.23. Me ha dicho que en cuanto tenga un momento lo cambiará y a ver si es eso. Tantos problemas puede ocasionar una versión de diferencia? Es increíble 😱

[MENTION=49560]AlexMnrs[/MENTION] si me das el URL tal vez pueda encontrarle el error...

Te lo daría compañero, pero es que no vas a ver nada que no haya comentado ya en el post. Lo único que se ve es el error 500 al pulsar los botones de los formularios.
 
Primero fíjate que si sea la url correcta a la que se está haciendo la petición. Si esta es correcta checa la respuesta que te está dando.
 
Hemos mirado los logs y esto es lo que encontramos:

Insertar CODE, HTML o PHP:
Wed Sep 14 00:32:58.920716 2016] [lsapi:error] [pid 861678:tid 140526076339968] [client XX.XX.XX.XX:59174] [host xxxxxxxxxx.com] Backend fatal error: PHP Fatal error:  Call to undefined function formatearcadena() in /home/xxxxxxx/domains/xxxxxxxx.com/public_html/inc/conectar.php on line 10\n, referer: http://xxxxxxxx.com/conectar

Por lo que al parecer el problema está en la función formatearcadena() (originalmente llamada "GetSQLValueString") que es la siguiente:

PHP:
function formatearcadena($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  //Iniciamos la variable $conexion
  global $conexion;

  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  //Agregamos $conexion en las funciones mysqli_real_escape_string y mysqli_escape_string
  $theValue = function_exists("mysqli_real_escape_string") ? mysqli_real_escape_string($conexion,$theValue) : mysqli_escape_string($conexion,$theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

No la escribí yo, es de Dreamweaver (no lo uso, simplemente leí que recomendaban esa función en particular para seguridad).

Pero sigo sin saber qué pasa, por qué en local la función no da ningún problema y en el servidor sí, es un poco extraño todo...
 
Última edición:
Cómo que "es de DreamWeaver"? Cómo o dónde estás incluyendo el archivo dónde está la función?
 
Cómo que "es de DreamWeaver"? Cómo o dónde estás incluyendo el archivo dónde está la función?

Como ya sabrás, Dreamweaver define algunas funciones propias y esta es una de ellas. Hace una validación que evita la inyección SQL en nuestra base de datos, además de formatear los datos según su tipo (texto, numérico...)

Estoy totalmente en contra de usar Dreamweaver para programar, yo uso Sublime Text, pero esa función en particular la usan muchos programadores porque les parece segura, o al menos eso es lo que yo he leído en la mayoría de los casos.

La función la tengo en un archivo funciones.php dentro de la carpeta inc. Ese archivo lo incluyo en el config.php al mismo tiempo que incluyo también el archivo conexion.php.
 
Como ya sabrás, Dreamweaver define algunas funciones propias y esta es una de ellas. Hace una validación que evita la inyección SQL en nuestra base de datos, además de formatear los datos según su tipo (texto, numérico...)

Estoy totalmente en contra de usar Dreamweaver para programar, yo uso Sublime Text, pero esa función en particular la usan muchos programadores porque les parece segura, o al menos eso es lo que yo he leído en la mayoría de los casos.

La función la tengo en un archivo funciones.php dentro de la carpeta inc. Ese archivo lo incluyo en el config.php al mismo tiempo que incluyo también el archivo conexion.php.

Pues no, no sabía. Nunca me ha gustado DW, la única vez que "lo usé" fue al inicio de mi anterior trabajo, que prácticamente me obligaron a usarlo (no conocían otra cosa que no fuera DW). :topsy_turvy:

Pues checa que si se estén agregando correctamente los archivos, ya que está claro el error, la función no existe, y si no existe es porque no se ha de estar agregando bien.

Te recomiendo que uses __DIR__ para incluir archivos, ya que me ha llegado a dar problemas de que se incluye de forma diferente dependiendo de dónde los llames.
 
Última edición:
Pues no, no sabía. Nunca me ha gustado DW, la única vez que "lo usé" fue al inicio de mi anterior trabajo, que prácticamente me obligaron a usarlo (no conocían otra cosa que no fuera DW). :topsy_turvy:

Pues checa que si se estén agregando correctamente los archivos, ya que está claro el error, la función no existe, y si no existe es porque no se ha de estar agregando bien

En el archivo funciones.php tengo otras funciones que sí están funcionando sin problema, eso es lo extraño... Debe de ser algo del código de esa función en particular, quizás el global $conexion; no lo está cogiendo bien por alguna razón, no sé... :fie:
 
En el archivo funciones.php tengo otras funciones que sí están funcionando sin problema, eso es lo extraño... Debe de ser algo del código de esa función en particular, quizás el global $conexion; no lo está cogiendo bien por alguna razón, no sé... :fie:

Si ese fuera el caso te daría otro error, algo como "la función mysqli_real_escape_string necesita un recurso mysqli como primer parametro y que le estás enviand null" no que la función no existe.
 
Es que si no es problema del código en particular, de qué podría ser entonces? Está bien incluído, si no las demás funciones tampoco estarían funcionando, no tiene sentido... :ambivalence:
 
Pues sin ver los códigos completos, a saber que cosa podría ser. :fatigue:
 
Pues sin ver los códigos completos, a saber que cosa podría ser. :fatigue:

¿Qué más códigos necesitas? Si ya he puesto todos los de los archivos que están relacionados con el problema, o eso creo, y os he dado todos los detalles que se me han ocurrido. No sé qué más poner, sólo falta ya adjuntar la web en .zip xD
 
¿Qué más códigos necesitas? Si ya he puesto todos los de los archivos que están relacionados con el problema, o eso creo, y os he dado todos los detalles que se me han ocurrido. No sé qué más poner, sólo falta ya adjuntar la web en .zip xD

Pues practicamente eso. :welcoming: Cuando menos el archivo completo de conexion, el archivo de dónde se hace el Ajax y el archivo de las funciones, así como si hay algún archivo intermedio entre la conexión y las funciones.

Todo eso para poder ver bien como se están incluyendo y en dado caso poder probarlo uno mismo a ver que puede estar pasando.

Saludos.
 
Pues practicamente eso. :welcoming: Cuando menos el archivo completo de conexion, el archivo de dónde se hace el Ajax y el archivo de las funciones, así como si hay algún archivo intermedio entre la conexión y las funciones.

Todo eso para poder ver bien como se están incluyendo y en dado caso poder probarlo uno mismo a ver que puede estar pasando.

Saludos.

conexion.php

PHP:
<?php

// Mantener la sesión activa
if (!isset($_SESSION)) session_start();

// Variables de conexión para la DB
$db_servidor = "localhost"; // Servidor, normalmente "localhost"
$db_nombre = "xxxxxxxxxxx"; // Nombre de la DB
$db_usuario = "xxxxxxxxxxx"; // Usuario de la DB
$db_password = "xxxxxxxxx"; // Pass de la DB. Si estás en local, la DB no tiene contraseña por defecto.
$prefijo = "xxxx"; // Prefijo de las tablas

// Conexión con el servidor y la DB
$conexion = mysqli_connect($db_servidor, $db_usuario, $db_password, $db_nombre) or die('No se ha podido conectar a la base de datos: ' . mysqli_connect_error());
mysqli_set_charset($conexion, "utf8");

?>

config.php

PHP:
<?php

require_once('inc/conexion.php'); // Conexión a la BD
include_once('seccion.php'); // Secciones de la web
include_once('inc/funciones.php'); // Funciones varias

// Sacamos los datos de configuración (título, url...) del sitio de la BD
$consulta = "SELECT * FROM ".$prefijo."_configuracion";
$resultado = mysqli_query($conexion, $consulta);
$datos = mysqli_fetch_array($resultado);

   $titulo = $datos['titulo'];
   $url         = $datos['url'];
   $descripcion = $datos['descripcion'];
   $keywords    = $datos['keywords'];
   $id_cliente_google = $datos['id_cliente_google'];

mysqli_free_result($resultado);

?>

funciones.php

PHP:
<?php

function formatearcadena($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  //Iniciamos la variable $conexion
  global $conexion;

  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  //Agregamos $conexion en las funciones mysqli_real_escape_string y mysqli_escape_string
  $theValue = function_exists("mysqli_real_escape_string") ? mysqli_real_escape_string($conexion,$theValue) : mysqli_escape_string($conexion,$theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

?>

validar.js

PHP:
var maximoCaracteresNombre = 30;
var maximoCaracteresUsuarioPass = 20;
var maximoCaracteresEmail = 100;

function conecta(usuario, pass) {
    if (limpiar(usuario) != '' && limpiar(pass) != '') {
            // Intentar llevar a cabo el login
            $.ajax({
                // Especificamos si será una petición POST o GET
                type: 'POST',
                // Le pasamos la URL para la petición
                url: 'inc/conectar.php',
                // Establecemos si la petición será guardada en la cache del navegador o no.
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache
                // al final de la URL de la petición
                cache: false,
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo
                // los datos que el usuario ha ingresado en el formulario de registro
                data: $('#frmConectar').serialize(),
                // Código a ejecutar si la petición es satisfactoria
                // la respuesta es pasada como argumento a la función
                success: function(respuesta) {
                    if (limpiar(respuesta) == 'correcto') {
                        // Recargar la página
                        window.location.reload();
                    } else if (limpiar(respuesta) == 'error') {
                        // Mostrar error
                        $('#login-erroneo').fadeIn(500);
                        $('#login-mensaje-error').text('Datos incorrectos. Vuelve a intentarlo.');
                    }
                }
            });
    } else {
        $('#login-erroneo').fadeIn(500);
        $('#login-mensaje-error').text('Todos los campos son obligatorios');
    }
}

function registro(nombre, usuario, email, pass1, pass2, verifica) {
    if (limpiar(nombre) != '' && limpiar(usuario) != '' && limpiar(email) != '' && limpiar(pass1) != '' && limpiar(pass2) != '' && limpiar(verifica) == '') {
        if (limpiar(pass1) != limpiar(pass2)) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('Las contraseñas no coinciden');
        } else if (limpiar(nombre).length > maximoCaracteresNombre) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El nombre es demasiado largo');
        } else if (limpiar(usuario).length > maximoCaracteresUsuarioPass) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El usuario es demasiado largo');
        } else if (limpiar(email).length > maximoCaracteresEmail) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('El email es demasiado largo');
        } else if (limpiar(pass1).length > maximoCaracteresUsuarioPass) {
            $('#registro-erroneo').fadeIn(500);
            $('#registro-mensaje-error').text('La contraseña es demasiado larga');
        } else {
            // Intentar llevar a cabo el registro
            $.ajax({
                // Especificamos si será una petición POST o GET
                type: 'POST',
                // Le pasamos la URL para la petición
                url: 'inc/registrar.php',
                // Establecemos si la petición será guardada en la cache del navegador o no.
                // Cuando el valor es false, se agrega una cadena de caracteres anti-cache
                // al final de la URL de la petición
                cache: false,
                // Esta es la información a enviar. En este caso estamos serializando, es decir, recogiendo
                // los datos que el usuario ha ingresado en el formulario de registro
                data: $('#frmRegistro').serialize(),
                // Código a ejecutar si la petición es satisfactoria
                // la respuesta es pasada como argumento a la función
                success: function(respuesta) {
                    if (limpiar(respuesta) == 'correcto') {
                        $('#registro-erroneo').fadeOut(500);
                        $('#registro-correcto').fadeIn(500);
                        $('#registro-mensaje-ok').text('Usuario registrado satisfactoriamente. Redirigiendo a la página de login...');
                        setTimeout(function() {
                            window.location.href = url + "conectar";
                        }, 3000);

                    } else if (limpiar(respuesta) == 'existe') {
                        // Mostrar error
                        $('#registro-erroneo').fadeIn(500);
                        $('#registro-mensaje-error').text('El usuario o email ya está registrado');
                    }
                }
            });
        }
    } else {
        $('#registro-erroneo').fadeIn(500);
        $('#registro-mensaje-error').text('Todos los campos son obligatorios');
    }
}

function limpiar(valor) {
    var cadena = valor.split(' ').join('');
    return cadena;
}

Log:

Insertar CODE, HTML o PHP:
Wed Sep 14 00:32:58.920716 2016] [lsapi:error] [pid 861678:tid 140526076339968] [client XX.XX.XX.XX:59174] [host xxxxxxxxxx.com] Backend fatal error: PHP Fatal error:  Call to undefined function formatearcadena() in /home/xxxxxxx/domains/xxxxxxxx.com/public_html/inc/conectar.php on line 10\n, referer: http://xxxxxxxx.com/conectar

Todos esos + los 2 archivos conectar.php y registrar.php que ya dejé al principio creo que es todo lo que puedo dejar. De todas formas, sigo diciendo, el log señala exclusivamente a la función formatearcadena, y en local todo funciona sin problemas. Además, en el servidor los botones de los formularios responden con un 500 Internal Server Error, pero en Hostinger con 200 OK. Hemos probado a cambiar la versión de PHP en el servidor de la 5.5 a la 5.6 que es la que utilizo yo en local, pero el problema persiste.

Menuda guerra me está dando el problemita... de tener planificado el lanzamiento del sitio para anteayer, a estar ya a jueves y no tenerlo listo todavía :fie:
 
Atrás
Arriba