entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Captcha muestra imagen solo la primera vez

Buenos tardes

He metido un captcha en mi página antes de enviar los datos de un formulario. ( captcha.php)
http://www.corbachotenis.com/escuela.html
http://www.corbachotenis.com/contacto.html

El problema es que la primera vez se carga la imagen, pero sólo la primera vez, las siguientes veces no se cargan las imágenes.

¿Qué creéis que pueda ser ?

Un saludo

0voto

Peter comentado

@gonzalss hay un botoncito para poner código. Seleccionas tu código, le das a { } y te lo pone de forma correcta. Ya edité tus comentarios para que se muestren bien.

Saludos.

0voto

gonzalss comentado

En el if else , me va siempre al else como si siempre estuviese mal el captcha.

0voto

Peter comentado

@gonzalss volví a mover tu respuesta a comentario :)

0voto

carlossevi comentado

Prueba a reemplazar

if(strtoupper($_REQUEST["captcha"]) == $SESSION["captcha"]){

por

if(strtoupper($_REQUEST["captcha"]) == $_SESSION["captcha"]){

En cuaquier caso tampoco me fio de que eso te solucione nada por el descontrol en el copy&paste de código que tienes. Tan pronto llamas a la variable de sesión $_SESSION['tmptxt'] como $_SESSION['tmptxt'] y no sé cual será la buena.

PD. Esta petición de más información que eran los comentarios se han convertido en un partido de tenis y ya no sé ni qué cuestión pasar a "respuesta".

0voto

gonzalss comentado

Espero que con este mensaje pueda poner algo mas de luz. Lo primero muchas gracias por vuestra ayuda y sobre todo por la paciencia

Tengo este captcha.php , que supuestamente funciona ya que me muestra la imagen

<?php 

function randomText($length) {  
$pattern = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";  
for($i=0;$i<$length;$i++) { $key .= $pattern{rand(0,62)}; }  
return $key;  
}  

 session_start(); 

// PARAMETROS DE LA IMAGEN //////////////////////////////  
$ancho = 100; // Ancho de la imágen  
$alto = 30; // Alto de la imágen  
$lineas = 6; // Cantidad de lineas de relleno  
$chars = 6; // Cantidad de caracteres del captcha  

// CREO EL OBJETO IMAGEN Y LOS COLORES A UTILIZAR ///////  
$imagen = imagecreate($ancho,$alto);  
$cLineas = imagecolorallocate($imagen,140,140,140);  
$cFondo = imagecolorallocate($imagen,200,200,200);  
$cTexto = imagecolorallocate($imagen,000,000,000);  

// PINTO EL FONDO ///////////////////////////////////////  
imagefill($imagen, 0, 0, $cFondo);  

// AGREGO UNAS LINEAS DE RELLENO ////////////////////////  
for($c=0; $c <= $lineas; $c++) {  
$x1=rand(0,$ancho);  
$y1=rand(0,$alto);  
$x2=rand(0,$ancho);  
$y2=rand(0,$alto);  
imageline($imagen,$x1, $y1, $x2, $y2, $cLineas);  
}  

// GENERO EL TEXTO ALEATORIO ////////////////////////////  
$SESSION['captcha'] = randomText($chars);  

// AGREGO EL TEXTO ALEATORIO A LA IMAGEN ////////////////  
imagestring($imagen, 5, 25, 7, $SESSION['captcha'], $cTexto);  

// DEVUELVO LA IMAGEN GENERADA //////////////////////////  
header("Content-type: image/jpeg", true);  
imagejpeg($imagen);  

// DESTRUYO EL OBJETO IMAGEN PARA LIBERAR MEMORIA ///////  
imagedestroy($imagen);  

?>

El formulario llama a este php que he llamado verificación

<?php
      session_start();
      if(strtoupper($REQUEST["captcha"]) == $SESSION["captcha"]){
         // REMPLAZO EL CAPTCHA USADO POR UN TEXTO LARGO PARA EVITAR QUE SE VUELVA A INTENTAR
         $SESSION["captcha"] = md5(rand()*time());

         // INSERTA EL CÓDIGO EXITOSO AQUI

         $sendTo = "[email protected]"; 
         $subject = "formulario"; 
         $nombre = $_POST["nombre"]; 
         $telefono = $_POST["telefono"]; 
         $email = $_POST["email"]; 
         $eltexto = $_POST["eltexto"]; 
         $headers .= ""; 
         $message = "\nNombre: " . $nombre . "\ntelefono: " . $telefono . "\nemail: " . $email . "\nArea Texto: " . $eltexto; 
         mail($sendTo, $subject, $message, $headers); 

        header ("Location: escuela.html");

      }else{
         // REMPLAZO EL CAPTCHA USADO POR UN TEXTO LARGO PARA EVITAR QUE SE VUELVA A INTENTAR
         $SESSION["captcha"] = md5(rand()*time());
         // INSERTA EL CÓDIGO DE ERROR AQUÍ

         header ("Location: errorcaptcha.html");

      }
?>

Lo que ocurre es que siempre se mete en el if , por lo que si ponen cualquier texto en el campo de texto me llega el correo.

He puesto el mismo nombre a las variables de sesión tal como me has dicho

3 Respuestas

2votos

carlossevi Puntos63580

Además del error en el nombre de las globales he detectado otro error en el código de verificación:

La línea

if(strtoupper($_REQUEST["captcha"]) == $_SESSION["captcha"]){

debería ser:

if(strtoupper($_REQUEST["captcha"]) == strtoupper($_SESSION["captcha"])){

Para poder comparar, tienes que poner en mayúsculas ambos lados de la igualdad para permitir que el usuario meta las letras sin sensibilidad a las mayúsculas y minúsculas.

He montado los 3 archivos en un servidor de pruebas y me ha funcionado bien así que no debería darte más problemas.

0voto

gonzalss comentado

!!! Funciona!!!

Muchas gracias Carlos .
Y lo mas importante lo que he aprendido

0voto

carlossevi comentado

Me alegra que te sirva. Si te funciona puedes marcar la respuesta como la solución correcta, aunque no tengo claro cual es la respuesta correcta porque cada una soluciona una cosa =)

1voto

carlossevi Puntos63580

Respecto a la última versión de código que has puesto en los comentarios, el problema que es están mal llamadas las variables globales de PHP.

$REQUEST debe ser $_REQUEST
$SESSION debe ser $_SESSION

y lo mismo para todas las globales:

$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION

Para darte una explicación de lo que está pasando:

Lo que quieres que pase: generar una imagen basada en un texto aleatorio y guardar ese texto en la sesión de la conexión para en el siguiente paso se pueda comprobar si el usuario ha introducido correctamente el texto.

Lo que está pasando: en lugar de guarda el valor del texto generado en una variable de sesión (global) la estás guardando en una array que llamas $SESSION y cuyo ámbito de existencia no supera la primera ejecución, por lo que en el segundo paso ese array no existe y te resulta imposible hacer la comparación.

0voto

gonzalss comentado

Después de modificar todas las variables globales y ponerle el _ delante de cada una , en la comparación se va siempre al else ( aunque lo ponga bien) por lo que no llegan los datos del formulario.
!!Esto es una locura !!

0voto

carlossevi comentado

Aquí entran en juego 3 scripts:

  • Generador de captcha (captcha.php)
  • Formulario que muestra el captcha y recoge lo que escribe el usuario
  • Script que comprueba todo

Lo último que nos has pasado es el primer y último punto, pero no el segundo. Lo necesitamos también para comprobar todos los nombres de variables...

Además si nos pasas todas las piezas del puzzle podemos intentar reproducirlo en nuestros sistemas.

0voto

gonzalss comentado

El formulario que he puesto es el siguiente

enter code here
 <form id="formulario" action="verificacion.php" method="post">
   <label for="nombre_y_apellido"> (*) Nombre y apellido </label>
   <br />
   <input type="text" name="nombre" id="nombre" class="required" />
   <br />
   <label for="email"> (*) E-mail </label>
   <br />
   <input type="text" name="email" id="email" class="required email" />
   <br />
   <label for="telefono"> Tel&eacute;fono </label>
   <br />
   <input type="text" name="telefono" id="telefono" class="required number"  />
   <br />
   <label for="cv"> Mensaje </label>
   <br />
   <textarea rows="5" cols="50" name="cv" id="eltexto" class="required"></textarea>
   <br />
   (*) Campos requeridos
   <br />
   <br>
 <!--  incluyo el catpcha  -->

 <img src="captcha.php" width="100" height="30"> <input name="captcha" type="text"> 
 Código de seguridad (mayúsculas, minúsculas y números)<br>
 <br> 
   <input type="submit" id="enviar" value="Enviar" />

 </form>

0voto

gonzalss comentado

No se había copiado bien

 <form id="formulario" action="verificacion.php" method="post">
   <label for="nombre_y_apellido"> (*) Nombre y apellido </label>
   <br />
   <input type="text" name="nombre" id="nombre" class="required" />
   <br />
   <label for="email"> (*) E-mail </label>
   <br />
   <input type="text" name="email" id="email" class="required email" />
   <br />
   <label for="telefono"> Tel&eacute;fono </label>
   <br />
   <input type="text" name="telefono" id="telefono" class="required number"  />
   <br />
   <label for="cv"> Mensaje </label>
   <br />
   <textarea rows="5" cols="50" name="cv" id="eltexto" class="required"></textarea>
   <br />
   <img src="captcha.php" /><br/>
<input type="text" size="16" name="captcha" />
   (*) Campos requeridos
   <br />
   <input type="submit" id="enviar" value="Enviar" />

</form>

0voto

gonzalss comentado

Necesitaríais algún otro archivo ?

0voto

gonzalss Puntos3720

El error estaba en nombrar mal las variables globales y en el archivo donde hacía la comparación.
La sentencia era la que Carlos me ha puesto :

if(strtoupper($_REQUEST["captcha"]) == strtoupper($_SESSION["captcha"])){

0voto

Peter comentado

Volvía editar tu código. Al publicar el código tienes el botón { } para darle formato. Seleccionas tu código, lo aprietas y listo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta