MySQL не обновляется из формы PHP - PullRequest
0 голосов
/ 25 мая 2009

У меня есть очень простая форма PHP, которая показывает флажок и будет хранить, если он отмечен или нет в базе данных. Это работает для начальной вставки, но не для обновления. Я проверил случаи, когда $ saleid равен $ pk, и он не входит в ветку if для обновления ... почему?

<?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"]; }

$checkfield = "";

$checkboxes = (isset($_POST['checkboxes'])? $_POST['checkboxes'] : array());

if (in_array('field', $checkboxes)) $checkfield = 'checked';

$con = mysqli_connect("localhost","user","", "db");
if (!$con) { echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error(); exit; }

$con->set_charset("utf8");

$getformdata = $con->query("select saleid, field from STATUS where saleid = '$pk'");
$saleid = "";
while ($row = mysqli_fetch_assoc($getformdata)) {
    $saleid = $row['saleid'];
    $checkfield = $row['field'];
}

if($cmd=="submitinfo") {
    if ($saleid == null) {
       $statusQuery = "INSERT INTO STATUS VALUES (?, ?)";
        if ($statusInfo = $con->prepare($statusQuery)) {
                $statusInfo->bind_param("sssssssssssss", $pk, $checkfield);
                $statusInfo->execute();
                $statusInfo->close();
        } else {
                print_r($con->error);
        }
    } else if ($saleid == $pk) {
        $blah = "what";
        $statusQuery = "UPDATE STATUS SET field = ? WHERE saleid = ?";
        if ($statusInfo = $con->prepare($statusQuery)) {
                $statusInfo->bind_param("ss", $checkfield, $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\">
                <h1>Editing information for Auction No: ".$pk."</h1>
                        <input type=\"checkbox\" name=\"checkboxes[]\" value=\"field\" ".$checkfield." />
                        <label for=\"field\">Test</label>
                        <br />
                        <input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" />
                        <input name=\"Submit\" type=\"submit\" value=\"submit\" />
        </form>";
}
?>

Ответы [ 5 ]

0 голосов
/ 25 мая 2009

хорошо, я создал таблицу и запустил ваш код, и он прекрасно работает для меня

причина, по которой это «не выглядит» как обновление работает, в том, что вы читаете Затем $ saleid и $ checkfield из базы данных создают оператор обновления, который возвращает те же два значения обратно в базу данных

что, вероятно, не то, что вы хотите сделать

эта строка устанавливает $ checkfield в значение 'флажок',

 if (in_array('field', $checkboxes)) $checkfield = 'checked';

затем вы устанавливаете $ checkfield из базы данных (перезаписывая значение 'флажок')

while ($row = mysqli_fetch_assoc($getformdata)) {
   $saleid = $row['saleid'];
   $checkfield = $row['field'];

затем вы записываете исходное значение checkfield обратно в базу данных

$statusInfo->bind_param("ss", $checkfield, $pk);
0 голосов
/ 25 мая 2009

Как примечание, похоже, что функция mysql REPLACE пригодится вам.

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

function checkbox_value($name) {
    return (isset($_POST[$name]) ? 1 : 0);
}

Вы можете запустить свое опубликованное значение флажка через этот запрос и всегда получать единицу или ноль.

0 голосов
/ 25 мая 2009

Вот как должен выглядеть ваш HTML:

    <form id="aform" action="thisform.php" method="post">
       <input type="checkbox" name="agree" value="yes" />
       <input type="hidden" name="secret" value="shhh" />
       <input type="submit" value="do it" />
    </form>

С вышеизложенным, если вы делаете:

  print_r($_POST);

вы получите массив, который имеет либо [согласие] => «да», либо ничего, в зависимости от того, отмечают ли они флажок, поэтому нет необходимости ставить скобки массива, если у вас нет тонны блоков.

Что касается части SQL, я предлагаю сделать столбец одним целочисленным типом, где он может иметь либо 0, либо 1,0 для непроверенного, 1 для проверенного. Для вставки вы бы сделали что-то вроде:

   $check_value = ($_POST['agree'] == 'yes') ? 1 : 0;
   $secret_stuff = $_POST['secret'];
   mysqli_query("Insert INTO sales_table (secret_column, agree_column)
                 VALUES ('$secret_stuff', '$check_value')");

Это поставит ваш флажок в таблицу. Чтобы получить это, вы должны пойти с:

  $results = mysqli_query("SELECT * from sales_table where secret_column = $secret_stuff")

  while($row = mysqli_fetch_assoc($results)) {
    $checked = ($row['agree_column'] == 1) ? "checked=\"checked\"" : "";
    $secret_stuff = $row['secret_column];
   }

   ?>
   <form action=blah method=post id=blah>
   <input type="checkbox" name="agree" value="yes" <?php echo $checked;?> />
   </form>

Извините, потерял пар в конце. Но это охватывает переднюю часть и заднюю часть. Используйте переключатель 1/0 и просто установите некоторую переменную, такую ​​как $ checked, в значение «флажок =« проверено »», если он равен 1.

0 голосов
/ 25 мая 2009

Вы не устанавливаете переменную $ pk, если только isset($_GET["pk"]), но вы все еще используете ее позже в запросе. Это не очень хорошая идея, поскольку в зависимости от других обстоятельств это может привести к ошибкам. Как вы хотите, чтобы ваша логика выглядела так:

if pk is not set in form
    insert new record
    deal with error if insert failed
else
    update existing record
    check update count and deal with error if 0 records were updated
        (perhaps by doing an insert of the missing record)
end
0 голосов
/ 25 мая 2009

не уверен, что вы можете смешивать запросы типа GET и POST

может быть изменить это так, чтобы pk возвращался как скрытое поле?

 echo "<form name=\"statusForm\" action=\"test.php?pk=".$pk."\" method=\"post\" enctype=\"multipart/form-data\">

Например, вроде как

echo "<form name=\"statusForm\" action=\"test.php\" method=\"post\" enctype=\"multipart/form-data\">
<input type=\"hidden\" name=\"pk\" value=\"".$pk."\">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...