2012-08-29 35 views
2

我編寫了一個代碼,讓用戶爲兩個選項中的一個投票,並使用修改後的Elo評級系統計算得分。但是,當我爲任一選項投票時,小數點右側的數字將被忽略。我添加了floatval函數,但它沒有幫助。PHP/MySQL忽略小數點右邊的數字

$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 

謝謝。

編輯:我沒有得到通知了。

回答

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,如果這是默認值,則爲$score_2=0;,但仍要分配它)。

+0

看起來我修正了通知。沒有得到它了。感謝你們三個人。但我該如何解決另一個問題? – Pawel

+0

@Pawel我不完全確定在這種情況下,但你可能想看看[這個問題和我的答案](http://stackoverflow.com/questions/12155465/pdo-difference-between-binding-params-and -concatenating-string/12155531#12155531)處理綁定參數被視爲字符串,除非完全指定爲別的東西。這可能是一個內部mysql問題,導致它做一個整數操作,並在小數點後丟失數據(但我再也不確定這個問題) – Fluffeh

+0

我很新,PHP& MySQL的,所以我可能是錯的,但我的代碼明確指出:'$ stmt-> bind_param('ii',$ _POST ['score'],$ _POST ['id']);' 如果這是問題,這一點的代碼修復它? – Pawel

1

既然它只是一個通知,那麼重要嗎?如果是這樣,我應該在我的代碼中更改 ?

錯誤地編寫了引發錯誤的代碼需要修復。

在創建$score_2變量之前,您不能指定$Rb = $score_2 - 這是一個錯誤。把他們按正確的順序,以解決這一問題

1

在PHP中獲取通知不是一個明顯的錯誤,它只是醜陋,可以負擔你的負擔......

你得到你正在使用非設置變量,做一個var_dump(isset($score_2))將導致布爾(虛假)方式的通知,這意味着它沒有設置

PHP是一種動態類型語言,這意味着您不必在使用它們之前聲明變量,但是 - 如果您這樣做是一種很好的做法,以避免可能導致錯誤你只需要在使用它之前聲明變量。

你期待着一個數字嗎? 初始化所以

$score_2 = 0; 

$score_2 = null; 

取決於你的需要,如果你使用空填充它,不要忘了讓MySQL中的NULL值...

0

好吧,我找到了。這是fetch_assoc()等的一個愚蠢的錯誤。這裏是修改後的代碼:http://snipt.org/vEaj7