Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Cergath en 23 Septiembre 2009, 18:35 pm



Título: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: Cergath en 23 Septiembre 2009, 18:35 pm
Pues miren:

Empiezo por crear la DB en phpmyadmin normal, le puse "Suscritos" y ejecuté la consulta:

Citar
CREATE TABLE `tabla_boletin` (
`id` bigint(20) NOT NULL auto_increment,
`email` varchar(100) NOT NULL default '',
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1;

Todo bien, ahora la página para suscribir, que es un cuadro tonto que pide el email y en seguida te pone en la DB, o bien te elimina poniendo el correo.

Código
  1. <?php
  2. if($seguro_del) {
  3. include("conexion.php");
  4. $result = @mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` LIKE ' $email '");
  5. if(mysql_num_rows($result) != 0) {
  6. $sql = @mysql_query("DELETE FROM `tabla_boletin` WHERE `email`=' $email '");
  7. $msg = " El correo electr?nico se ha removido, no recibir? nuestras novedades. ";
  8. } else {
  9. $msg = " El email que solicitaste para darlo de baja no existe en la base de datos. ";
  10.  
  11. } } elseif($seguro_ins) {
  12. include("conexion.php");
  13. $sql = "SELECT email FROM `tabla_boletin` WHERE `email` LIKE ' $email '";
  14. $result = mysql_query($sql);
  15. if(mysql_num_rows($result) != 0) { $msg = " El email que indicaste para la suscripci?n ya se encuentra registrado en la base de datos. "; } else {
  16. if (!ereg("^[^@]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z0-9]{2,}$", $email)) { $msg =" Tu correo electr?nico no existe o esta mal escrito. "; } else {
  17. $fecha = date("Y/n/d H:i:s");
  18. $sql = "INSERT INTO `tabla_boletin` SET `email`=' $email ', `fecha`=' $fecha '";
  19. $result = mysql_query($sql);
  20. $msg = " La suscripci?n fue un ?xito, recibir?s las novedades de nuestro sitio. ";
  21. } } }
  22. ?>
  23. <html>
  24. <head>
  25. <title>Suscribir al bolet?n</title>
  26. </head>
  27. <body>
  28. <div align="center">
  29. <?php if($msg) { ?>
  30. <table width="100%" border="0" cellspacing="5" cellpadding="0">
  31. <tr>
  32. <td><div align="center" class="texto_gral"><?=$msg;?></div></td>
  33. </tr>
  34. <tr>
  35. <td><div align="center"><a href="javascript:window.close()"><strong>cerrar ventana</strong></a></div></td>
  36. </tr>
  37. </table>
  38. <? } else { ?>
  39. <form action="suscripcion.php" method="post" name="" id="">
  40. <table width="200" border="0" cellspacing="2" cellpadding="0">
  41. <tr>
  42. <td><input name="email" type="text" id="email" value="tu correo electr&oacute;nico" size="25">
  43. </td>
  44. </tr>
  45. <tr>
  46. <td> <div align="right">
  47. <input name="seguro_ins" type="submit" id="seguro_ins" value="suscr?bete">
  48. <input name="seguro_del" type="submit" id="seguro_del" value="desinscribir">
  49. </div></td>
  50. </tr>
  51. </table>
  52. </form>
  53. <? } ?>
  54. </div>
  55. </body>
  56. </html>

¿Va bien verdad?,
ahora fíjense en la parte de Include (al principio), pide el archivo Conexion.php que lo tengo así:

Código
  1. <?
  2. $link=mysql_connect("localhost", "root", "lalolanda");
  3. mysql_select_db("suscritos",$link) OR DIE ("Error: Imposible Conectar");
  4. ?>

¿Esta bien no?... cuando corro el script no me sale error, pero a la hora de poner el email y dar en Suscribir, puf, no pasa nada en la DB, no queda el registro....




Adjunto el fichero para enviar el email en html:
Código
  1. <html>
  2. <head>
  3. <title>Sistema de bolet?n :: Env?o de emails</title>
  4. </head>
  5. <body>
  6. <?
  7. if($seguro_env) {
  8. include("conexion.php");
  9. $sql = mysql_query("SELECT * FROM `tabla_boletin`");
  10. $n = 1;
  11. while($row = mysql_fetch_array($sql)) {
  12. $asunto ="Bolet?n NO.1";
  13. $headers = "MIME-Version: 1.0\r \n";
  14. $headers .= "Content-type: text/html; charset=iso-8859-1\r \n";
  15. $headers .= "From: \"Bolet?n de Dise-web\" <boletin@dise-web.com>\r \n";
  16. if(!$mensaje) { echo "No haz escrito el bolet?n!"; } else {
  17. mail("".$row["email"]."","$asunto","$mensaje\n\n","$headers");
  18. echo "<div>".$n++.". Enviado email a <b>".$row["email"]."</b><br></div>";
  19. }
  20. }
  21. } else {
  22. ?>
  23. <form action="enviarboletin.php" method="post" name="" id="">
  24. <table width="100%" border="0" cellspacing="1" cellpadding="0">
  25. <tr>
  26. <td><font size="4" face="tahoma, Arial, verdana"><strong>Puedes usar HTML
  27. para el bolet&iacute;n.</strong></font></td>
  28. </tr>
  29. <tr>
  30. <td><textarea name="mensaje" cols="50" rows="5" id="mensaje"></textarea></td>
  31. </tr>
  32. <tr>
  33. <td><input name="seguro_env" type="submit" id="seguro_env" value="Enviar"></td>
  34. </tr>
  35. </table>
  36. </form>
  37. <? } ?>
  38. </body>
  39. </html>

Muchas gracias, espero ayuda...


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: WHK en 23 Septiembre 2009, 20:45 pm
El problema lo tienes en la sentencia LIKE, fijate que no es lo mismo poner
Código
  1. $result = @mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` LIKE ' $email '");

a poner
Código
  1. $result = @mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` = '$email'");

like da una aproximación o sea algo que contenga eso pero puede retornar muchos resultados, si quieres algo exacto usa el signo igual.

Otro detalle es que si usas like de seguro no tienes ningún email que comienze con un espacio en blanco ni termmine con uno también asi que o le sacas esos espacios en blanco en like o le pones el signo porcentage %palabra% ya que porcentage es comodín y significaría que pueda comenzar por lo que sea y termine en lo que sea pero que contenga palabra, si le pones espacio en blanco + palabra + espacio en blanco estarás buscando todos los mails que comienzen y terminen en un espacio en blanco y que además puedan contener la palabra y por eso no te devuelve resultados.

Fijate en tu phpmyadmin y fabrica la query así:
$sql = 'select * from ....'
después vas y haces un echo $sql; tomas lo que te muestre y lo pegas en tu phpmyadmin y verás el problema.

También puedes sacarle las arrobas para que te muestre si hay algún error en la función porque así vas a ciegas.

Otra cosa, utiliza http://cl2.php.net/mysql_real_escape_string para evitar las inyecciones sql
Código
  1. if(!$result = mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` = '".mysql_real_escape_string($email)."'")
  2. die('Error en la query.');

Ahora, si quieres saber la cantidad de mails que concuerden puedes usar count()

Código
  1. if(!$result = mysql_query("SELECT count(id) FROM `tabla_boletin` WHERE `email` = '".mysql_real_escape_string($email)."'")
  2. die('Error en la query.');

Te devolverá una columna llamada 'count(id)' con la cantidad de mails que concuerden con el criterio.


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: Cergath en 23 Septiembre 2009, 21:02 pm
Gracias por los consejos!, ya los implementé.

Sin embargo el script nada que me pone los registros en la base de datos, colocas el email, clic en suscribir y nada... :-\


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: miguel86 en 27 Septiembre 2009, 20:52 pm
Vete paso por paso, comprobando cada consulta si da resultado, fijate en el fondo de tu página ya que el mensaje en el die si tienes un fondo oscuro no lo verás, coge tu php copia la consulta y la pegas en la parte sql del Mysql (Phpmyadmin) para comprobar que no tiene errores de sintaxis y si funcionan dilo y te miramos la semántica (pero antes mira la sintaxis ya que eso corre de tu cuenta no quieras que te miramos todas las sentencias y te las corrijamos).
Cuando lo hayas hecho y hayas comprobado de arriba a abajo cada sentencia habrás dado con la sentencia que te da el problema, colócala y te la corregimos. O al menos pon la salida que te da de colocar las sentencias de la primera a la última en el orden que van al probarlas en el phpmyadmin.
Salu2


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: ^Tifa^ en 29 Septiembre 2009, 02:02 am
No puedo ayudarte en abundancia, ya que el error puede ser variado... haz considerado revisar los logs que genera Apache respecto a esto? generalmente cuando tengo un fallo en algo de php o un cgi de perl o viceversa y no se donde esta el error, voy a los logs de error de Apache y alli me instruyo mas sobre que esta pasando  ;)  mira ver si te funciona.


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: Embusterillo de bolsillo en 4 Octubre 2009, 01:38 am
Cergath, es simple:

No hace el registro porque la acción del formulario es redirigirse a si mismo más no a las variables, no es lo mismo:
<form action="suscripcion.php" method="post" name="" id="">
Que:
<form action="<?php $_SERVER['PHP_SELF']?>" method="post" name="" id="">
Saludos!

Edit PD: de igual manera haz lo que te dijo WHK, más ahora si te hará el registro en la DB.


Título: Re: ¿Que estoy haciendo mal?... (Sistema newsletter, problema al conectar a la DB)
Publicado por: Eru Iluvatar en 4 Octubre 2009, 20:25 pm
El problema lo tienes en la sentencia LIKE, fijate que no es lo mismo poner
Código
  1. $result = @mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` LIKE ' $email '");

a poner
Código
  1. $result = @mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` = '$email'");

like da una aproximación o sea algo que contenga eso pero puede retornar muchos resultados, si quieres algo exacto usa el signo igual.

Otro detalle es que si usas like de seguro no tienes ningún email que comienze con un espacio en blanco ni termmine con uno también asi que o le sacas esos espacios en blanco en like o le pones el signo porcentage %palabra% ya que porcentage es comodín y significaría que pueda comenzar por lo que sea y termine en lo que sea pero que contenga palabra, si le pones espacio en blanco + palabra + espacio en blanco estarás buscando todos los mails que comienzen y terminen en un espacio en blanco y que además puedan contener la palabra y por eso no te devuelve resultados.

Fijate en tu phpmyadmin y fabrica la query así:
$sql = 'select * from ....'
después vas y haces un echo $sql; tomas lo que te muestre y lo pegas en tu phpmyadmin y verás el problema.

También puedes sacarle las arrobas para que te muestre si hay algún error en la función porque así vas a ciegas.

Otra cosa, utiliza http://cl2.php.net/mysql_real_escape_string para evitar las inyecciones sql
Código
  1. if(!$result = mysql_query("SELECT email FROM `tabla_boletin` WHERE `email` = '".mysql_real_escape_string($email)."'")
  2. die('Error en la query.');

Ahora, si quieres saber la cantidad de mails que concuerden puedes usar count()

Código
  1. if(!$result = mysql_query("SELECT count(id) FROM `tabla_boletin` WHERE `email` = '".mysql_real_escape_string($email)."'")
  2. die('Error en la query.');

Te devolverá una columna llamada 'count(id)' con la cantidad de mails que concuerden con el criterio.

cergath, necesito un sistema como estos, espero que no te moleste si lo uso!...
oye,
y esto donde lo coloco?
Código
  1. if(!$result = mysql_query("SELECT count(id) FROM `tabla_boletin` WHERE `email` = '".mysql_real_escape_string($email)."'")
  2. die('Error en la query.');