0

如果它选择的随机用户已经在获胜者表中,我需要以下代码循环并选择另一个随机用户。

下面的代码有效,但如果它随机选择一个已经在获胜者表中的用户,它不会再试一次。我尝试了几种不同的方法,但没有找到有效的解决方案。

提前致谢。(这是我关于stackoverflow的第一个问题,如果我没有遵循任何协议,请放轻松)

<?php  
$host="localhost";
$user_name="db_user";
$pwd="db_pass";
$database_name="db_name";

$db=mysql_connect($host, $user_name, $pwd);

if (mysql_error() > "") print mysql_error() . "<br>";
mysql_select_db($database_name, $db);
if (mysql_error() > "") print mysql_error() . "<br>";

$sqlCommand = "SELECT userid, firstname, surname, email FROM users ORDER BY RAND() LIMIT 1"; 
$query = mysql_query($sqlCommand) or die (mysql_error());

while ($row = mysql_fetch_array($query)) { 

    $userid = $row["userid"]; 
    $firstname = $row["firstname"];  
    $surname = $row["surname"];  
    $email = $row["email"];

    $checkuserid = mysql_query("SELECT userid from winners WHERE userid=$userid");

    if (mysql_num_rows($checkuserid)==0) {
        $sqlCommand = "INSERT into winners (userid, firstname, surname, email) values ('" . $userid ."','" . $firstname . "', '" . $surname . "', '" . $email . "')";
        mysql_query($sqlCommand) or die (mysql_error()); 
    } else {

    }
} 

mysql_close(); 
header("Location: http://mysite.com"); /* Redirect browser */
exit();
?>
4

4 回答 4

3

您可以在一个查询中执行此操作:

INSERT INTO winners 
    SELECT userid, firstname, surname, email 
    FROM users 
    WHERE userid NOT IN (SELECT userid FROM winners) 
    ORDER BY RAND() 
    LIMIT 1

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

于 2013-06-26T08:32:38.617 回答
2

而不是循环直到取得成功,您可以通过替换您的子查询来排除现有的获胜者$sqlCommand

$sqlCommand = "SELECT userid, firstname, surname, email ".
              "FROM users ".
              "WHERE userid NOT IN (SELECT userid FROM winners) ".
              "ORDER BY RAND() LIMIT 1"; 
于 2013-06-26T08:31:35.507 回答
1

如果你想要一个循环,把来自`$sqlCommand' 语句的代码片段放到另一个循环中的while 循环的末尾。

于 2013-06-26T08:32:43.550 回答
1

您可以更改您的第一个查询以排除存在于另一个表中且不存在的用户。

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

它应该看起来像这样

SELECT userid, firstname, surname, email FROM users WHERE NOT EXISTS (SELECT * FROM winners
                WHERE users.userid = winners.userid) ORDER BY RAND() LIMIT 1;

您的代码也不起作用,因为由于限制 1 它只有一个循环

于 2013-06-26T08:30:04.737 回答