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」に等しいレコードが優先されます。

編集

私はあなたの必要性を誤解しました。

ここには2つの異なるプロセスがあります

  • 勝者を得る
  • 勝者を設定する

おそらくそれを2つの関数/メソッドに分割する必要があります

// 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();

より怠惰なアプローチは、まだ勝者がいない場合に setwinner を呼び出すように getWinner() 関数を作成することです。

// 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 に答える