以php形式传递变量的问题

时间:2009-05-15 13:13:14

标签: php forms

我有以下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);
}

4 个答案:

答案 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'] . '"' 
        : '';
}
?>

现在,您的“已检查”属性将符合标准