mysql数据库的更新逻辑问题

时间:2009-05-25 13:26:29

标签: php sql mysql

我有以下PHP表单,它回发到mysql数据库。我的问题是更新查询似乎工作,但总是被“已检查”覆盖。我想要做的是check是从数据库中获取当前值,然后如果post中有值,请改为获取。现在......为什么这不起作用?检查它是否在_POST中时是否需要有else子句?如果是这种情况,我是否需要使用$ 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 = '';
}

编辑:好的,我已经设法让它工作,但只有在更改为

之后

$ checkDeleted = in_array('已删除',$复选框)? 'checked':'';

根据下面的答案,但这仍然无效。为了使它工作,我不得不删除数据库查询,并将其替换为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 个答案:

答案 0 :(得分:1)

这与您的其他问题非常相似

mysql not updating from php form

代码没有任何问题,它完全符合您的要求

  

我想要做的是从数据库中获取当前值,然后如果post中有值,请改为获取。

案例1:没有勾选的html表格

  1. 从数据库中读取$ checkDeleted ='checked'
  2. 如果未设置$ _POST ['复选框'] ['已删除'],请按原样保留$ checkDeleted
  3. 将'checked'写入数据库
  4. 案例2.带刻度的html表单

    1. 从数据库中读取$ checkDeleted ='checked'
    2. 如果设置了$ _POST ['checkboxes'] ['deleted'],请更改$ checkDeleted ='checked'
    3. 将'checked'写入数据库
    4. 所以无论你是否勾选,一旦你将数据库值改为检查,那么就无法改变它

      我将假设您要做的是始终使用勾选框设置为覆盖数据库值,在这种情况下

      替换此行

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

      用这个

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

答案 1 :(得分:0)

只有在您获取数据时才会有效:

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

在您的代码中,如果您的请求是POST,则不会设置$ pk。您还应该转义此行中的$ pk变量,因为用户可以在$ _GET ['pk']中放置他们喜欢的任何数据,这可能会破坏您的SQL查询。