【问题标题】:php form issuesphp表单问题
【发布时间】:2010-10-27 00:04:43
【问题描述】:

我有一个表单,我试图用它显示一个带有复选框的表单,然后无论这些复选框是否被选中,都插入到数据库中。然后,每次调用页面时,检查值并将信息附加到 html 表单以适当地将复选框显示为选中或未选中。

我已经修改了下面的代码示例以使其简短,并且我知道我将检查的值分配给“值”,这不会做任何事情。

方法

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

将复选框显示为已选中,虽然不是有效的 html,但适用于每个浏览器,并且基于示例 here。我宁愿坚持这种方法。

现在,我看不出我的代码有什么问题。

第一步应该是从数据库中检索值,其中只有一行将被检索,因为 article_no 是主键。如果没有检索到任何内容,则只需将变量分配为“”,这会导致未选中复选框。

当该值被选中时,如果它被选中,它应该被插入到数据库中,并在下次查看页面时显示为选中。

现在,这个代码完全失败了。 firebug 没有在控制台中显示任何发送或接收的内容,php 或 mysql 都没有记录错误,尽管字段等正确,但数据库中没有任何内容出现,没有报告 mysql 错误...

有什么问题?

The code:

<?php

error_reporting(E_ALL);
if (isset($_GET["cmd"]))

  $cmd = $_GET["cmd"];

else
if (isset($_POST["cmd"]))

  $cmd = $_POST["cmd"];


  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","pass", "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 TEST where ARTICLE_NO = '$pk'");

$checkDeleted = "";
$checkNotice = "";


  while ($row = mysqli_fetch_assoc($getformdata))

  {

    $checkDeleted = $row['deleted'];

    $checkNotice = $row['notice'];

   } 
if($cmd=="submitinfo"){
$statusQuery = "INSERT INTO TEST VALUES (?, ?, ?)";

if ($statusInfo = $con->prepare($statusQuery)) {

    $statusInfo->bind_param("sss", $pk, $deleted, $notice);

   $statusInfo->execute();

   $statusInfo->close();
} else {

print_r($con->error);

}
}

echo "<form name=\"statusForm\" action=\"x.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." align=\"right\"/>
<br />
Abmahnung:
<input type=\"checkbox\" name=\"notice\"  value=\"checked\" ".$checkNotice."  align=\"left\"/>
<br />
<input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" />
<input name=\"Submit\" type=\"submit\" value=\"submit\" />
</form>";

在实际的表单/页面中,我进行了适当的清理。

一个大问题是没有任何东西被插入到数据库中,也没有返回任何错误!

【问题讨论】:

  • 在 PHP 中也添加输入清理 - 客户端清理可以关闭...
  • 您的代码容易受到 sql 注入的攻击。在第一个选择查询中对 $pk 使用 bind_param。它也容易受到 xss 注入的影响。将 $pk 嵌入到 html 中时,使用 htmlspecialchars() 转义它。

标签: php mysql html forms


【解决方案1】:

请务必记住,未选中的复选框在发送表单时不会为表单提供任何值。取消选中删除框时,没有设置 $_POST['deleted'] 值。

考虑到这一点,如果复选框被清除,看起来您实际上并没有设置 $deleted 的值。使用这样的成语。

$deleted = isset($_POST["deleted"]) ? 1: 0;

将 1 和 0 替换为您想要在数据库表中为选中和未选中状态(在您的情况下为“选中”和“”)的任何值

【讨论】:

  • 如果复选框没有被选中,那么相关的值肯定应该保持为“”,这只会显示它没有被选中。我仍然不明白为什么什么都没有发送,而且我没有收到任何错误。
  • 您没有收到任何未选中复选框的提交值,我已修改我的答案以使其更清晰。
  • 感谢您的回答...现在测试一下。尝试使用 $deleted = isset($_POST["deleted"]) ? “检查”:“”;我觉得奇怪的是我没有收到任何错误
  • 嗯,数据库中仍然没有任何内容,也没有错误...,我真的不明白。
【解决方案2】:

与 Paul Dixon 的回答相同,我有时会这样做:

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

如果用户取消选中该复选框,则会发送隐藏输入的值。这样,$_POST['notice'] 始终会发送到您的脚本。

【讨论】:

    【解决方案3】:

    我认为复选框应该这样做:

    <input type="checkbox" name="notice1"  value="value1" checked="checked"/>
    <input type="checkbox" name="notice2"  value="value2" checked="checked"/>
    

    【讨论】:

    • 是的,但是我不能那么容易地做我想做的事。正如我所说,我的方法有效,所以没关系。
    • 我认为您正在考虑单选按钮。如果用户同时选中这两个复选框,则仅发送 value2(除非您将 name="notice" 变为 name="notice[]")。
    • 这不是直接回答问题,而是更多关于 html 的提示:想要指出的点是,如何在输入字段上使用选中的属性。
    猜你喜欢
    • 2023-03-25
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2015-01-02
    • 2015-11-12
    • 2014-02-09
    相关资源
    最近更新 更多