Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: mokoMonster en 27 Noviembre 2010, 23:05 pm



Título: Duda con EREG
Publicado por: mokoMonster en 27 Noviembre 2010, 23:05 pm
Hola a todos:

Mi problema es que tengo este muy sencillo código para comprobar que los campos solo puedan tener puntos y algunos signos que encontré navegando.

elseif (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$", $celectronico)) { header("Location: ../registro.php?error=s"); }
Lo que pasa es que por ejemplo en el campo $celectronico referente a el mail no me deja insertar a la tabla si pongo ejemplo@ejemplo2.com, es decir, si pongo en el campo cualquiera de los siguientes valores si me deja:

hola@.com < Si
holahola@. < Si
@hola.com < Si
high.trip@hotmail.com.mx < Si lo acepta
high.trip@hotmail.com < No lo acepta

Si vuelvo a tratar por ejemplo con: hihehe@hahaha.com otra vez no me lo acepta, alguien me podría orientar por favor?
Es la primera vez que trabajo con Ereg.

Saludos y muchas gracias


Título: Re: Duda con EREG
Publicado por: ~ Yoya ~ en 28 Noviembre 2010, 00:05 am
El sistema de expresiones regulares POSIX en PHP esta obsoleto desde la versión 5.3.0, PHP usa el sistema de expresiones regulares PCRE(Expresiones regulares compatibles con Perl)...
Expresiones Regulares - Basico - Wikielhacker (http://wiki.elhacker.net/programacion/php/expresiones-regulares)

La expresion que usas esta muy mal formada y debería filtrar mas los datos...

Código
  1. <?php
  2.  
  3. $a = array('hola@.com', 'holahola@.', '@hola.com', 'high.trip@hotmail.com.mx', 'high.trip@hotmail.com');
  4.  
  5. foreach($a as $aa):
  6.  
  7. if(preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/", $aa)):
  8. echo $aa.'<br>';
  9.  
  10. endif;
  11.  
  12. continue;
  13.  
  14. endforeach;
  15.  
  16. ?>

Salida:

Código:
high.trip@hotmail.com

Es el unico dato que valida tu regexp, puedes usar el patron de Raul para validar un mail...

Código
  1. <?php
  2.  
  3. $a = array('hola@.com', 'holahola@.', '@hola.com', 'high.trip@hotmail.com.mx', 'high.trip@hotmail.com');
  4.  
  5. foreach($a as $aa):
  6.  
  7. if(preg_match("/^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$/", $aa)):
  8. echo $aa.'<br>';
  9.  
  10. endif;
  11.  
  12. continue;
  13.  
  14. endforeach;
  15.  
  16. ?>

Salida:

Código:
high.trip@hotmail.com.mx
high.trip@hotmail.com

Saludos


Título: Re: Duda con EREG
Publicado por: mokoMonster en 28 Noviembre 2010, 00:16 am
Esto parece que funcionará, muchisimas gracias.
Quisiera preguntarte algo, foreach hace como un bucle para cada valor en el array cierto? es decir $aa pasa como si tuviera un valor 5 veces cierto?

Solo quiero entender bien el funcionamiento del foreach para implementarlo :)

Muchisimas gracias y Saludos


Título: Re: Duda con EREG
Publicado por: ~ Yoya ~ en 28 Noviembre 2010, 00:43 am
Um... El array a contiene 5 valores... Uso foreach para recorrer todos sus valores... Con un simple ejemplo entenderás su funcionamiento...

Código
  1. <?php
  2.  
  3. $array = array('Hola', 'Adios', 'Elhacker', 'Wikipedia', 'Google');
  4.  
  5. foreach($array as $valor):
  6.  
  7. echo $valor. '<br>';
  8.  
  9. endforeach;
  10.  
  11. ?>

Salida:

Código:
Hola
Adios
Elhacker
Wikipedia
Google

Osea, recorro el array hasta que no existan mas valores... Cuando recorres un array, cada posición del array sera un ciclo, porque primero recorre la primera posicion y si existe otra vuelve y recorre la siguiente...

Código
  1. <?php
  2.  
  3. $array = array('Hola', 'Adios', 'Elhacker', 'Wikipedia', 'Google');
  4.  
  5. foreach($array as $valor):
  6. $i += 1;
  7.  
  8. echo 'Ciclo nº '. $i.'<br>';
  9. echo $valor. '<br><br>';
  10.  
  11.  
  12. endforeach;
  13.  
  14. ?>

Salida:

Código:
Ciclo nº 1
Hola

Ciclo nº 2
Adios

Ciclo nº 3
Elhacker

Ciclo nº 4
Wikipedia

Ciclo nº 5
Google

Bueno el code anterior funciona asi:
En cada ciclo uso la sentencia if en conjunto con una expresión regular para comprobar que los sean veldadero, si los datos son correctos se ejecuta lo que esta dentro de la sentencia if y si no son correctos no se ejecuta el if... Uso continue para forzar al bucle foreach a pasar al siguiente siclo... Hacer una pruebas y entenderás mejor


Título: Re: Duda con EREG
Publicado por: xassiz~ en 28 Noviembre 2010, 00:46 am
@Yoya: interesante, nunca había visto esa sintaxis en PHP :o Mis códigos están llenos de llaves ;D


Título: Re: Duda con EREG
Publicado por: mokoMonster en 28 Noviembre 2010, 00:52 am
Wow! Ahora tratando de entenderlo un poco quise hacerle un arreglo al código para ver si la capte bien, pero al parecer creo que no, te pongo todo el código de lo que intento hacer a ver si tienes tiempo de ayudarme, en realidad se que mi código es muy simple pero funciona (excepto por el foreach o preg_match) para lo que necesito.

include("fix.php");
$link=Conectarse();

//Variables de Formulario Registro
$nombre=$_POST['nombre'];
$usuario=$_POST['usuario'];
$password=sha1($_POST['password']);
$rpassword=sha1($_POST['rpassword']);
$celectronico=$_POST['celectronico'];
$sexo=$_POST['sexo'];
$anos=$_POST['anos'];
$pais=$_POST['pais'];
$contrato=$_POST['contrato'];
$ip=$_POST['ip'];
$explorador=$_POST['explorador'];
$fecha=$_POST['fecha'];

//Consultas
$queryUser=mysql_query("SELECT usuario FROM Usuarios WHERE usuario='$usuario'",$link)or die(mysql_error());
$queryMail=mysql_query("SELECT celectronico FROM Usuarios WHERE celectronico='$celectronico'",$link)or die(mysql_error());
$qur = mysql_num_rows($queryUser);
$qmr = mysql_num_rows($queryMail);

$a = array($nombre,$usuario,$password,$rpassword,$celectronico);
 
foreach($a as $aa):
 
if(preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/", $aa))
{
continue;
//Comprobaciones
if (empty($nombre)){ header("Location: ../registro.php?error=n"); }
elseif (empty($usuario)) { header("Location: ../registro.php?error=u"); }
elseif ($qur > 0) { header("Location: ../registro.php?error=ue"); }
elseif (empty($password)) { header("Location: ../registro.php?error=p"); }
elseif (empty($rpassword)) { header("Location: ../registro.php?error=rp"); }
elseif ($password!=$rpassword) { header("Location: ../registro.php?error=prp"); }
elseif (empty($celectronico)) { header("Location: ../registro.php?error=ce"); }
elseif ($qmr > 0) { header("Location: ../registro.php?error=cee"); }
elseif (empty($contrato)) { header("Location: ../registro.php?error=c"); }

else {
mysql_query("insert into Usuarios (nombre,usuario,password,celectronico,sexo,anos,pais,contrato,ip,explorador,fecha) values ('$nombre','$usuario','$password','$celectronico','$sexo','$anos','$pais','$contrato','$ip','$explorador','$fecha')",$link) or die(mysql_error());
mysql_free_result($queryUser);
mysql_free_result($queryMail);
mysql_close($link);
echo 'Conexion Finalizada ;)<br>Datos introducidos correctamente a la tabla.';
}

//
}
else { header("Location: ../registro.php?error=s"); }
endforeach;

?>
Saludos :)


Título: Re: Duda con EREG
Publicado por: xassiz~ en 28 Noviembre 2010, 01:09 am
Yo creo que te lías un poco, podrías hacer una funcion validar() y acabas antes. Y tu código es vulnerable a Inyecciones SQL, esas variables del "Formulario Registro" pasalas por mysql_real_escape_string() (http://php.net/manual/es/function.mysql-real-escape-string.php).
Código
  1. $nombre = mysql_real_escape_string($_POST['nombre']);
  2. $usuario = mysql_real_escape_string($_POST['usuario']);
  3. ...
  4.  


Título: Re: Duda con EREG
Publicado por: mokoMonster en 28 Noviembre 2010, 01:12 am
Yo creo que te lías un poco, podrías hacer una funcion validar() y acabas antes. Y tu código es vulnerable a Inyecciones SQL, esas variables del "Formulario Registro" pasalas por mysql_real_escape_string() (http://php.net/manual/es/function.mysql-real-escape-string.php).
Código
  1. $nombre = mysql_real_escape_string($_POST['nombre']);
  2. $usuario = mysql_real_escape_string($_POST['usuario']);
  3. ...
  4.  

Muchas Gracias así lo haré :) pero es que justamente ese es el problema que tengo, que aun no se como hacerlos validar :(
Agradecería tu ayuda :)

Saludos


Título: Re: Duda con EREG
Publicado por: ~ Yoya ~ en 28 Noviembre 2010, 20:48 pm
cuando programes siempre trata de saber todo lo que haces, porque estarás en un error sin saberlo...

Código
  1. if(preg_match("/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/", $aa))
  2. {
  3. continue;
  4. //Comprobaciones
  5. if (empty($nombre)){ header("Location: ../registro.php?error=n"); }
  6. elseif (empty($usuario)) { header("Location: ../registro.php?error=u"); }
  7. elseif ($qur > 0) { header("Location: ../registro.php?error=ue"); }
  8. elseif (empty($password)) { header("Location: ../registro.php?error=p"); }
  9. elseif (empty($rpassword)) { header("Location: ../registro.php?error=rp"); }
  10. elseif ($password!=$rpassword) { header("Location: ../registro.php?error=prp"); }
  11. elseif (empty($celectronico)) { header("Location: ../registro.php?error=ce"); }
  12. elseif ($qmr > 0) { header("Location: ../registro.php?error=cee"); }
  13. elseif (empty($contrato)) { header("Location: ../registro.php?error=c"); }
  14.  
  15. else {
  16. mysql_query("insert into Usuarios (nombre,usuario,password,celectronico,sexo,anos,pais,contrato,ip,explorador,fecha) values ('$nombre','$usuario','$password','$celectronico','$sexo','$anos','$pais','$contrato','$ip','$explorador','$fecha')",$link) or die(mysql_error());
  17. mysql_free_result($queryUser);
  18. mysql_free_result($queryMail);
  19. mysql_close($link);
  20. echo 'Conexion Finalizada ;)<br>Datos introducidos correctamente a la tabla.';
  21. }
  22.  
  23. //
  24. }
  25. else { header("Location: ../registro.php?error=s"); }
  26. endforeach;

Nunca de lo que esta después de continue se ejecutara, ya que continue forza a pasar al siguiente ciclo...

Y no puedes usar esa expresion regular para validar todo tipo de datos, esa patron sirve para validar un mail, no un nombre de usuario, password, etc...

Debes entender como funcionan bien los arrays y el loop foreach(). Te recomiendo que las funciones, loop que haz empleado conozca bien como funciona porque si programas sin entender bien lo que haces, casi siempre lo que hagas no funcionara correctamente aunque no produzca un error, estas produciendo un error lógico...

Te recomiendo que antes de darle los valores a las variables nombres, password, etc... Compruebes que los datos que recibes vía POST contengan algún contenido.

Código
  1. if(empty($_POST['nombre']) && empty($_POST['pass'])){ exit;//Finalizo
  2. }
  3.  
  4. $nombre = $_POST['nombre'];
  5. $pass = $_POST['pass'];

Te recomiendo que leas un poco mas.