Foros del Web » Programando para Internet » PHP »

PHP en ocasiones manda datos en blanco.

Estas en el tema de PHP en ocasiones manda datos en blanco. en el foro de PHP en Foros del Web. Hola Amigos: Muchas veces me ha ayudado el foro a solucionar problemas varios pero en esta ocasión no veo que va mal en ell código ...
  #1 (permalink)  
Antiguo 31/08/2013, 16:06
 
Fecha de Ingreso: febrero-2013
Ubicación: Badajoz
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta PHP en ocasiones manda datos en blanco.

Hola Amigos:
Muchas veces me ha ayudado el foro a solucionar problemas varios pero en esta ocasión no veo que va mal en ell código ni encuentro solución en el foro, espero que me podáis echar un cable.
A grandes rasgos... el PHP es llamado desde un submit en un HTML; toma unos datos del formulario, extrae la IP del usuario y manda 3 correos, 2 de ellos son para el equipo de programación y un tercero es a la cuenta del usuario. Pues bien, en ocasiones el PHP manda datos correctos, como estos, a las cuentas de los programadores:

ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo.
IP del usuario: 84.121.79.41

* Envia: jose maria XXXXXXXX
* E-mail: [email protected]

* Asunto: Empleo

* Mensaje: Habiendo leido que habria alguna vacante de empleo publico quisiera preguntarles la posiblidad de poder acceder a ellas. Si son tan amables de enviarme las bases. Gracias.

Y en ocasiones manda esto (aunque en el HTML se validan correctamente que todos los datos solicitados tengan un mínimo de longitud y un email correcto con usuario+@+dominio+. y 2 o 3 caracteres)


ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo.
IP del usuario: 92.82.234.94

* Envia:
* E-mail:

* Asunto:

* Mensaje:

El código del PHP es el siguiente:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP formulario de contacto</title>
</head>
<?php

//Optención de IP REAL.
function getRealIP(){
if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' ) {
$client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ?
$_SERVER['REMOTE_ADDR']
:
( ( !empty($_ENV['REMOTE_ADDR']) ) ?
$_ENV['REMOTE_ADDR']
:
"unknown" );

// los proxys van añadiendo al final de esta cabecera
// las direcciones ip que van "ocultando". Para localizar la ip real
// del usuario se comienza a mirar por el principio hasta encontrar
// una dirección ip que no sea del rango privado. En caso de no
// encontrarse ninguna se toma como valor el REMOTE_ADDR

$entries = preg_split('/[, ]/', $_SERVER['HTTP_X_FORWARDED_FOR']);
reset($entries);
while (list(, $entry) = each($entries)) {
$entry = trim($entry);
if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) ) { // http://www.faqs.org/rfcs/rfc1918.html
$private_ip = array(
'/^0\./',
'/^127\.0\.0\.1/',
'/^192\.168\..*/',
'/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
'/^10\..*/');
$found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);
if ($client_ip != $found_ip) {
$client_ip = $found_ip;
break; } } } }
else {
$client_ip = ( !empty($_SERVER['REMOTE_ADDR']) ) ?
$_SERVER['REMOTE_ADDR']
:
( ( !empty($_ENV['REMOTE_ADDR']) ) ?
$_ENV['REMOTE_ADDR']
:
"unknown" ); }

return $client_ip; }

//levanto las los datos a traves de variables
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$asunto = $_POST['asunto'];
$consulta = $_POST['consulta'];
$ip = getRealIP();

