簡體   English   中英

PHP/MySQL - 發布/問題批准系統?

[英]PHP/MySQL - Post/Question approval system?

所以,我正在制作一個問答游戲——我有一個頁面,用戶可以在其中提交他們自己的問答問題,這些問題稍后會被放入游戲中(游戲的單獨部分,在這里不太相關)。 無論如何,所以要防止垃圾郵件、不相關的內容或虛假提交/噴子,我正在制作一個版主批准頁面; 該頁面顯示用戶提交的各個“未決”問題。 (當他們提交問題時,它會進入一個名為“usertriviadata”的“待定”數據庫表。

然后,它會在版主批准頁面上顯示每個未決問題,並帶有一個提交按鈕,版主/管理員可以在其中批准它。

一步一步,這是它的工作原理:

  1. 該頁面在批准頁面上顯示(每個瑣事類別)每個單獨的未決問題,每個問題都有一個提交按鈕。
  2. 版主可以查看它,如果他們想批准它,則單擊“批准”按鈕。
  3. 如果單擊“批准”按鈕,系統會從“待定”“usertriviadata”表中刪除該問題,並將其插入到“已批准”數據庫表中,我稍后將在該表中使用該表中的數據。

我遇到的問題,無法完全弄清楚如何解決——當我單擊批准按鈕時,它會批准該特定類別中的所有/任何未決問題。 假設“地理”類別中有 3 個未決問題。 我在這 3 個問題中的任何一個上單擊批准,它都會批准所有這些問題。 基本上,刪除和插入(在兩個數據庫表之間交換數據)有效,但我想對其進行個性化設置。 我嘗試了一些不同的東西,但我不能完全正確。

有什么建議么? 代碼在此圖像下方(圖像顯示批准頁面以大致了解存在多個未決問題時的外觀):

[在此處輸入圖片描述][1]


    <div class="categories">
    <h3>Geography</h3>
    <?php
    $sql = "SELECT questionID, category, uploaderUsername, question, correctAnswer, answerTwo, answerThree, answerFour FROM usertriviadata WHERE category='geography'";
    $result = $conn->query($sql);
    
    
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
    
            $questionID = $row['questionID'];
            $category = $row['category'];
            $uploaderUsername = $row['uploaderUsername'];
            $question = $row['question'];
            $correctAnswer = $row['correctAnswer'];
            $answerTwo = $row['answerTwo'];
            $answerThree = $row['answerThree'];
            $answerFour = $row['answerFour'];
            echo "<div class='individuals'><p>Question ID: $questionID</p> <p>Category: $category</p> <p>Uploader Username: $uploaderUsername</p> <p>Question: $question</p> <p>Correct Answer: $correctAnswer</p> <p>Answer 2: $answerTwo</p> <p>Answer 3: $answerThree</p> <p>Answer 4: $answerFour</p> <form action='' method='GET'><input type='submit' name='submit' value='Approve'/></form> </div> ";
            
            if (isset($_GET["submit"])) {
    
                // Move question to approved table
                $sql = "INSERT INTO approved (category, uploaderUsername, question, correctAnswer, answerTwo, answerThree, answerFour)
                VALUES ('$category', '$uploaderUsername', '$question', '$correctAnswer', '$answerTwo', '$answerThree', '$answerFour')";
                // Error Handles
                if ($conn->query($sql) === TRUE) {
                    echo "<p class='green'>Question approved.</p>";
                } else {
                    echo "Error: " . $sql . "<br>" . $conn->error;
                }
    
                // Delete question from pending/usertriviadata table
                $sql = "DELETE FROM usertriviadata WHERE questionID='$questionID'";
                if ($conn->query($sql) === TRUE) {
                    echo "<p class='green'>Question removed from pending/usertriviadata database table. Please wait 5 seconds before approving another post.</p>";
                    echo "<meta http-equiv='refresh' content='5; URL=../triviaApproval/moderatorApproval' />";
                } else {
                    echo "Error: " . $sql . "<br>" . $conn->error;
                }
                
            }
    
    
        }
      } else {
        echo "No posts need approved here.";
      }
      
    
    ?>
    </div>```
    
    If you want the CSS as well, it is here:
    
    ```html {
        background-color: #AC6A6C;
        font-family: "Trirong", serif;
        color: #DEF706;
        text-align: center;
    }
    .option-a {
        text-align: center;
        display: inline;
        background-color: gray;
        color: #DEF706;
        font-size: 125%;
        width: 100px;
        padding: 0.5%;
        text-decoration: none;
    }
    .option-a:hover {
        cursor: pointer;
        background-color: #4E4E4D;
    }
    .option-a:focus {
        padding: 0.3%;
        background-color: blue;
    }
    .individuals {
        padding: 1%;
        display: inline-block;
        border: 1px solid;
    }
    .green {
        color: green;
    }

