簡體   English   中英

php表單未在mySQL中更新數據庫

[英]php form is not updating database in mySQL

我創建了一個表來顯示用戶對游戲的前10個最高得分。 我正在嘗試創建一個表格,該表格允許用戶在表格中輸入他們的新高分,點擊提交,然后更新數據庫,並顯示具有新輸入的高分的新排行榜。 但是,當我更改高分時,數據庫未更新,表也未更改。 這真的使我受挫,如果有人知道為什么會發生這種情況,並且可以提出一些很棒的建議。 我的代碼在/

<?php

class DatabaseManager
    {
        private $servername = "localhost";
        private $username = "root";
        private $password = "";
        private $dbname = "sokodatabase";
        private $dbc;

        function __construct() {
            $this->dbc = mysqli_connect($this->servername, $this->username, $this->password, $this->dbname);
        }

        function __destruct() {
            mysqli_close($this->dbc);
        }

        public function SelectHighScores(){
            // Create a query for the database
            $query = "
                    SELECT username, highScores, rankNo
                    FROM users, leaderboardhighscores
                    WHERE users.id = leaderboardhighscores.userId
                    ORDER BY highScores desc
                    LIMIT 10";

            // Get a response from the database by sending the connection
            // and the query
            $response = @mysqli_query($this->dbc, $query);

            // If the query executed properly proceed
            if($response){
                echo '<table>
                <tr><td><b>Rank</b></td>
                <td><b>Username</b></td>
                <td><b>High Score</b></td></tr>';


                // mysqli_fetch_array will return a row of data from the query
                // until no further data is available
                while($row = mysqli_fetch_array($response)){
                    echo '<tr><td>' .
                    $row['rankNo'] . '</td><td>' .
                    $row['username'] . '</td><td>' .
                    $row['highScores'] . '</td><td>';

                    echo '</tr>';
                }

                echo '</table>';
            } else {
                echo "Couldn't issue database query<br />";
            }
        }
    }
?>    

我的html與php建立表格...

                <div class = "leaderboard">
                        <?php

    // Get a connection for the database

    require_once('../sokodatabase.php');
    $manager = new DatabaseManager;
    $manager->SelectHighScores(); 

    //if(isset($_POST['submit'])){

          //require_once('../sokodatabase.php');  
            if ($_SERVER['REQUEST_METHOD'] === 'POST') {
                    $query = "
                    UPDATE leaderboardHighScores
                    SET highScores=".$_POST["highScores"].", rankNo=".$_POST["rankNo"]."
                    WHERE userId=".$_POST["userId"];

                //var_dump($_POST); 
                //echo $query;

                @mysqli_query($this, $query);
            }
    //}       


    ?>

    <form method="post" action="highScores.php">
        high score <input type="text" name="highScores"/>
        rankNo <input type="text" name="rankNo"/>
        userId <input type="text" name="userId"/>
        <input type="submit" value="Submit">
    </form>
                </div>

首先,為了安全起見,在使用查詢之前,請務必先清除用戶輸入的內容。

其次,您也不需要在mysqli_query之前使用@ -除非您試圖抑制該函數引發的任何和所有錯誤/警告。

第三,嘗試對SQL使用相同的情況; 你用leaderboardhighscores的類,然后leaderboardHighScores在你的代碼的第二部分; 我不知道數據庫中的真實姓名是誰,但是假設以前的名字是真實的,因為這確實如您所說。 我說這是因為區分大小寫可能會導致問題,請閱讀MySQL文檔

第四,您在沒有意義的頁面上的類之外使用$this (如果沒有其他含義)。

將此函數添加到DatabaseManager類:

public function SetHighScores($uid, $score, $rank) {
    $uid   = mysql_real_escape_string($uid);
    $score = mysql_real_escape_string($score);
    $rank  = mysql_real_escape_string($rank);

    $query = "UPDATE leaderboardhighscores SET highScores='{$score}', rankNo='{$rank}' WHERE userId='{$uid}';";

    return mysqli_query($this->dbc, $query);
}

然后這將出現在您的頁面上:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $manager->SetHighScores($_POST['userId'], $_POST['highScores'], $_POST['rankNo']);
}

另外,您應該研究PDO_MYSQL ,這將是一個更好的選擇,但是我知道您在做什么對我猜測的基礎知識很有幫助。

然后試試這個

$result = mysqli_query($manager->dbc, $query);
if ( ! $result ) {
    echo 'Error code ' 
         . mysqli_errno($manager->dbc)
         . ' Error message ' 
         . mysqli_error($manager->dbc);
}

由於$ manager是在正在執行的代碼范圍內保存DatabaseManager類的對象實例的變量,並且該對象具有名為dbc的屬性,該屬性包含數據庫連接句柄。

正如@ x3ns在他/她的評論中所說,您還需要像這樣更改DatabaseManager代碼

class DatabaseManager
    {
        private $servername = "localhost";
        private $username = "root";
        private $password = "";
        private $dbname = "sokodatabase";

        public  $dbc;    //<-- change here

這樣您就可以從對象本身外部訪問該屬性。

這是一個快速解決方案,但老實說,您最好停止閱讀@ x3ns的答案,並應用大部分(如果不是全部)他/她的建議。

盡管我想再添加一個。

像在public function SelectHighScores()一樣,直接從類方法生成輸出是非常糟糕的做法

直接從方法中回顯完全破壞了繼承和修改該方法的活動的能力。 最好將輸出生成為變量並返回該變量。 然后,如果我想對您的方法進行子類化,則可以選擇在需要時以某種方式修改其結果。

嘗試替換:

@mysqli_query($this, $query);

帶有:

@mysqli_query($this->dbc, $query);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM