2

ユーザーが 2 つのオプションのうちの 1 つに投票できるようにするコードを書きました。スコアは、変更された Elo 評価システムを使用して計算されます。ただし、いずれかのオプションに投票すると、小数点以下の数字は無視されます。floatval 関数を追加しましたが、役に立ちませんでした。

$query = "SELECT pic,score,id FROM nfl
    JOIN (SELECT r1.random_id
         FROM nfl_map AS r1
         JOIN (SELECT (RAND() *
                      (SELECT MAX(row_id)
                         FROM nfl_map)) AS row_id)
               AS r2
        WHERE r1.row_id >= r2.row_id
        ORDER BY r1.row_id ASC
        LIMIT 1) as rows ON (id = random_id)";

    $query_2 = "SELECT pic,score,id FROM nfl
    JOIN (SELECT r1.random_id
         FROM nfl_map AS r1
         JOIN (SELECT (RAND() *
                      (SELECT MAX(row_id)
                         FROM nfl_map)) AS row_id)
               AS r2
        WHERE r1.row_id >= r2.row_id
        ORDER BY r1.row_id ASC
        LIMIT 1) as rows ON (id = random_id)";
    $res_2 = $mysqli->query($query_2);
    if (!$res_2) die ("Result display failed: " . $mysqli->errno . " - " . $mysqli->error);
    $pic_2 = $res_2->fetch_assoc();
    $id_2 = $res_2->fetch_assoc();
    $score_2 = $res_2->fetch_assoc();


    $res_1 = $mysqli->query($query);
    if (!$res_1) die ("Result display failed: " . $mysqli->errno . " - " . $mysqli->error);
    $pic_1 = $res_1->fetch_assoc();
    $id_1 = $res_1->fetch_assoc();
    $score_1 = $res_1->fetch_assoc();
    $Ra = $score_1;
    $Rb = $score_2;
    $calc_pow_1 = (($Rb - $Ra) / 400);
    $calc_pow_2 = (($Ra - $Rb) / 400);
    $float_calc_pow_1 = floatval($calc_pow_1);
    $float_calc_pow_2 = floatval($calc_pow_2);
    $Ea = 1 / (1 + pow(10,$float_calc_pow_1));
    $Eb = 1 / (1 + pow(10,$float_calc_pow_2));
    $float_Ea = floatval($Ea);
    $float_Eb = floatval($Eb);

    // if user votes for picture no. 1
    if (isset($_POST['vote_1']) && isset($_POST['id']) && isset($_POST['score']))
    {
    $id = $_POST['id'];
    /* $score = $_POST['score'];
    $pic = $_POST['pic']; */
    //$mod = 2 * $Eb;
    $K = 4;
    $float_mod_1 = floatval($K * (1 - $float_Ea));

    $query = "UPDATE nfl SET score=?+$float_mod_1 WHERE id=?";
    // $score_new = $_POST['score'] + $mod;
    $score_new = $_POST['score'] + $float_mod_1;

    $stmt = $mysqli->prepare($query);
    $stmt->bind_param('di', $_POST['score'], $_POST['id']);
    $stmt->execute();
    if ($stmt->errno) {
        echo "Vote failed: " . $stmt->error();
    }
    else echo "Vote succeeded! New score of $id_1 is $score_new!

"; $stmt->close(); } // fetch picture no. 2 // // query to the database /* $query_2 = "SELECT pic,score,id FROM nfl JOIN (SELECT r1.random_id FROM nfl_map AS r1 JOIN (SELECT (RAND() * (SELECT MAX(row_id) FROM nfl_map)) AS row_id) AS r2 WHERE r1.row_id >= r2.row_id ORDER BY r1.row_id ASC LIMIT 1) as rows ON (id = random_id)"; $res_2 = $mysqli->query($query_2); if (!$res_2) die ("Result display failed: " . $mysqli->errno . " - " . $mysqli->error); $pic_2 = $res_2->fetch_assoc(); $id_2 = $res_2->fetch_assoc(); $score_2 = $res_2->fetch_assoc(); */ // if user votes for picture no. 2 if (isset($_POST['vote_2']) && isset($_POST['id']) && isset($_POST['score'])) { $id = $_POST['id']; /* $score = $_POST['score']; $pic = $_POST['pic']; */ //$mod = 2 * $Ea; $K = 4; $float_mod_2 = floatval($K * (1 - $float_Eb)); $query = "UPDATE nfl SET score=?+$float_mod_2 WHERE id=?"; // $score_new = $_POST['score'] + $mod; $score_new = $_POST['score'] + $float_mod_2; /* $query = "UPDATE nfl SET score=?+1 WHERE id=?"; $score_new = $_POST['score'] + $mod; */ $stmt = $mysqli->prepare($query); $stmt->bind_param('di', $_POST['score'], $_POST['id']); $stmt->execute(); if ($stmt->errno) { echo "Vote failed: " . $stmt->error(); } else echo "Vote succeeded! New score of $id_2 is $score_new!

"; $stmt->close(); }

必要な場合は、完全なコードを次に示します: http://snipt.org/vDhj2

ユーザーが 2 番目のオプションに投票した場合の状況を処理するコードは、ほとんど同じです ($Ea が $Eb に変更されるなどを除いて)。MySQL の「スコア」行のプロパティは次のとおりです。

float(8,3) not null

ありがとう。

編集:もう通知を受けていません。

4

4 に答える 4

1

コード内の宣言を見逃しただけだと思います。

$res_1 = $mysqli->query($query);
if (!$res_1) die ("Result display failed: " . $mysqli->errno . " - " . $mysqli->error);
$pic_1 = $res_1->fetch_assoc();
$id_1 = $res_1->fetch_assoc();
$score_1 = $res_1->fetch_assoc();
$Ra = $score_1;
$Rb = $score_2;

$score_2その値を別の変数に割り当てようとしている上記のコードのどこにも定義されていることがわかりません。

警告には理由があります。警告を無視すると、必然的にコードでエラーが発生するため、警告を無視することはお勧めできません。この場合、変数を割り当てる前に変数を宣言する必要があります(si、ply$score_2=0;がデフォルト値である場合でも、それでも割り当てます。

于 2012-08-29T15:34:30.470 に答える
1

PHPで通知を受け取ることは、明らかにエラーではありません。それは単に醜く、負荷を負担する可能性があります...

表示される通知は、設定されていない変数を使用していることを意味します。aを実行するvar_dump(isset($score_2))と、bool(false)になり、設定されていないことを意味します。

PHPは動的型付け言語です。つまり、使用する前に変数を宣言する必要はありません。ただし、エラーが発生する可能性のある通知を回避するには、変数を宣言する前に変数を宣言する必要があります。それを使用します。

あなたは数を期待していますか?初期化して

$score_2 = 0;

また

$score_2 = null;

ニーズによって異なりますが、nullで埋める場合は、mysqlでNULL値を許可することを忘れないでください...

于 2012-08-29T15:35:19.100 に答える
1

ただのお知らせですので、よろしいでしょうか?その場合、コードの何を変更すればよいですか?

エラーをスローする誤って記述されたコードは修正する必要があります。

変数$Rb = $score_2を作成する前に割り当てることはできません。これはエラーです。$score_2その問題を解決するためにそれらを正しい順序に並べる

于 2012-08-29T15:33:28.613 に答える
0

わかりました。fetch_assoc() などの愚かな間違いでした。修正されたコードは次のとおりです: http://snipt.org/vEaj7

于 2012-08-30T13:23:46.770 に答える