2011-11-10 11 views
6

काम नहीं कर रहा है सभी अच्छे। मुझे कुछ php के साथ समस्या है जो यादृच्छिक रूप से एक आईपी का चयन नहीं कर रहा है। मैं समझाने की कोशिश करूंगा।रैडर द्वारा ऑर्डर

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

किसी भी समय ग्राहक एक एक राज्य का चयन करता है और मेरे डेटाबेस के लिए प्रपत्र यह जाता सबमिट करता है और राज्य के लिए एक आईपी पता releavant खींचती है। यह मेरा डेटाबेस की तरह

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

इस मंच मैं कुछ php कोड है कि आईपी पते एकत्रित कर रहा है जब फ़ॉर्म सबमिट किया जाता है और यह मेरे ईमेल पर भेज दिया जाता है है पर लोगों के लिए धन्यवाद दिखाई देता है। उत्तम। यहां कोड

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

?> 

एकमात्र चीज जो यह नहीं कर रही है वह राज्य से एक यादृच्छिक आईपी पकड़ रही है। प्रत्येक राज्य यानी एएल, एके, एजेड इत्यादि के लिए .. मेरे पास लगभग 150 अलग-अलग आईपी पते हैं। तो आइए कहें कि कोई अलाबामा (एएल) की स्थिति का चयन करता है, मैं चाहता हूं कि यह यादृच्छिक रूप से डेटाबेस से चुनें और आईपी के समान पंक्ति में आईपी। यह आईपी पता ठीक कर रहा है, लेकिन यह हमेशा मुझे AL के लिए एक ही आईपी भेज रहा है।

कोड यह इस करना चाहिए के अनुसार क्योंकि रेंड द्वारा आदेश में वहाँ

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

मैं चारों ओर से पूछा है और कुछ लोगों को मैं आईडी के नाम के साथ मेरी तालिका में एक और स्तंभ की जरूरत है, तो यह सुझाव दिया यह

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

वे कहते हैं कि मुझे आईडी चाहिए ताकि मैं यादृच्छिक रूप से आईपी में खींच सकूं। क्या कोई यह जानता है कि यह सब काम करने के लिए मुझे यह आईडी जोड़ने के लिए PHP कोड क्या है। किसी भी मदद की बहुत सराहना की जाएगी

धन्यवाद हर कोई

अली

+0

आप एक राज्य के लिए केवल एक रिकॉर्ड है, तो यह हमेशा खींच लेंगे ** कि ** रिकॉर्ड। यह भी ध्यान रखें कि रैंड() हर बार एक ही यादृच्छिक अनुक्रम चलाएगा, इसलिए जब तक तालिका बदलती नहीं है तब तक आपको वही डेटा मिल रहा है। – Johan

+0

यदि आपके पास 'state = 'AL'' के साथ केवल एक पंक्ति है, तो इसमें कोई आश्चर्य की बात नहीं है कि आपको हर समय एक ही आईपी मिलती है। –

+0

"यह भी ध्यान रखें कि रैंड() हर बार एक ही यादृच्छिक अनुक्रम चलाएगा, इसलिए जब तक तालिका बदलती नहीं है तब तक आपको वही डेटा मिल रहा है" आपके पास यह @ जॉन से कहां है? यदि मैं तालिका में "रैंड() LIMIT 1" द्वारा क्रमबद्ध करता हूं, तो मुझे हमेशा एक अलग परिणाम मिलता है, भले ही तालिका बदलती न हो। उपयोगकर्ता 1010 9 14 यदि आप इसे कई बार निष्पादित करते हैं तो "रैंड()" चुनें " शायद mysql विन्यास उचित बीज स्रोत का उपयोग नहीं करता है। आपके उत्तर के लिए – Flyingmana

उत्तर

3

RAND() विभिन्न मूल्यों हर बार दे देंगे।
यदि आप यह नहीं चाहते हैं तो आप निश्चित बीज मान दे सकते हैं।
यदि आप पागल हैं, तो आप हर बार एक अलग बीज मूल्य की आपूर्ति कर सकते हैं।

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

यदि बहुत बहुत कुछ अलग आईपी एक राज्य में के एक ही आईपी आईपी की संख्या के रूप में ऊपर जाना देखकर की संभावना एक तक पहुंचता है।
यदि केवल 1 है तो कि निश्चित रूप से वापस कर दिया जाएगा।

आप RAND() कि करने के लिए क्वेरी को बदलने के द्वारा प्रयोग किया जाता है देख सकते हैं:

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

आपके संदेश और सहायता के लिए धन्यवाद। मुझे हर बार अलग-अलग मूल्य चाहिए। मैंने उपरोक्त कोड को आजमाया और यह मुझे हर बार अलग-अलग आईपी पते में नहीं लाएगा। प्रत्येक राज्य के लिए मेरे पास लगभग 150 अलग-अलग आईपी पंक्तियां हैं, उदाहरण AL, 67.100.244.74, AL, 67.900.114.72, AL, 88.188.114.14 आदि, वर्तमान में हर बार जब मैं राज्य AL चुनता हूं तो मुझे हमेशा वही मान मिलता है, और जब मैं मेरे डेटाबेस में देखो यह पहली एएल पंक्ति है जो इसे पाता है। मुझे सच में यकीन नहीं है कि इसे पहले व्यक्ति को चुनने के लिए क्या जोड़ना है और केवल यादृच्छिक रूप से चयन करना है, कोई भी मदद महान होगी अली – user1010914

+0

@ user1010914, thuis code works, आप phpMyAdmin में इसका परीक्षण कर सकते हैं और स्वयं को देख सकते हैं कि यह काम करता है। – Johan

संबंधित मुद्दे