проблемы с логикой обновления для MySQL базы данных - PullRequest
0 голосов
/ 25 мая 2009

У меня есть следующая форма PHP, которая отправляет обратно в базу данных mysql. Моя проблема в том, что запрос на обновление, кажется, работает, но всегда перезаписывается словом «отмечено». То, что я хочу сделать, это проверить, получить текущее значение из базы данных, а затем, если есть значение в post, получить его вместо этого. Теперь ... почему это не работает? Нужно ли иметь условие else при проверке, находится ли оно в _POST? Если это так, нужно ли даже инициализировать переменную с помощью $ checkDeleted = "";?

<?php
error_reporting(E_ALL);
if (isset($_GET["cmd"]))
  $cmd = $_GET["cmd"]; else
if (isset($_POST["cmd"]))
  $cmd = $_POST["cmd"]; else die("Invalid URL");
if (isset($_GET["pk"])) {
    $pk = $_GET["pk"];
}
$checkDeleted = "";
$con = mysqli_connect("localhost","user","pw", "db");
$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'");
while ($row = mysqli_fetch_assoc($getformdata)) {
    $ARTICLE_NO = $row['ARTICLE_NO'];
    $checkDeleted = $row['deleted'];
}
$checkboxes = (isset($_POST['checkboxes'])? $_POST['checkboxes'] : array());
if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked';
if($cmd=="submitinfo") {
    if ($ARTICLE_NO == null) {
        $statusQuery = "INSERT INTO STATUS VALUES (?, ?)";
        if ($statusInfo = $con->prepare($statusQuery)) {
            $statusInfo->bind_param("ss", $pk, $checkDeleted);
            $statusInfo->execute();
            $statusInfo->close();
        } else {
            print_r($con->error);
        }
    } else if ($ARTICLE_NO == $pk) {
        $statusQuery = "UPDATE STATUS SET deleted = ? WHERE ARTICLE_NO = ?";
        if ($statusInfo = $con->prepare($statusQuery)) {
            $statusInfo->bind_param("ss", $checkDeleted, $pk);
            $statusInfo->execute();
            $statusInfo->close();
        } else {
            print_r($con->error);
        }
    }
}
if($cmd=="EditStatusData") {
    echo "<form name=\"statusForm\" action=\"test.php?pk=".$pk."\" method=\"post\" enctype=\"multipart/form-data\">
                        <input type=\"checkbox\" name=\"checkboxes[]\" value=\"deleted\" ".$checkDeleted." />
                        <label for=\"deleted\">Delete</label>
                        <input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" />
                        <input name=\"Submit\" type=\"submit\" value=\"submit\" />
        </form>";
}
?>

Я попытался изменить строку, чтобы установить checkDeleted на следующее, что не имело никакого значения .. хотя это должно быть?

if (in_array('deleted', $checkboxes)) {
$checkDeleted = 'checked';
} else {
$checkDeleted = '';
}

edit: ОК, мне удалось заставить это работать, но только после изменения на

$ checkDeleted = in_array ('удалено', $ флажки)? 'флажок': '';

согласно ответу ниже, но это все равно не сработало. Чтобы это работало, мне пришлось удалить запрос к базе данных и заменить его на один в ветке submitinfo и один в ветке EditStatusData ... почему? Почему невозможно иметь только один запрос?

if($cmd=="submitinfo") {

$getformdata = $con->query("select ARTICLE_NO from STATUS where ARTICLE_NO = '$pk'");

while ($row = mysqli_fetch_assoc($getformdata)) {
    $ARTICLE_NO = $row['ARTICLE_NO'];
}    
    if ($ARTICLE_NO == null) { etc

и

if($cmd=="EditStatusData") {
$getformdata = $con->query("select deleted from STATUS where ARTICLE_NO = '$pk'");

while ($row = mysqli_fetch_assoc($getformdata)) {
    $checkDeleted = $row['deleted'];
} etc

Ответы [ 2 ]

1 голос
/ 25 мая 2009

это очень похоже на ваш другой вопрос

MySQL не обновляется из php формы

в коде нет ничего плохого, он работает именно так, как вы хотите

Что я хочу сделать, это получить текущее значение из базы данных, а затем, если в post есть значение, получить его вместо этого.

вариант 1: HTML-форма без отметки

  1. чтение из базы данных $ checkDeleted = 'флажок'
  2. если $ _POST ['checkboxes'] ['удалено'] не установлено, оставьте $ checkDeleted как есть
  3. записывает 'проверено' в базу данных

case 2. HTML-форма с галочкой

  1. чтение из базы данных $ checkDeleted = 'флажок'
  2. если установлено $ _POST ['checkboxes'] ['удалено'], измените $ checkDeleted = 'флажок'
  3. записывает 'проверено' в базу данных

, независимо от того, есть ли у вас галочка или нет, после того, как вы изменили значение базы данных на проверено, изменить его невозможно

Я буду считать, что вы всегда хотите перезаписать значение базы данных тем, для которого установлен флажок, в этом случае

заменить эту строку

 if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked';

с этим

 $checkDeleted = in_array('deleted', $checkboxes) ? 'checked' : '';
0 голосов
/ 25 мая 2009

Это будет работать, только если вы ПОЛУЧАЕТЕ данные:

$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'");

В вашем коде $ pk не установлено, если ваш запрос POST. Вы также должны экранировать переменную $ pk в этой строке, поскольку пользователь может поместить любые данные, которые ему понравятся, в $ _GET ['pk'], и это может нарушить ваш запрос SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...