// armo los mails con la info levantada
mail('[email protected]', 'Consulta desde el formulario Web', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo. \r\n IP del usuario: " .$ip );

mail('[email protected]', 'Consulta desde el formulario Web', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo. \r\n IP del usuario: " .$ip );

mail($email, 'Su consulta desde el formulario Web:', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n Gracias por usar este servicio, en breve le daremos respuesta.");

// Una vez que se envia, vuelvo al formulario ancunciando que los datos se enviaron
echo "<script>history.back(alert(\"Su consulta se ha mandado y está siendo procesada, gracias.\"));</script>";
echo "<script>window.close();</script>";

?>
<body>
</body>
</html>

Saludos y gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 31/08/2013, 17:26
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: PHP en ocasiones manda datos en blanco.

Hola, tienes que revisar que estos sean datos sean validos y no esten vacios.

$nombre = $_POST['nombre'];
$email = $_POST['email'];
$asunto = $_POST['asunto'];
$consulta = $_POST['consulta'];

Saludos
  #3 (permalink)  
Antiguo 31/08/2013, 17:39
 
Fecha de Ingreso: febrero-2013
Ubicación: Badajoz
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta Respuesta: PHP en ocasiones manda datos en blanco.

Gracias Erick:
Por eso no es, en ocasiones llegan correos en blanco y en ocasiones correos con datos. Como cuento al final del cuerpo del mensaje, los datos son previamente validados en el HTML mendiante una función antes de llamar al PHP. Pongo la validación a continuación:

<SCRIPT type="text/javascript">
function validar() {
if(formulario.nombre.value.length < 3) { //comprueba que no esté vacío
formulario.nombre.focus();
alert('Verifique el contenido del campo nombre.');
return false; //devolvemos el foco
}

var regexp = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$/;

if((regexp.test(formulario.email.value) == 0) || (formulario.email.value.length = 0)){
formulario.email.focus();
alert("Introduzca una dirección de email válida.");
return false; //devolvemos el foco
}

if(formulario.asunto.value.length < 4) { //comprueba que no esté vacío
formulario.asunto.focus();
alert('Verifique el contenido del campo asunto.');
return false; //devolvemos el foco
}
if(formulario.consulta.value.length < 20) { //comprueba que no esté vacío
formulario.consulta.focus();
alert('Sea más extenso en el campo consulta.');
return false; //devolvemos el foco
}

if(!document.formulario.validacion.checked) { //comprueba la casilla de Condiciones
alert("Debe aceptar las condiciones para poder enviar su sulicitud.");
return false;
}

else{
document.formulario.submit();
window.location="Formulario_Contacto_Enviado.htm";
return
}
}
</SCRIPT>

Esta función ha sido testada numerosisimas veces con incontables longitudes y valores para el correo electrónico con la intención de probar que funciona y siempre ha funcionado; como comento, en ocasiones el correo llega con datos y en ocasiones sin ellos. En todas las pruebas que yo he realizado siempre han llegado los datos sin embargo nos llegan mensajes sin datos a los 2 programadores.
  #4 (permalink)  
Antiguo 31/08/2013, 17:42
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: PHP en ocasiones manda datos en blanco.

Es muy sencillo brincarse tu validacion en el navegador, por ello debes hacerlo en el servidor.

Saludos
  #5 (permalink)  
Antiguo 31/08/2013, 17:50
 
Fecha de Ingreso: febrero-2013
Ubicación: Badajoz
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: PHP en ocasiones manda datos en blanco.

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Es muy sencillo brincarse tu validacion en el navegador, por ello debes hacerlo en el servidor.

Saludos
Gracias de nuevo.
Efectivamente, voy a incorporar la validación de datos en el PHP a ver si así se soluciona pero.... el usuario no brinca la validación por que desee hacerlo, debe de existir algo que tener en cuenta con respecto al navegador dentro del HTML (entiendo).
  #6 (permalink)  
Antiguo 31/08/2013, 17:54
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: PHP en ocasiones manda datos en blanco.

Cita:
Iniciado por Fenixmc Ver Mensaje
Gracias de nuevo.
Efectivamente, voy a incorporar la validación de datos en el PHP a ver si así se soluciona pero.... el usuario no brinca la validación por que desee hacerlo, debe de existir algo que tener en cuenta con respecto al navegador dentro del HTML (entiendo).
Lo más seguro, es que no sea un usuario.
Un spider o bot.

Saludos
  #7 (permalink)  
Antiguo 02/09/2013, 09:38
 
Fecha de Ingreso: febrero-2013
Ubicación: Badajoz
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Información Respuesta: PHP en ocasiones manda datos en blanco.

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Lo más seguro, es que no sea un usuario.
Un spider o bot.

Saludos
Gracias Erick por tu ayuda y por hacer que piense de diferente forma, cuando uno piensa lo hace siempre de la misma manera pero cuando otro da su punto de vista hace que comiences a tener otra visión sobre el problema.
Efectivamente, puede tratarse de un Spider y la solución pasa por:

En el PHP validar a Null las variables.
Cargarles los valores que vienen del formulario.
Y condicionar los envíos de mail al hecho de que una de las variables no sea Null o en mi caso a que la variable $email contenga la @.
De esta manera los mails solo se enviarán cuando el PHP sea llamado por el HTML que contiene el formulario.
Este es el código final:

//coloco las variables a null
$nombre = NULL;
$email = NULL;
$asunto = NULL;
$consulta = NULL;
$ip = NULL;

//levanto las los datos a traves de variables
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$asunto = $_POST['asunto'];
$consulta = $_POST['consulta'];
$ip = getRealIP();

// armo los mails con la info levantada y muestro mensajes si la variable email contiene @
if ( strpos($email,'@') !== FALSE ) {
mail('[email protected]', 'Consulta desde el formulario Web', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo. \r\n IP del usuario: " .$ip );

mail('[email protected]', 'Consulta desde el formulario Web', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n ATENCION: Antes de dar respuesta verificar con el panel de control si ha confirmado la consulta desde su bandeja de correo. \r\n IP del usuario: " .$ip );

mail($email, 'Su consulta desde el formulario Web:', "* Envia: $nombre \r\n* E-mail: $email \r\n\r\n* Asunto: $asunto \r\n\r\n* Mensaje: $consulta", "From: $email \r\n\r\n Gracias por usar este servicio, en breve le daremos respuesta.");

// Una vez que se envia, vuelvo al formulario ancunciando que los datos se enviaron
echo "<script>history.back(alert(\"Su consulta se ha mandado y está siendo procesada, gracias.\"));</script>";
}

echo "<script>window.close();</script>";

?>


Dejo el tema abierto unos días por si veo que algo falla pero creo que ha quedado solucionado.

Gracias Erick.

Etiquetas: blancos, campos, vacios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:39.