¿Algún PHPero que me eche una mano?

Estado
No está abierto para más respuestas.

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Buenas,

necesito cambiar el siguiente registro para que se acepten eñes (ñ) en los nombres de usuario y en los e-mails. Dejo el código a continuación:

Función que valida el email:
PHP:
function validateEmail($email){
        $isValid = true;
        $atIndex = strrpos($email, "@");
        if (is_bool($atIndex) && !$atIndex){
            $isValid = false;
        }  else {
            $domain = substr($email, $atIndex+1);
            $local = substr($email, 0, $atIndex);
            $localLen = strlen($local);
            $domainLen = strlen($domain);
            if ($localLen < 1 || $localLen > 64){
                // local part length exceeded
                $isValid = false;
            } else if ($domainLen < 1 || $domainLen > 255){
                // domain part length exceeded
                $isValid = false;
            } else if ($local[0] == '.' || $local[$localLen-1] == '.'){
                // local part starts or ends with '.'
                $isValid = false;
            } else if (preg_match('/\\.\\./', $local)){
                // local part has two consecutive dots
                $isValid = false;
            } else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)){
                // character not valid in domain part
                $isValid = false;
            } else if (preg_match('/\\.\\./', $domain)){
                // domain part has two consecutive dots
                $isValid = false;
            } else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',str_replace("\\\\","",$local))){
                // character not valid in local part unless 
                // local part is quoted
                if (!preg_match('/^"(\\\\"|[^"])+"$/',str_replace("\\\\","",$local))){
                    $isValid = false;
                }
            }
        }
        return $isValid;
    }

Función que comprueba los datos de registro.

PHP:
function validate($params){
        global $lang;
        
        $errors=array();
        if ((!@$params['username']) || (!@$params['pass1']) || (!@$params['pass2']) || (!@$params['email'])){
            $errors[0] = $lang['register_all_field_required'];
        } else {
            // Username checks
            
            $tmpuser = preg_replace("/[^a-zA-Z0-9_]/","",$params['username']);
            if ($tmpuser!=$params['username']){
                $errors[1] = $lang['register_no_special_chars'];
            } else {
                if ((strlen($params['username'])<5) || (strlen($params['username'])>25)){
                    $errors[1] = $lang['register_min_5_chars'];
                } else {
                    $params['username'] = strtolower(mysql_real_escape_string($params['username']));
                    $check = mysql_query("SELECT id FROM users WHERE LOWER(username)='{$params['username']}'") or die(mysql_error());
                    if (mysql_num_rows($check)){
                        $errors[1] = $lang['register_username_taken'];
                    }
                }
            }
            
            // password checks
            if ($params['pass1']!=$params['pass2']){
                $errors[2] = $lang['register_password_confirm_doesnt_match'];
            } else {
                if (strlen($params['pass1'])<5){
                    $errors[2] = $lang['register_password_min_5_chars'];
                }
            }
            
            // email checks
            if (!$this->validateEmail($params['email'])){
                $errors[3] = $lang['register_invalid_email'];
            } else {
                $params['email']=strtolower(mysql_real_escape_string($params['email']));
                $e = mysql_query("SELECT id FROM users WHERE LOWER(`email`)='{$params['email']}'") or die(mysql_error());
                if (mysql_num_rows($e)){
                    $errors[3] = $lang['register_email_in_use'];
                }
            }
        }
        
        return $errors;
    }

He estado buscando pero no he dado con la solución, si bien he visto casos parecidos pero el código es distinto y no sé aplicarlo. La idea que tengo es que he de añadir ñÑ pero no sé donde ni en que orden.

A ver si me podéis ayudar ;P

Saludos
 

n3xus22

Piedra
Usuario de Piedra
Mensajes
32
Puntuación de reacción
0
las -ñ... pues la verdad es que nunca me he encontrado con el caso... como tienes el php puesto? lo has enlazado con un documento html?

para que funcionen tildes, acentos y demas en html es necesario poner esta linea, eso si, yo en php nunca he llegado a usarla:

PHP:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
las -ñ... pues la verdad es que nunca me he encontrado con el caso... como tienes el php puesto? lo has enlazado con un documento html?

para que funcionen tildes, acentos y demas en html es necesario poner esta linea, eso si, yo en php nunca he llegado a usarla:

PHP:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

La plantilla está integrada con Smarty y en el header.tpl si se hace referencia tal que así:

PHP:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Los acentos y demás caracteres se reconocen en cualquier parte de la plantilla, pero no para el registro, por lo cual supongo que sólo aceptará el alfabeto universal o como se llame... desde el PHP, que no contiene Ñ.

Gracias ;)
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
las -ñ... pues la verdad es que nunca me he encontrado con el caso... como tienes el php puesto? lo has enlazado con un documento html?

para que funcionen tildes, acentos y demas en html es necesario poner esta linea, eso si, yo en php nunca he llegado a usarla:

PHP:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Estas mezclando churras con merinas. Una cosa es PHP y otra bien distinta HTML. Si no sabes es mejor no decir nada que liar a la gente, aunque la intencion sea buena.
@lobogris , ya me imagino que el codigo no sea tuyo, pero quien fuese que lo hizo se complicó la vida un poco. Estas comprobando lo datos con expresiones regulares, por lo que tendrias que añadir la "ñ" y la "Ñ" a la expresion correspondiente.
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Estas mezclando churras con merinas. Una cosa es PHP y otra bien distinta HTML. Si no sabes es mejor no decir nada que liar a la gente, aunque la intencion sea buena.

@lobogris , ya me imagino que el codigo no sea tuyo, pero quien fuese que lo hizo se complicó la vida un poco. Estas comprobando lo datos con expresiones regulares, por lo que tendrias que añadir la "ñ" y la "Ñ" a la expresion correspondiente.
No, el código no es mío, yo de PHP ni idea...

No sé que es eso de expresiones regulares (pero ahora lo busco), el caso es; ¿cómo añado las eñes? ¿Podrías facilitarme el 'arreglo' si no es mucho pedir?

Gracias ;)
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
Por ejemplo :
PHP:
$tmpuser = preg_replace("/[^a-zA-Z0-9-Ññ_]/","",$params['username']);

Para que lo entiendas mejor, le estas diciendo al PHP (por asi decirlo), que guarde en $tmpuser el resultado de reemplazar en $params['username'] por "" (vamos, eliminarlo) cualquier caracter que NO esté (por el ^ de la expresion) contenido en el rango A-Z, a-z, 0-9 y que tampoco sea "ñ" ni "Ñ".
 
Última edición:

feltoxXx

Cobre
Usuario de Bronce
Mensajes
916
Puntuación de reacción
0
El problema o mejor dicho la solucion partira de la funcion mysql_real_escape_string... estoy leyendo alguito sobre eso...

Esa funcion es la que escapa caracteres especiales dependiendo del conjunto de caracteres que se use... entonces si usas un conjunto de caracteres que no use ñ ni Ñ pues los escapara y no lo podras poner...

Leo mas y te aviso si puedo encontrar la solucion correcta...

- - - Actualización- - -

Aunque lo que dijo Bleed tambien seria una solucion viable... prueba y avisanos...
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
El problema o mejor dicho la solucion partira de la funcion mysql_real_escape_string... estoy leyendo alguito sobre eso...

Esa funcion es la que escapa caracteres especiales dependiendo del conjunto de caracteres que se use... entonces si usas un conjunto de caracteres que no use ñ ni Ñ pues los escapara y no lo podras poner...

Leo mas y te aviso si puedo encontrar la solucion correcta...

Creo que no es lo que busca. El quiere que se pueda utilizar la Ñ, por ejemplo, en el nombre de usuario, y en su codigo tiene esto :
PHP:
$tmpuser = preg_replace("/[^a-zA-Z0-9_]/","",$params['username']);
            if ($tmpuser!=$params['username']){
                $errors[1] = $lang['register_no_special_chars']; 
....
Lo cual primero elimina de $params['username'] cualquier caracter que no sea un numero o no se encuentre entre A y Z sin contar Ç ni Ñ, despues compara el string con el original, si no coinciden devuelve un error, y si coinciden continua con el else, por lo que la solucion seria no eliminar las eñes, para que el resultado del preg_replace fuese identico al nombre de usuario recibido. ;)
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Por ejemplo :
PHP:
$tmpuser = preg_replace("/[^a-zA-Z0-9-Ññ_]/","",$params['username']);

Para que lo entiendas mejor, le estas diciendo al PHP (por asi decirlo), que guarde en $tmpuser el resultado de reemplazar en $params['username'] por "" (vamos, eliminarlo) cualquier caracter que NO esté (por el ^ de la expresion) contenido en el rango A-Z, a-z, 0-9 y que tampoco sea "ñ" ni "Ñ".
Gracias por la explicación! Entendido ya está :) pero sigue sin funcionar :( He probado también variando el orden de las eñes añadiendo guiones y nada
El problema o mejor dicho la solucion partira de la funcion mysql_real_escape_string... estoy leyendo alguito sobre eso...

Esa funcion es la que escapa caracteres especiales dependiendo del conjunto de caracteres que se use... entonces si usas un conjunto de caracteres que no use ñ ni Ñ pues los escapara y no lo podras poner...

Leo mas y te aviso si puedo encontrar la solucion correcta...

- - - Actualización- - -

Aunque lo que dijo Bleed tambien seria una solucion viable... prueba y avisanos...
Creo que no puede ser eso porque el cotejamiento es UTF-8 y admite las eñes ¿no?

Creo que no es lo que busca. El quiere que se pueda utilizar la Ñ, por ejemplo, en el nombre de usuario, y en su codigo tiene esto :
PHP:
$tmpuser = preg_replace("/[^a-zA-Z0-9_]/","",$params['username']);
            if ($tmpuser!=$params['username']){
                $errors[1] = $lang['register_no_special_chars']; 
....
Lo cual primero elimina de $params['username'] cualquier caracter que no sea un numero o no se encuentre entre A y Z sin contar Ç ni Ñ, despues compara el string con el original, si no coinciden devuelve un error, y si coinciden continua con el else, por lo que la solucion seria no eliminar las eñes, para que el resultado del preg_replace fuese identico al nombre de usuario recibido. ;)

Correcto Bleed... tienes mucha razon... he aqui un poquito de teoria sobre el asunto...


PHP: Validación con expresiones regulares

Gracias por esta info! Me he dado cuenta también que las url para el perfil de usuario que se generan tampoco admiten los caracteres ñ y ç, y no sé donde se generan ni como, se me queda demasiado grande... me es más adecuado indicar durante el proceso de registro que sólo se aceptan caracteres a-z, 0-9 excluyendo cedilla y ñ.

Entonces ahora el problema lo tengo para el email no me acepta las ñ ni las ç y eso si es problema, porque quien tenga un mail con ñ o ç igual pasa de registrarse o yo que se... no va a crearse un nuevo email exclusivo :(

Me he fijado en la info que adjunta @feltoxXx y veo que no acepta estos caracteres tampoco... ¿cómo lo hago?

Muchísimas gracias por todo a los dos ;)
 

feltoxXx

Cobre
Usuario de Bronce
Mensajes
916
Puntuación de reacción
0
Oye bien raro todo esto... tocara leer un poquito mas entonces... a eso voy... espero poder encontrarte la ayuda...
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Oye bien raro todo esto... tocara leer un poquito mas entonces... a eso voy... espero poder encontrarte la ayuda...
No lo hagas por cumplir eh ;)

Yo he buscado algo pero no me aclaro... los proveedores de correo GMail, Outlook, Yahoo... etc, ¿si aceptan ñ y ç no?
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
Pues si es raro. El código que te puse lo probé primero y admitía eñes. Lo puedes probar en un archivo a parte.

En todo el código que has puesto es la única parte en la que se comprueba la estructura del nick, por lo que si falla, en otro sitio estará haciendo otra comprobación o algo.

PD: Hasta no hace mucho gmail y demás no admitían acentos ni eñes, y la única manera era tener dominio propio. Ahora no se, no te sabría decir.

PD2: Cuando en PHP algo falla suele haber un mensaje de error con información suficiente para identificar y solucionar el fallo.

Enviado desde mi LG-P700 usando Tapatalk 2
 
Última edición:

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
Pues si es raro. El código que te puse lo probé primero y admitía eñes. Lo puedes probar en un archivo a parte.

En todo el código que has puesto es la única parte en la que se comprueba la estructura del nick, por lo que si falla, en otro sitio estará haciendo otra comprobación o algo.

PD: Hasta no hace mucho gmail y demás no admitían acentos ni eñes, y la única manera era tener dominio propio. Ahora no se, no te sabría decir.

PD2: Cuando en PHP algo falla suele haber un mensaje de error con información suficiente para identificar y solucionar el fallo.

Enviado desde mi LG-P700 usando Tapatalk 2

Que pregunta más tonta... xD con lo fácil que era ir y mirar si aceptan o no, la respuesta es no, al menos Outlook y GMail. Así que solucionado lo del mail, que bien :).

Y lo del usuario lo dejaré porque entre que no sé PHP y que probable es que lie más de lo que arregle... mejor lo dejo como está y lo indico en el registro.

En cuanto al error_log no caí en ello, me dice lo siguiente:

Código:
[05-May-2013 08:38:18 America/Chicago] PHP Warning:  preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Compilation failed: range out of order in character class at offset 15 in /home/usuario/public_html/dominio.tld/classes/user.class.php on line 377

En cuanto a otra función que complementa el nombre de usuario es probable, porque lo único que hay en el archivo user.class.php para el nick es eso y en el register.php no hay nada más que el llamamiento de esas funciones. Igual es el archivo que hace las url, que no sé ni donde está ni si tiene algo que ver en el fallo, pero si genero urls por el blog con ñ, ç o acentos me 'come' la letra en la url. Y teniendo en cuenta que un usuario se puede registrar con 'muñoz' su url sería ../usuario/muoz, y si se registra otro con muoz la url sería la misma... Igual ese archivo está programado para que evite eso o algo...

P.d: No sé si las urls las suele hacer un archivo, es la idea que me hago xD

Gracias por todo :mola:
 

feltoxXx

Cobre
Usuario de Bronce
Mensajes
916
Puntuación de reacción
0
revisaste que en user.class.php no este la funcion preg_replace()????

- - - Actualización- - -

donde se llama a esta funcion:

function validate($params)

desde donde se hace el llamado y que le pasa como $params???

- - - Actualización- - -

OK... por lo que estoy leyendo pues el error se encuentra en el caracter 15 de la linea 377 del archivo que citas como user.class.php


que por lo que veo es que tienes malconfigurado el rango de la funcion... revisa si tienes esto en esa parte: preg_match('([a-zA-Z0-9._- ]+)'

deberia estar algo asi: preg_match('([^a-zA-Z0-9._ -]+)' y por supuesto incluyendo las letras que te faltan...
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
revisaste que en user.class.php no este la funcion preg_replace()????

- - - Actualización- - -

donde se llama a esta funcion:

function validate($params)

desde donde se hace el llamado y que le pasa como $params???

- - - Actualización- - -

OK... por lo que estoy leyendo pues el error se encuentra en el caracter 15 de la linea 377 del archivo que citas como user.class.php


que por lo que veo es que tienes malconfigurado el rango de la funcion... revisa si tienes esto en esa parte: preg_match('([a-zA-Z0-9._- ]+)'

deberia estar algo asi: preg_match('([^a-zA-Z0-9._ -]+)' y por supuesto incluyendo las letras que te faltan...

No entiendo la primera... la función está en esto, es el único sitio donde lo veo...(para el usuario)

Código:
 $tmpuser = preg_replace("/[^a-zA-Z0-9_]/","",$params['username']);

se hace el llamado desde aquí, o eso creo, el register.php

PHP:
<?php
$user = new User();

if (isset($doregister)){
	
	$errors = $user->validate(@$_POST);
	
	if (count($errors)){
		if (isset($errors[0]) && $errors[0]){ $smarty->assign("general_error",$errors[0]); } else { $smarty->assign("general_error",""); }
		if (isset($errors[1]) && $errors[1]){ $smarty->assign("username_error",$errors[1]); } else { $smarty->assign("username_error",""); }
		if (isset($errors[2]) && $errors[2]){ $smarty->assign("password_error",$errors[2]); } else { $smarty->assign("password_error",""); }
		if (isset($errors[3]) && $errors[3]){ $smarty->assign("email_error",$errors[3]); } else { $smarty->assign("email_error",""); }
		if (isset($errors[4]) && $errors[4]){ $smarty->assign("captcha_error",$errors[4]); } else { $smarty->assign("captcha_error",""); }
	} else {
		$_POST['language'] = $language;
		$userid = $user->save($_POST);
		
		$data = array();
		$data['user_id'] = $userid;
		$data['target_id'] = 0;
		$data['user_data'] = array("id" => $userid, "username" => $_POST['username'],"email" => $_POST['email']);
		
		@session_register("loggeduser_id");
		@session_register("loggeduser_username");
		$_SESSION['loggeduser_id']=$userid;
		$_SESSION['loggeduser_username']=$_POST['username'];
		$_SESSION['loggeduser_details']=$data['user_data'];
		
		print("<script>window.location='$baseurl';</script>");
		exit();
	}

$smarty->assign("random_number", rand(0,999));
$smarty->assign("registerdone",0);


?>

Falta algo de código pero es para la vinculación con Facebook.

El caracter que señala el error es la g de preg_replace (si se cuentan como caracteres los espacios en blanco, sino sería la r de replace)

Gracias ;)
 

feltoxXx

Cobre
Usuario de Bronce
Mensajes
916
Puntuación de reacción
0
el error es este: Compilation failed: range out of order in character class at offset 15 in /home/usuario/public_html/dominio.tld/classes/user.class.php on line 377

en esa linea de ese archivo debe estar algo malo... casi siempre es por un simbolo "-" donde no debe... por todo lo que he leido de este problema pues ese signo debe estar de ultimo en la sentencia... es decir que debe haber un preg_replace en esa linea con ese fallo..

Podrias pasar esa parte del codigo de user.class.php???
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
El fallo que te devuelve se debe a una expresion regular mal formada. "/[^a-zA-Z0-9Ññ_]/" funciona perfectamente :
PHP:
<?
echo preg_replace("/[^a-zA-Z0-9Ññ_]/","","33-niñoo99ooo!@!");
?>

Pruebalo y veras como te elimina de "33-niñoo99ooo!@!" cualquier caracter que no esté entre a y z y no sea un numero. ;)
 

lobogris

Platino
Usuario de Bronce
Mensajes
1,537
Puntuación de reacción
0
el error es este: Compilation failed: range out of order in character class at offset 15 in /home/usuario/public_html/dominio.tld/classes/user.class.php on line 377

en esa linea de ese archivo debe estar algo malo... casi siempre es por un simbolo "-" donde no debe... por todo lo que he leido de este problema pues ese signo debe estar de ultimo en la sentencia... es decir que debe haber un preg_replace en esa linea con ese fallo..

Podrias pasar esa parte del codigo de user.class.php???

Ahí te dejo el user.class entero https://mega.co.nz/#!tYoEQD6C!fTVkdBxsrRhgiyT1cCLGGGsJhEdeXW-dDXauBxCddTk


El fallo que te devuelve se debe a una expresion regular mal formada. "/[^a-zA-Z0-9Ññ_]/" funciona perfectamente :
PHP:
<?
echo preg_replace("/[^a-zA-Z0-9Ññ_]/","","33-niñoo99ooo!@!");
?>

Pruebalo y veras como te elimina de "33-niñoo99ooo!@!" cualquier caracter que no esté entre a y z y no sea un numero. ;)

No entiendo... ¿quieres decir que entonces esa línea no sirve de nada por que la sobreescribe otra?
 

Bleed

Diamante
Usuario de Bronce
Mensajes
2,408
Puntuación de reacción
1
lobogris dijo:
No entiendo... ¿quieres decir que entonces esa línea no sirve de nada por que la sobreescribe otra?

Lo que digo es que el fallo que te da dice que la expresión regular está mal formada. Copia y pega la última que te he puesto y debería admitir eñes. La anterior también funciona pero por error admitía también -.

Enviado desde mi LG-P700 usando Tapatalk 2
 
Estado
No está abierto para más respuestas.
Arriba