2011-11-10 8 views
6

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

+0

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

+0

Si solo tiene una fila con 'state = 'AL'', no es de extrañar que obtenga la misma ip todo el tiempo. –

+0

"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

Respuesta

3

RAND() darán diferentes valores cada vez.
Si no lo desea, puede dar un valor de inicialización fijo.
Si es paranoico, puede proporcionar un valor de inicialización diferente cada vez.

SELECT ip FROM vincer WHERE state = ? ORDER BY RAND(UNIX_TIMESTAMP(NOW())) LIMIT 1 

Si hay muy pocos diferentes de IP en un estado de las posibilidades de ver la misma ip subir como el número de IP de acerca a uno.
Si solo hay 1 entonces se devolverá por supuesto.

Se puede ver la RAND() que se utiliza al cambiar la consulta a:

SELECT @rand:= RAND() as rand, ip 
FROM vincer 
WHERE state = ? 
ORDER BY rand 
LIMIT 1 
+0

Gracias por su mensaje y ayuda. Yo quiero diferentes valores cada vez. Intenté tu código anterior y todavía no me llevará a direcciones IP diferentes cada vez. Para cada estado tengo alrededor de 150 filas de IP diferentes, ejemplo AL, 67.100.244.74, AL, 67.900.114.72, AL, 88.188.114.14 etc., en la actualidad cada vez que selecciono el estado AL siempre obtengo el mismo valor, y cuando mira en mi base de datos que es la primera fila AL que encuentra. Realmente no estoy seguro de qué agregar para que no elija el primero y simplemente seleccione al azar uno, cualquier ayuda sería genial Ali – user1010914

+0

@ user1010914, este código funciona, puede probarlo en phpMyAdmin y ver usted mismo que trabajos. – Johan