mysql没有从PHP表单更新

时间:2009-05-24 23:42:16

标签: php sql mysql html

我有一个非常简单的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 :(得分:0)

不确定您是否可以混用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."\">

答案 1 :(得分:0)

以下是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);

你会得到一个有[同意] =&gt;的数组“是”或者没有,取决于他们是否选中了这个盒子,所以除非你有大量的盒子,否则不需要放置阵列支架。

对于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)设置为“checked ='checked'”,如果它是1。

答案 2 :(得分:0)

您没有设置$ 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

答案 3 :(得分:0)

正如旁注,看起来mysql REPLACE函数对你来说会派上用场。

此外,如果未选中复选框,则该值可能很棘手。我编写了一个函数,如果设置了发布值,则将值设置为1,如果不设置则为零...

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

您可以在该查询中运行已发布的复选框值,并始终获得一个或零。

答案 4 :(得分:0)

我创建了一个表并运行了你的代码,它对我来说很好用

之所以没有“看起来”更新的原因是因为你正在阅读 $ saleid和$ checkfield从数据库然后构建一个更新语句,将相同的两个值放回数据库

这可能不是你想做的事情

这一行将$ checkfield设置为'checked',

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

然后从数据库中设置$ checkfield(覆盖值'checked')

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

然后你将checkfield的原始值写回数据库

$statusInfo->bind_param("ss", $checkfield, $pk);