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 数据库的更新逻辑问题的主要内容,如果未能解决你的问题,请参考以下文章