2014-07-21 47 views
1

我有一個文件集合(每個文件包含一個語法練習),還有一個表格在我的數據庫中,每個文件根據其主題,時態和類型進行描述。PHP隨機選擇帶限制的結果

我有一個表單,可以選擇主題,時態和我需要的類型。 使用以下PHP腳本,我可以檢索我搜索的文件。檢索到的練習的最大數量對應於$ limit的值。

一切工作正常,但我不能做的是洗牌所有檢索到的練習,並隨機返回它們。實際上,腳本自頂向下瀏覽數據庫,檢索練習,但在達到$ limit限制時停止練習。因此,存儲在數據庫表格底部的練習不會被檢索。

對於如何洗牌所有的候選文件,然後輸出其中的n個,其中n = $ limit是否有任何想法?

if(isset($_POST['limit'], $_POST['topic'], $_POST['tense'], $_POST['type'])) 
{ 
    $counter = 0; 
    $limit = intval($_POST['limit']); 
    $result = ''; 
    foreach ($_POST['topic'] as $key_topic => $value_topic) 
    { 
      foreach ($_POST['tense'] as $key_tense => $value_tense) 
     { 
      foreach ($_POST['type'] as $key_type => $value_type) 
      { 
       $q_to_te_ty = "SELECT * FROM items WHERE topic = '".$value_topic."' AND tense = '".$value_tense."' AND type = '".$value_type."' ORDER BY RAND()";    
       $qu_to_te_ty = mysql_query($q_to_te_ty); 
       while ($rows = mysql_fetch_array($qu_to_te_ty) and ($counter < $limit)) 
          { 
            $result = $rows['file']; 
            readfile("files/$result"); 
        echo "----------------------------------------"."\n"."\n"; 
        $counter++; 
          } 
      } 
     } 
    } 
    if(!$result) 
     { 
      echo "SORRY. There are no exercises in the database which match your search."."\n"."Please try selecting different values."; 
     } 
} 
else 
{ 
    echo "ERROR: You forgot to check something."."\n"."Please select at least one type, topic and tense value. And don't forget to set a number of exercises."; 
} 
?> 
+0

對每個$ _POST變量執行foreach是有點直觀的,你沒有清理輸入,並且使用了不推薦的PHP函數,但是除此之外,你缺少實際的LIMIT子句。看看是否有幫助,如果你相應地添加LIMIT子句。 –

+0

我所有的輸入(限制,主題,時態,類型)都通過一個具有固定值的表單(多選)輸入。用戶不輸入任何內容。他們只是選擇他們需要的東西。關於限制,它被設置,並且腳本實際上在達到$ limit值時停止檢索。我只需要一個策略,在輸出之前真正洗牌所有候選人。 – Alex

+0

Ale,上面的代碼並不反映你有限制。在查詢中。你有它在一個我沒想到的地方。我會說在你的查詢本身中添加一個「LIMIT」子句。看到這裏:http://dev.mysql.com/doc/refman/5.0/en/select.html –

回答

0

我會使用MySQL的RAND()功能:

SELECT column FROM table 
ORDER BY RAND() 
LIMIT $limit 

或一些這樣的。

+0

謝謝,但我需要在檢索所有候選人後限制輸出。 如果我把我的查詢中的LIMIT語句(如你所建議的),輸出會變得混亂(在這之上有三個FOREACH循環...) 我想我需要把所有的候選人放入一個數組和SHUFFLE它在得到我的輸出之前(用LIMIT語句)。坦白說,我不知道如何。 – Alex