0

我有以下代码:

<?php
error_reporting(E_ALL);

// connect to your MySQL database here 
$dbhandle = mysql_connect('xxx', 'xxxx', 'xxxx');
$selected = mysql_select_db("xxxx",$dbhandle);

// Get the winner data
function setWinner(){
    $sql = 'UPDATE user SET winner = 1 WHERE id=(SELECT id FROM user ORDER BY RAND())';
    $query = mysql_query($sql) or die (mysql_error());
    echo $query;
}
// Get the winner data
function getWinner()
{
    $sql = 'SELECT id, fullname, email, number FROM user WHERE winner = 1';
    $query = mysql_query($sql) or die (mysql_error());

    if(mysql_num_rows($query) == 1) {
        $user = mysql_fetch_assoc($query);

    } else {
        // If there is no winner yet, automatically create one
        setWinner();

        // Recall the function which should now find a winner
        $user = getWinner();        
    }


    return $user;
}
$winner = getWinner();
print_r($winner);
?>

尝试使用 g4vroche 的答案但收到此错误:您无法在 FROM 子句中指定目标表“用户”进行更新

我用它来竞争从数据库中选择一个随机用户,但我现在需要它来查看所有用户,看看是否有一个用户的获胜者列等于 1,如果没有,它应该选择随机用户并将用户获胜者列更新为 1。

非常感谢任何帮助。

4

2 回答 2

1

我使用该mysql_query()功能只是因为您在示例中使用了它。您应该阅读PDO并改为实施它。

根据我上面的评论,

require_once "connect_to_mysql.php"; 
// look for records with `winner` set to 1
$result = mysql_query('SELECT id, fullname, email, number FROM user WHERE winner = 1 LIMIT 1') or die (mysql_error());
if (mysql_num_rows($result) < 1) { // if no records were found, pick a random row
    $result = mysql_query('SELECT id, fullname, email, number FROM user ORDER BY RAND() LIMIT 1');
}
于 2013-09-06T13:42:56.583 回答
0

我不知道您的获胜者列实际存储的内容,但假设它是一个布尔值,可能仅包含 0 或 1,您可以在单个查询中执行此操作:

SELECT id, fullname, email, number FROM user ORDER BY winner DESC, RAND() LIMIT 1;

这将:

  • 对获胜者列上的所有记录进行排序,使获胜者的行数 = 1 个第一
  • 使用 RAND() 排序等于记录

因此,您将获得随机结果,优先考虑获胜者列等于“1”的记录。

编辑

我误解了你的需要。

你在这里有两个不同的过程

  • 获得胜利者
  • 设置获胜者

你可能应该把它分成两个函数/方法

// Get the winner data
function getWinner()
{
    $sql = 'SELECT id, fullname, email, number FROM user winner=1';
    $query = mysql_query($sql);

    mysql_num_rows($result) == 1) {
        $user = mysql_fetc_assoc($query);           
        return $user;
    }

    return false;
}

function setWinner()
{
    $sql = 'UPDATE user SET winner=1 ORDER BY RAND() LIMIT 1';
    mysql_query($sql);
}

// Call this one time
setWiner();

// Call this any time you want to get the winner's data
$winner = getWinner();

一种更懒惰的方法是,如果还没有获胜者,则让 getWinner() 函数调用 setwinner :

// Get the winner data
function getWinner()
{
    $sql = 'SELECT id, fullname, email, number FROM user winner=1';
    $query = mysql_query($sql);

    mysql_num_rows($result) == 1) {
        $user = mysql_fetc_assoc($query);

    } else {
        // If there is no winner yet, automatically create one
        setWinner();

        // Recall the function which should now find a winner
        $user = getWinner();        
    }


    return $user;
}

这取决于您的上下文,但从一般角度来看,这是不好的做法,因为看起来像读取数据 (getSomething) 的函数在某些情况下也会改变数据(调用 setWinner().

于 2013-09-06T14:05:52.117 回答