2

我编写了一个代码,让用户对两个选项中的一个进行投票,并使用修改后的 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

处理用户投票给第二个选项时的情况的代码几乎相同(除了 $Ea 更改为 $Eb 等)。MySQL中'score'行的属性如下:

float(8,3) not null

谢谢。

编辑:我不再收到通知了。

4

4 回答 4

1

既然只是通知,那有关系吗?如果是这样,我应该在我的代码中进行哪些更改?

需要修复错误编写的引发错误的代码。

您不能$Rb = $score_2在创建$score_2变量之前进行分配——这是一个错误。将它们按正确的顺序排列以解决该问题

于 2012-08-29T15:33:28.613 回答
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 中获得通知显然不是错误,它只是丑陋并且会加重您的负担......

您收到的通知意味着您正在使用未设置的变量,执行 avar_dump(isset($score_2))将导致 bool(false),这意味着它未设置。

PHP 是一种动态类型的语言,这意味着您不必在使用它们之前声明变量,但是 - 如果您这样做,这是一个很好的做法,以避免此类可能导致错误的通知,您只需在之前声明变量使用它。

你期待一个数字吗?初始化它

$score_2 = 0;

或者

$score_2 = null;

取决于你的需要,如果你用 null 填充它,不要忘记在 mysql 中允许 NULL 值......

于 2012-08-29T15:35:19.100 回答
0

好的,我找到了。fetch_assoc() 等是一个愚蠢的错误。这是修改后的代码:http ://snipt.org/vEaj7

于 2012-08-30T13:23:46.770 回答