【问题标题】:Problem passing variables in php form以php形式传递变量的问题
【发布时间】:2009-05-15 13:13:14
【问题描述】:

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

【问题讨论】:

  • 试着把error_reporting(E_ALL);在脚本的顶部 - 可以让您了解正在发生的事情。
  • 另外,您可能希望确保在将 $pk 回显到浏览器之前对其进行验证!
  • "select * from STATUS where ARTICLE_NO = '$pk'" 也很危险
  • 代码减少了。真实物品上已进行了正确的消毒。

标签: php forms


【解决方案1】:

关于检查错误检查网络服务器日志或确保 php 在您的 php.ini 中显示错误。

您要在网页上发布信息吗? $deleted 和 $notice 只会在 POST 请求中设置。

【讨论】:

    【解决方案2】:

    IIRC,如果输入类型“checkbox”的值为空字符串,则不会被检查。如果是其他东西,它将被检查。看起来,该值将始终被“选中”。

    【讨论】:

    • 从我阅读的内容来看,value 是要发布的内容,如果你在 value 之后检查了这个词,那么它将被检查。例如
    • @Stefan:那是不正确的。如果还设置了选中的属性,则 value 是控件将设置的值。 会将 blah=true 添加到 POST STDIN 或 GET 查询字符串中。
    【解决方案3】:

    表单提交方面的简单答案是在每个具有相同名称且值为“未选中”的复选框之前包含一个隐藏输入。该复选框仅在选中时才会覆盖隐藏输入的值。

    <input type="hidden" name="notice" value="unchecked" />
    <input type="checkbox" name="notice" value="checked" />
    

    这样你总是有 $_POST['notice'] 的值。

    对于上面提到的验证错误和设置复选框的选中状态。根据 xhtml 的 w3c 标准,属性“checked”需要有一个值,在这种情况下也是“checked”。

    <?php
    
    while ($row = mysqli_fetch_assoc($getformdata)) {
        $checkDeleted = ($row['deleted'] == 'checked') 
            ? 'checked="' . $row['deleted'] . '"' 
            : '';
        $checkNotice = ($row['notice'] == 'checked') 
            ? 'checked="' . $row['notice'] . '"' 
            : '';
    }
    ?>
    

    现在你的属性“checked”将符合标准

    【讨论】:

    • 这可以做不可预测的事情。例如,如果您选中复选框,GET 字符串现在将在其中包含 notice=unchecked&notice=checked。 PHP 会将其分配给第二个,但如果浏览器以相反的顺序显示它们,则通知将始终以未选中状态返回。
    • R. Bemrose:我从未体验或听说过浏览器将表单字段的 GET 或 POST 顺序重新排序为 HTML 源顺序以外的其他内容。你有例子吗?
    • 除非保证永远不会改变,否则依赖观察到的行为是非常糟糕的做法,据我所知,变量排序并不是一成不变的。
    • 确实,仅仅依靠观察到的行为是一种不好的做法。但是,它是此处定义的 html4 和 xhtml1 标准的一部分:w3.org/TR/html401/interact/forms.html#h-17.13.4.1
    【解决方案4】:

    我不确定我是否遵循您的代码...

    您的 HTML 有:

    value="checked"
    

    这意味着如果用户选中该框并上传表单,它将为该字段赋予“已选中”的值(而不是“男性”的值)。

    由于您只有这些值作为值,因此永远不会将任何内容作为“未检查”插入表中,此外,您的输入字段具有未经检查和检查的 DB 输出只是坐在那里而没有分配任何属性.. . 这是故意的吗?是否内置到 DB 值中,否则您会产生以下效果:

     <input type="checkbox" name="notice" value="checked" "Foo" /> 
    

    哪个不会真正做很多事情,至少没有什么帮助?

    最后,在您的结果获取中,如果我没看错的话,您有:

    $checkedValue = $row['checked'];
    

    这意味着,如果您有多个结果,您只需为最后一行分配该值,因此,无论出于何种原因,如果您确实在底部有一个空白行,这将为您提供空白变量并且没有错误。你的意思是把它分配给一个数组吗?或者至少检查结果计数,例如 mysql_num_rows(),以便您可以确认它只是第一行(或者甚至只有一行)。你甚至可以添加一个故障保护并让它在一次迭代后结束 while 循环,以防万一。

    哦,最后一件事,如果您使用 Heredoc syntax aka EOD,您的代码将会更简洁、更易于编写和阅读。有了这个,您不必注释掉所有的双引号,您仍然可以使用内联变量。

    【讨论】:

    • 基于echoecho.com/htmlforms09.htm 的示例,如果值标识符后面有checked 字样,则会选中一个复选框。您是对的,如果未选中该复选框,则不会有任何信息,例如“未选中”,我原以为这会提交“”,这很好。我的结果提取应该只返回一行,因为 ARTICLE_NO 是主键。我将研究 Heredoc 语法
    • 啊……抱歉,评论中的空格已删除
    • 我刚刚通过 w3cvalidator 运行了那个示例代码(在我给它一个好的文档类型和所有这些东西之后),它返回了 25 个错误。其中大部分是漂亮的 2005 类型错误,例如当元素不包含任何内容时不使用 /> 关闭元素等。最后将其清理到它只是浮动“已检查”属性的位置,并显示“名称只有在指定了 SHORTTAG YES 时,才能从属性规范中省略 VI 分隔符”,所以要小心。但即便如此,该值也不应设置为已选中,已选中只是浮动的,不等于任何值。
    • @Anthony:在 HTML4 中将检查设置为空是可以的。 XHTML 要求将其设置为 checked="checked" 。
    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多