espero que todo bien. Tengo un problema con algunos php que no selecciona aleatoriamente una ip. Voy a intentar de explicar.ORDER BY RAND no funciona
<select name="State">
<option value="0" selected="selected">Select a State</option>
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
<option value="AR">Arkansas</option>
etc.....
</select>
Cualquier tiempo el cliente selecciona un estado y envía el formulario que va a mi base de datos y tira de una dirección IP releavant al estado. Esto es lo que mi base de datos parece
+-------+---------------+
| state | ip |
+-------+---------------+
| AL | 67.100.244.74 |
| AK | 68.20.131.135 |
| AZ | 64.134.225.33 |
+-------+---------------+
Gracias a la gente en este foro que tengo algo de código PHP que está recogiendo la dirección IP cuando se envía el formulario y es enviado a mi correo electrónico. Perfecto. aquí está el código
<?php
// visit http://php.net/pdo for more details
// start error handling
try
{
// connect
$pdo = new PDO('mysql:host=localhost;dbname=name', 'dbuser', 'pass');
// enable error handling through exceptions
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// create safe query
$query = $pdo->prepare("SELECT ip FROM vincer WHERE state = ? ORDER BY RAND() LIMIT 1");
// pass data & execute query (since the data are of string type
// and therefore can be passed in this lazy way)
$query->execute(array($_POST['State']));
// get value
$ip = $query->fetchColumn();
// print out the IP address using $ip
}
catch (Exception $e)
{
echo "sorry, there was an error.";
mail("[email protected]", "database error", $e->getMessage(), "From: [email protected]");
}
?><?php
if(isset($_POST['email'])) {
// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "[email protected]";
$email_subject = "This is a test";
function died($error) {
// your error code can go here
echo "We are very sorry, but there were error(s) found with the form you submitted. ";
echo "These errors appear below.<br /><br />";
echo $error."<br /><br />";
echo "Please go back and fix these errors.<br /><br />";
die();
}
// validation expected data exists
if(!isset($_POST['first_name']) ||
!isset($_POST['last_name']) ||
!isset($_POST['email']) ||
!isset($_POST['State']) ||
!isset($_POST['comments'])) {
died('We are sorry, but there appears to be a problem with the form you submitted.');
}
$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$state = $_POST['State']; // not required
$comments = $_POST['comments']; // required
$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= 'The Email Address you entered does not appear to be valid.<br />';
}
$string_exp = "/^[A-Za-z .'-]+$/";
if(!preg_match($string_exp,$first_name)) {
$error_message .= 'The First Name you entered does not appear to be valid.<br />';
}
if(!preg_match($string_exp,$last_name)) {
$error_message .= 'The Last Name you entered does not appear to be valid.<br />';
}
if(strlen($comments) < 2) {
$error_message .= 'The Comments you entered do not appear to be valid.<br />';
}
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.\n\n";
function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}
$email_message .= "First Name: ".clean_string($first_name)."\n";
$email_message .= "Last Name: ".clean_string($last_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "State: ".clean_string($ip)."\n";
$email_message .= "Comments: ".clean_string($comments)."\n";
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
if (!mail($email_to, $email_subject, $email_message, $headers))
{
echo "failed to send message";
}
?>
Lo único que no está haciendo es agarrar una ip aleatoria del estado. Para cada estado, es decir, AL, AK, AZ, etc. tengo alrededor de 150 direcciones IP diferentes. Entonces digamos que alguien selecciona el estado de Alabama (AL), quiero que elija aleatoriamente e ip de la base de datos que está en la misma fila que AL. Está recogiendo la dirección IP correcta, pero siempre me está enviando la misma dirección IP para AL.
De acuerdo con el código que debería estar haciendo esto porque el ORDER BY RAND está ahí
$query = $pdo->prepare("SELECT ip FROM vincer WHERE state = ? ORDER BY RAND() LIMIT 1");
Pregunté por ahí y algunas personas me sugirió que necesita otra columna en mi mesa con un nombre de identificación, por lo que este es lo que debe ser similar
-------+-------+---------------+
| id | state | ip |
+------+-------+---------------+
| 1 | AL | 67.100.244.74 |
| 2 | AK | 68.20.131.135 |
| 3 | AZ | 64.134.225.33 |
+------+-------+---------------+
dicen que necesito el id para que pueda tirar de azar en el PI. ¿Alguien sabe qué código php necesito para agregar esta identificación para que todo esto funcione? Cualquier ayuda se agradece mucho
Gracias a todos
Ali
Si sólo tiene un registro para un estado, siempre que se tire ** ** registro. También tenga en cuenta que RAND() ejecutará la misma secuencia aleatoria cada vez, por lo que obtendrá los mismos datos siempre que la tabla no cambie. – Johan
Si solo tiene una fila con 'state = 'AL'', no es de extrañar que obtenga la misma ip todo el tiempo. –
"También tenga en cuenta que RAND() ejecutará la misma secuencia aleatoria cada vez, por lo que obtendrá los mismos datos siempre que la tabla no cambie" ¿dónde tiene esto desde @John? Si utilizo "order by rand() LIMIT 1" en una tabla, siempre obtengo un resultado diferente, incluso si la tabla no cambia. user1010914 ¿Qué le proporciona "select rand()" si lo ejecuta varias veces? tal vez la configuración de mysql no usa una fuente de semilla adecuada. – Flyingmana