我有一个非常简单的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>";
}
?>
答案 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);