我有以下php表单。
我正在努力使其在加载表单时,将为值分配适当的校验变量。此变量将包含“checked”或“。如果它包含已选中,则使用html显示的方式应该会检查相关的复选框。
实际上,变量似乎没有被传递。当我在submitinfo分支中回显$ deleted或$ notice时,它们是空白的。此外,没有任何内容插入数据库,我没有收到任何数据库错误。我怎么检查这个?
<?php
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"];
}
if (isset($_POST["deleted"])) {
$deleted = $_POST["deleted"];
}
if (isset($_POST["notice"])) {
$notice = $_POST["notice"];
}
$con = mysqli_connect("localhost","user","password", "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 * from STATUS where ARTICLE_NO = '$pk'");
$checkDeleted = "";
$checkNotice = "";
while ($row = mysqli_fetch_assoc($getformdata)) {
$checkDeleted = $row['deleted'];
$checkNotice = $row['notice'];
}
if($cmd=="submitinfo") {
$statusQuery = "INSERT INTO STATUS VALUES (?, ?)";
if ($statusInfo = $con->prepare($statusQuery)) {
$statusInfo->bind_param("ss", $deleted, $notice);
$statusInfo->execute();
$statusInfo->close();
echo "true";
} else {
echo "false";
}
print_r($con->error);
}
if($cmd=="EditStatusData") {
echo "<form name=\"statusForm\" action=\"test.php\" method=\"post\" enctype=\"multipart/form-data\">
<h1>Editing information for auction: ".$pk."</h1>
Löschung Ebay:
<input type=\"checkbox\" name=\"deleted\" value=\"checked\" ".$checkDeleted." />
<br />
Abmahnung:
<input type=\"checkbox\" name=\"notice\" value=\"checked\" ".$checkNotice." />
<br />
<input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" />
<input name=\"Submit\" type=\"submit\" value=\"submit\" />
</form>";
} else {
print_r($con->error);
}
答案 0 :(得分:0)
关于检查错误检查Web服务器日志或确保php在php.ini中显示错误。
您是否正在发布到网页? $ deleted和$ notice只会在POST请求中设置。
答案 1 :(得分:0)
IIRC,如果输入类型“复选框”的值为空字符串,则不会进行检查。如果是其他任何东西,它将被检查。在它看起来,值将始终“检查”。
答案 2 :(得分:0)
我不确定我是否按照你的代码......
您的HTML有:
value="checked"
这意味着如果用户选中该框并上传表单,则会为该字段提供“已检查”的值(而不是“男性”的值)。
由于您只将这些值作为值,因此永远不会有任何内容作为“未选中”插入到表中,同样,您的输入字段具有未经检查和已检查的DB输出,只是坐在那里而没有为其分配任何属性。那是故意的吗?这是构建到DB值,否则你有一些效果:
<input type="checkbox" name="notice" value="checked" "Foo" />
哪个不会做太多事情,至少没什么用处?
最后,在你的结果提取中,如果我正确读取它,你有:
$checkedValue = $row['checked'];
这意味着如果您有多个结果,那么您只是为该值分配最后一行,因此如果您确实有任何原因,底部有一个空白行,这将为您提供空白变量而不会出现错误。你的意思是将它分配给数组吗?或者至少检查一下结果计数,比如mysql_num_rows(),这样就可以确认它只是第一行(或者只有一行,甚至是)。您甚至可以添加故障保护并在一次迭代后结束while循环,以防万一。
哦,最后一件事,如果您使用Heredoc syntax又称EOD,您的代码将更清晰,更容易编写和阅读。有了这个,您就不必注释掉所有的双引号,你仍然可以使用内联变量。
答案 3 :(得分:0)
表单提交方面的简单答案是在每个复选框之前包含一个隐藏输入,其名称相同且值为“未选中”。只有选中该复选框才会覆盖隐藏输入的值。
<input type="hidden" name="notice" value="unchecked" />
<input type="checkbox" name="notice" value="checked" />
这样你总是有$ _POST ['notice']的值。
对于上面提到的验证错误并设置复选框的选中状态。根据xhtml的w3c标准,属性“checked”需要有一个值,在这种情况下也“检查。”
<?php
while ($row = mysqli_fetch_assoc($getformdata)) {
$checkDeleted = ($row['deleted'] == 'checked')
? 'checked="' . $row['deleted'] . '"'
: '';
$checkNotice = ($row['notice'] == 'checked')
? 'checked="' . $row['notice'] . '"'
: '';
}
?>
现在,您的“已检查”属性将符合标准