```[enter image description here][2]


 

你有這個,每個待批准的問題都有一個單獨的表格:

<form action='' method='GET'>
  <input type='submit' name='submit' value='Approve'/>
</form>
<form action='' method='GET'>
  <input type='submit' name='submit' value='Approve'/>
</form>
<form action='' method='GET'>
  <input type='submit' name='submit' value='Approve'/>
</form>

但請注意,它們都是一樣的。 沒有 ID 來指示哪個表單代表哪個問題。 按下這些按鈕中的任何一個都會做同樣的事情。 在處理提交的腳本中,您運行此查詢:

    $sql = "SELECT ... FROM usertriviadata WHERE category='geography'";

請注意,沒有 WHERE 子句將 select 限制為單個問題。 因此,您使用相同的查詢來呈現您要批准的問題列表。 您似乎正在嘗試在問題循環內使用if (isset($_GET["submit"])) {作為確定選擇了哪些問題的條件。 但是,這是行不通的。 只有一個$_GET["submit"] -- 每個問題沒有一個。 因此,單擊任何一個表單按鈕都會復制所有問題。

讓一個腳本同時執行表單呈現和表單處理會讓您感到困惑。 為了簡單起見,我將這兩個函數分開——讓一個文件呈現列表,讓第二個文件處理表單提交。 因此,您的表單呈現器將執行類似這樣的操作以在每個表單中包含問題 ID:

<form action='approve.php' method='POST'>
  <input type='hidden' name='questionId' value='<?= $questionID =?'>
  <input type='submit' name='submit' value='Approve'/>
</form>

然后,在approve.php中,在 WHERE 子句中使用$_POST['questionId']來處理激活。

其他建議:

  • 使用 POST 進行表單提交,而不是 GET。 一般來說,如果請求導致對數據庫的更改,則應該是 POST。
  • 如果您構建的表單每個問題都有一個復選框(而不是每個問題一個完整的表單),那么您可以允許一次批准多個問題。
  • 立即修復您的 SQL 注入。 聳聳肩說“我稍后會修復它”是一個非常糟糕的習慣,尤其是當從一開始就正確地做到這一點並不困難時。

編輯:不,不是。 我覺得這是朝着正確方向邁出的一步,但它仍然搞砸了。 在這個問題上休息一下。 我很沮喪。

好的,所以...這屬於您所說的內容,我不確定這是否正是您要我做的,但是,我做到了,而且效果完美。


    <div class="categories">
    <h3>Geography</h3>
    <?php
    $sql = "SELECT questionID, category, uploaderUsername, question, correctAnswer, answerTwo, answerThree, answerFour FROM usertriviadata WHERE category='geography'";
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
    
            $questionID = $row['questionID'];
            $category = $row['category'];
            $uploaderUsername = $row['uploaderUsername'];
            $question = $row['question'];
            $correctAnswer = $row['correctAnswer'];
            $answerTwo = $row['answerTwo'];
            $answerThree = $row['answerThree'];
            $answerFour = $row['answerFour'];
            echo "<div class='individuals'><p>Question ID: $questionID</p> <p>Category: $category</p> <p>Uploader Username: $uploaderUsername</p> <p>Question: $question</p> <p>Correct Answer: $correctAnswer</p> <p>Answer 2: $answerTwo</p> <p>Answer 3: $answerThree</p> <p>Answer 4: $answerFour</p> <form action='' method='POST'><input type='hidden' name='questionId' value='<?= $questionID =?'><input type='submit' name='submit' value='Approve'/></form> </div> ";
        }
      } else {
        echo "No posts need approved here.";
      }
    ?>
    </div>

在頁面底部:


    <?php
    
    if (isset($_POST["submit"])) {
    
        // Move question to approved table
        $sql = "INSERT INTO approved (category, uploaderUsername, question, correctAnswer, answerTwo, answerThree, answerFour)
        VALUES ('$category', '$uploaderUsername', '$question', '$correctAnswer', '$answerTwo', '$answerThree', '$answerFour')";
        // Error Handles
        if ($conn->query($sql) === TRUE) {
            echo "<p class='green'>Question approved.</p>";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
    
        // Delete question from pending/usertriviadata table
        $sql = "DELETE FROM usertriviadata WHERE questionID='$questionID'";
        if ($conn->query($sql) === TRUE) {
            echo "<p class='green'>Question removed from pending/usertriviadata database table. Please wait 5 seconds before approving another post.</p>";
            echo "<meta http-equiv='refresh' content='5; URL=../triviaApproval/moderatorApproval' />";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
        
    }
    
    
    
    $conn->close();
    ?>

現在我將處理 SQL 注入。

暫無
暫無

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

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