0

PHP が入力されたドロップダウン メニューを使用して、データベース内の複数のエントリを更新しようとすると問題が発生します。現在データベースにあるすべてのエントリを表示するテーブルを作成するページのコードは次のとおりです。

$result = mysqli_query($con,"SELECT * FROM Submissions");

echo "<table border='1'>
<tr>
<th>First name</th>
<th>Last name</th>
<th>Email</th>
<th>Title</th>
<th>Text</th>
<th>Public Post OK?</th>
<th>Date/Time Submitted</th>
<th>Approved?</th>
<th>Test Approved</th>
</tr>";

while($row = mysqli_fetch_array($result))

  {

  echo "<tr>";

  echo "<td>" . $row['fname'] . "</td>";

  echo "<td>" . $row['lname'] . "</td>";

  echo "<td>" . $row['email'] . "</td>";

  echo "<td>" . $row['title'] . "</td>";

  echo "<td>" . nl2br($row['text']) . "</td>";

  echo "<td>" . $row['publicpost'] . "</td>";

  echo "<td>" . $row['time'] . "</td>";

  echo "<td><select name=\"approved\"><option value=\"" . $row['approved'] . "\">" .                      $row['approved'] . "</option><option value=\"yes\">Yes</option><option value=\"no\">No     Again</option></select></td>";

  echo "<td>" . $row['approved'] . "</td>";

  echo "</tr>";

  }

echo "</table>";

?>

<br><br>

<form action="update.php" method="post">

<input type="submit" name="SubmitButton" value="Update" class="submit"         style="cursor:pointer;">

    </form>

    <?php

    mysqli_close($con);

?>

これは、「update.php」の php コードです。

$approved = $_POST['approved'];

mysqli_query($con,"UPDATE Submissions SET approved = $approved");

$update_query= "UPDATE Submissions SET approved = '$approved'";

if(mysqli_query($con,$update_query)){
echo "updated";}
else {
echo "fail";}
?>

<form action="approvesubmissions.php">

<input type="submit" value="Approve Submissions page">

</form>

目標は、「承認済み」フィールドを「いいえ」から「はい」またはその逆のドロップダウン メニューで更新できるようにすることです。代わりに、このクエリで起こっていることは、「承認済み」フィールドのデータを更新する代わりに消去していることです。私はphpに少し慣れていません。これについてTONを調査しましたが、解決策はありませんでした。どんな助けでも大歓迎です!

4

1 に答える 1

0

まず、「承認済み」が TINYINT(1) か何かであると仮定しましょう。

選択した html は、このようにする必要があります。DB 値に基づいて自動入力されます。

$selected = 'selected="selected"'; // pre-selection attribute
$isApproved = !!$row['approved']; // is this active? (approved is 1 or 0)
echo '<select name="approved">
        <option value="1" ' . ($isApproved ? $selected : '') . '>Yes</option>
        <option value="0" ' . (!$isApproved ? $selected : ''). '>No</option>
      </select>';

次に、フォームはテーブルの一番下にありますが、必要な入力はテーブルにあります。フォームを送信すると、技術的にフォームにないため、$_POST['approved'] はありません。修正するには、開始フォーム タグを表の前に配置する必要があります。次に、テーブルをエコーアウトした後、最後に送信ボタンと終了フォーム タグを配置します。

第三に、post.php ページはユーザー入力をクエリに直接取り込んではいけません。しかし、単にこれを行う:

// Convert input to boolean answer, then int (for the query).
$approved = isset($_POST['approved']) ? (int)!!$_POST['approved'] : 0;
mysqli_query($con,"UPDATE Submissions SET approved = '$approved'");

このトピックについて話している間、これはあなたのプロジェクトの準備された声明に飛び込む絶好の機会です. 恐ろしく聞こえるかもしれませんが、SQL インジェクションからあなたを救うことができます。

// Make the prepared statement
$query = mysqli_prepare("UPDATE Submissions SET approved = ?");
// Safely bind your params
mysqli_stmt_bind_param($query, "i", $approved);
// Run it
mysqli_stmt_execute($query);
// "close" the statement (hint: it's reusable for things like bulk updates, etc)
mysqli_stmt_close($query);
于 2013-03-28T16:44:34.847 に答える