繁体   English   中英

mysql数据库更新逻辑的问题

[英]problems with update logic for a mysql db

我有以下PHP表单,该表单回发到mysql数据库。 我的问题是,更新查询似乎可以正常运行,但始终被“选中”覆盖。 我想做的就是检查是从数据库中获取当前值,然后在发布中获取一个值,取而代之。 现在...为什么这不起作用? 检查它是否在_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('deleted',$ checkboxes)? '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

这与您的其他问题几乎相同

MySQL不从PHP形式更新

代码没有错,它完全可以按照您的要求工作

我想做的是从数据库中获取当前值,然后在发布中获取值,取而代之。

情况1:没有刻度的html表单

  1. 从数据库$ checkDeleted ='已检查'中读取
  2. 如果未设置$ _POST ['checkboxes'] ['deleted'],则保留$ checkDeleted
  3. 将“已检查”写入数据库

情况2。带有刻度的html表单

  1. 从数据库$ checkDeleted ='已检查'中读取
  2. 如果设置了$ _POST ['checkboxes'] ['deleted'],则更改$ checkDeleted ='checked'
  3. 将“已检查”写入数据库

因此,无论您是否打勾,一旦将数据库值更改为checked,就无法更改它

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

替换这条线

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

有了这个

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

这仅在您获取数据时才有效:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM