【问题标题】:Need some help with making this function需要一些帮助来制作这个功能
【发布时间】:2010-01-03 20:12:40
【问题描述】:

我有一个 php 页面,用户可以在其中将数据输入到表单内的字段中。 该表单还具有图片上传实用程序。 每次上传新图片时都会刷新此页面,因此要“记住”用户已经填写的值,我有以下代码:

<input type="text" value="<?php echo @$_POST['name'];?>">

这不适用于下拉列表或收音机...

我有一个来自上一个 Q 的解决方案,但这意味着我必须在 PHP 中再次创建所有下拉列表,当它们现在是 HTML 时,并且下拉列表中有很多选项。

还有其他方法吗?

这是第一个解决方案:

$color = $_POST["colors"];
$colors = array("red","green","blue");

<select name="colors">
<?php foreach ($colors as $option) { ?>
  <option<?php print ($option == $color) ? " selected" : ""; ?>>
    <?php print $option; ?>
  </option>
<?php } ?>
</select>

谢谢

【问题讨论】:

  • 注意:不要像这样使用$_POST['name'] 而不进行任何消毒。恶意用户可以通过输入 "&gt;&lt;script&gt;...&lt;/script&gt; 之类的内容轻松注入一段 JavaScript。使用类似htmlspecialchars($_POST['name']).
  • 嗯?页面刷新了吗?为什么不刷新整个页面,直接用AJAX添加新图片?
  • @Mark 因为这会引入对 JS 的不必要依赖:icant.co.uk/articles/pragmatic-progressive-enhancement/#build

标签: php javascript html


【解决方案1】:

很抱歉,无论多么痛苦,您都必须输出有效的 HTML。最好的建议是将它包装在一个辅助函数中并包含它。或者更好的是,去找一个好的表单处理库并使用它。这个问题已经解决了 1000 次。

XSS 问题:您的示例代码存在许多安全漏洞。让我举例说明一种简洁地处理表单的简单方法。下面的代码说明了一种防错的处理方式:

  • 读取输入
  • 验证
  • 处理错误,并提供漂亮的消息
  • 重新填充表单
  • 等等……

请注意在需要时使用htmlspecialcharsENT_QUOTES。此外,使用cond ? val1 : val2 运算符可确保不会省略E_STRICT 警告,而无需使用@(这可能会影响性能)。

<?php
$FirstName = trim(isset($_POST['FirstName']) ? $_POST['FirstName'] : '');
$LastName = trim(isset($_POST['LastName']) ? $_POST['LastName'] : '');
$Gender = trim(isset($_POST['Gender']) ? $_POST['Gender'] : '');

$Action = trim(isset($_POST['Action']) ? $_POST['Action'] : '');

$Errors = array();

switch($Action)
{
case 'Process':
  // validation code here
  if(empty($FirstName))
  $Errors[] = 'First Name is required.';

  if(empty($LastName))
  $Errors[] = 'Last Name is required.';

  if($Gender != 'Male' and $Gender != 'Female')
  $Errors[] = 'Gender is required.';

  if(count($Errors) > 0)
  $break;

  // save data or whatever here

  // Redirect to next page
  header('Location: nextpage.php');
  exit;
}

?>
<html>
<head>
 ...
</head>
<body>

<?php if(count($Errors) > 0) { ?>
   <div class="error">
      <?php foreach($Error as $e) { ?>
         <p><?php echo htmlspecialchars($e); ?></p>
      <?php } ?>
   </div>
<?php } ?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES); ?>">
  <p>
  First Name:
  <input type="text" name="FirstName" value="<?php echo htmlspecialchars($FirstName, ENT_QUOTES); ?>" />
  </p>

  <p>
  Last Name:
  <input type="text" name="LastName" value="<?php echo htmlspecialchars($LastName, ENT_QUOTES); ?>" />
  </p>

  <p>
  Gender:
  <select name="Gender">
    <option value=""></option>
    <option value="Male" <?php if($Gender == 'Male') echo 'selected="selected"'; ?>>Male</option>
    <option value="Female" <?php if($Gender == 'Female') echo 'selected="selected"'; ?>>Female</option>
  </select>
  </p>

</form>

</body>
</html>

【讨论】:

    【解决方案2】:

    您可以在运行时使用 Javascript 来选择一个选项,并且您可以使用 PHP 来控制 Javascript。

    像这样:

    <?php $color = $_POST["colors"]; ?>
    <script language = "JavaScript">
    var colorOption = document.getElementById("<?php print($color)?>");
    colorOption.selected = true;
    </script>
    

    只需让该脚本在加载时运行,并将每个 option 项目的 id 设置为其值。

    【讨论】:

      【解决方案3】:

      您不必用 php 完全重做列表 - 只需标记当前选择的部分:

      <select name="opts">
      <option <?php if(@$_POST['opts'] == 'value1') echo 'selected="SELECTED"'; ?>>value1</option>
      <option <?php if(@$_POST['opts'] == 'value2') echo 'selected="SELECTED"'; ?>>value2</option>
      </select>
      

      【讨论】:

        【解决方案4】:

        您的表单有多少个选择框和单选按钮。如果计数小于 10,您可以使用 javascript 并轻松制作。否则建议在 php 中制作您的选择框

        PHP 代码:

        <?php
        
        $color = $_POST["colors"];
        $colors = array("red","green","blue");
        
        ?>
        <select name="colors">
        
        <?php 
        $varSelected = "";
        foreach ($colors as $option) 
        { 
        
          if($option == $color)
          {
            $varSelected = "selected:selected";
          }
          else
          {
            $varSelected ="";
          }
        ?>
          <option <?php echo $varSelected?>>
            <?php print $option; ?>
          </option>
        
        <?php 
        } 
        ?>
        </select>
        

        Javasript 方法:需要修改表单。您必须将 id 添加到选项框中,这将与其值相同。

        // supposing $_POST['colors']='Red';
        <html>
        <select name="gender">
        <option value="Red" id="Red">Red</option>
        <option value="Blue" id="Blue">Blue</option>
        </select>
        </html>
        
        <script type="text/javascript">
        document.getElementById("<?php echo $_POST['colors']").setAttribute("selected", "selected");
        </script>
        

        【讨论】:

          猜你喜欢
          • 2016-10-28
          • 1970-01-01
          • 2016-02-10
          • 2020-01-07
          • 2020-08-06
          • 1970-01-01
          • 2021-03-29
          • 2019-05-12
          • 1970-01-01
          相关资源
          最近更新 更多