mysql 数据库的更新逻辑问题

Posted

技术标签:

【中文标题】mysql 数据库的更新逻辑问题【英文标题】:problems with update logic for a mysql db 【发布时间】:2009-05-25 13:26:29 【问题描述】:

我有以下 php 表单,它回发到 mysql 数据库。我的问题是更新查询似乎有效,但总是被“选中”覆盖。我想要做的是检查是否从数据库中获取当前值,然后如果 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('deleted', $checkboxes) ? '检查':'';

根据下面的答案,但这仍然不起作用。为了让它工作,我必须删除数据库查询,并将其替换为 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

【问题讨论】:

【参考方案1】:

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

mysql not updating from php form

代码没有问题,它完全按照你的意愿工作

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

案例1:html表单没有打勾

    从数据库读取 $checkDeleted = 'checked' 如果 $_POST['checkboxes']['deleted'] 未设置,则保持 $checkDeleted 不变 将“已检查”写入数据库

案例 2. 带勾号的 html 表单

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

所以不管你有没有打勾,一旦你把数据库值改成checked,就没有办法改变了

我会假设你想要做的总是用勾选框设置的任何内容覆盖数据库值,在这种情况下

替换这一行

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

有了这个

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

【讨论】:

那么,为了让它工作,数据库查询必须在检查它是否在数组中? 我实际上是在尝试将字段设置为 '' 如果它不在我上面示例中的数组中,那么为什么它不起作用?【参考方案2】:

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

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

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

【讨论】:

'(isset($_GET["pk"]))' 行只有在它是 GET 请求时才为真 另外,pk 将始终通过 GET 设置,因为页面始终使用 pk 参数调用。需要注意消毒..

以上是关于mysql 数据库的更新逻辑问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql物理日志redo log和逻辑日志 binlog

逻辑模型 mySQL 中的依赖项

用 Java 更新 MySQL 表

MySQL锁

MySQL:锁

Mysql和Redis数据同步策略