2011-11-10 20 views
6

hy vọng tất cả đều tốt. tôi có một vấn đề với một số php mà không phải là ngẫu nhiên lựa chọn một ip. Tôi sẽ cố gắng để giải thích.ORDER BY RAND không hoạt động

<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> 

Bất kỳ lúc nào khách hàng chọn trạng thái và gửi biểu mẫu đến cơ sở dữ liệu của tôi. Đây là cơ sở dữ liệu của tôi trông giống như

+-------+---------------+ 
| state |  ip  | 
+-------+---------------+ 
| AL | 67.100.244.74 | 
| AK | 68.20.131.135 | 
| AZ | 64.134.225.33 | 
+-------+---------------+ 

Cảm ơn mọi người trên diễn đàn này tôi có một số mã php đang thu thập địa chỉ IP khi gửi biểu mẫu và gửi đến email của tôi. Hoàn hảo. đây là mã số

<?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"; 
} 

?> 

Điều duy nhất nó không làm là lấy một ip ngẫu nhiên từ tiểu bang. Đối với mỗi tiểu bang tức là AL, AK, AZ vv .. tôi có khoảng 150 địa chỉ IP khác nhau. Vì vậy, cho phép nói ai đó chọn bang Alabama (AL), tôi muốn nó ngẫu nhiên lựa chọn và ip từ cơ sở dữ liệu đó là trong cùng một hàng như AL. Nó được chọn lên địa chỉ ip ok, nhưng nó luôn luôn gửi cho tôi cùng một ip cho AL.

Theo mã nó nên làm điều này vì ORDER BY RAND là trong đó

$query = $pdo->prepare("SELECT ip FROM vincer WHERE state = ? ORDER BY RAND() LIMIT 1"); 

Tôi hỏi xung quanh và một số người đề nghị tôi cần một cột trong bảng của tôi với một tên id, vì vậy đây trông giống như thế nào

-------+-------+---------------+ 
| id | state |  ip  | 
+------+-------+---------------+ 
| 1 | AL | 67.100.244.74 | 
| 2 | AK | 68.20.131.135 | 
| 3 | AZ | 64.134.225.33 | 
+------+-------+---------------+ 

Họ nói tôi cần id để tôi có thể kéo ngẫu nhiên vào ip. Có ai biết những gì php code tôi cần phải thêm id này để làm cho tất cả công việc này. Bất kỳ trợ giúp sẽ được nhiều đánh giá cao

Cảm ơn tất cả mọi người

Ali

+0

Nếu bạn chỉ có một kỷ lục đối với một quốc gia, nó sẽ luôn luôn kéo ** mà ** kỷ lục. Cũng lưu ý rằng RAND() sẽ chạy cùng một chuỗi ngẫu nhiên mỗi lần, vì vậy bạn sẽ nhận được cùng một dữ liệu miễn là bảng không thay đổi. – Johan

+0

Nếu bạn chỉ có một hàng với 'state = 'AL'', không có gì lạ khi bạn nhận được cùng một địa chỉ IP. –

+0

"Cũng lưu ý rằng RAND() sẽ chạy cùng một chuỗi ngẫu nhiên mỗi lần, vì vậy bạn sẽ nhận được cùng một dữ liệu miễn là bảng không thay đổi" bạn có từ @John ở đâu? Nếu tôi sử dụng "order by rand() LIMIT 1" trên một bảng, tôi luôn nhận được kết quả khác, ngay cả khi bảng không thay đổi. user1010914 "rand()" cung cấp cho bạn điều gì nếu bạn thực thi nó nhiều lần? có lẽ cấu hình mysql không sử dụng một nguồn giống thích hợp. – Flyingmana

Trả lời

3

RAND() sẽ cho giá trị khác nhau mỗi lần.
Nếu bạn không muốn điều này, bạn có thể cung cấp giá trị hạt nhân cố định.
Nếu bạn hoang tưởng, bạn có thể cung cấp giá trị hạt giống khác nhau mỗi lần.

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

Nếu có rất ít IP khác nhau ở trạng thái, cơ hội nhìn thấy cùng một ip tăng lên khi số lượng IP tiếp cận một.
Nếu chỉ có 1 thì rằng sẽ được trả về tất nhiên.

Bạn có thể xem RAND() đó là sử dụng bằng cách thay đổi các truy vấn để:

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

Cảm ơn bạn đã gửi tin nhắn và trợ giúp. Tôi muốn các giá trị khác nhau mỗi lần. Tôi đã thử mã của bạn ở trên và nó vẫn sẽ không mang lại cho tôi trong địa chỉ IP khác nhau mọi lúc. Đối với mỗi tiểu bang tôi có khoảng 150 hàng ip khác nhau, ví dụ AL, 67.100.244.74, AL, 67.900.114.72, AL, 88.188.114.14 vv, hiện tại mỗi lần tôi chọn trạng thái AL i luôn nhận được cùng một giá trị, và khi tôi tìm trong cơ sở dữ liệu của tôi nó là hàng AL đầu tiên mà nó tìm thấy. Tôi thực sự không chắc chắn những gì để thêm vào để làm cho nó không chọn một trong những đầu tiên và chỉ ngẫu nhiên chọn một, bất kỳ sự giúp đỡ sẽ là tuyệt vời Ali – user1010914

+0

@ user1010914, thuis mã hoạt động, bạn có thể kiểm tra nó trong phpMyAdmin và xem cho chính mình rằng nó công trinh. – Johan

Các vấn đề liên quan