【问题标题】:How to set HTML value attribute (with spaces)如何设置 HTML 值属性(带空格)
【发布时间】:2011-03-05 22:13:07
【问题描述】:

当我使用 PHP 设置 HTML 表单输入元素的值时,只要数据中没有任何空格,它就可以正常工作。

<input type="text" name="username"
<?php echo (isset($_POST['username'])) ? "value = ".$_POST["username"] : "value = \"\""; ?> />

如果我输入“Jonathan”作为用户名,它会按预期重复给我。但是,如果我输入“Big Ted”,我只会在提交表单时重复出现“Big”。

注意$_POST["Username"]变量是正确的;当我使用 PHP 回显它时,它被设置为“Big Ted”。

【问题讨论】:

    标签: php html forms


    【解决方案1】:

    引用它。否则空格将成为属性分隔符,空格之后的所有内容都将被视为元素属性。在网络浏览器中右键单击页面并查看源代码。它不应该是这样的(另见语法高亮颜色):

    <input value=Big Ted>
    

    而是这个

    <input value="Big Ted">
    

    更不用说当某人的名字中有引号时这仍然会中断(因此您的代码对XSSattacks很敏感)。使用htmlspecialchars()

    启动示例:

    <input value="<?php echo (isset($_POST['username']) ? htmlspecialchars($_POST['username']) : ''); ?>">
    

    【讨论】:

    • XSS 与这里无关。标准要求的编码。即使您在管理区域中编辑完全允许的 HTML,您也必须对值进行 htmlencode,包括 textarea 内容。
    • @Col:我在哪里说过 XSS 与特定问题有关? :)
    • 啊,是的,我忽略了它。专注于关键词,你知道的:)
    【解决方案2】:
    <input type="text" name="username"
    <?php echo (isset($_POST['username'])) ? "value = '".$_POST["username"]' : "value = ''"; ?> />
    

    你必须用引号包裹变量结果,这样浏览器才能知道输入的内容是什么。

    【讨论】:

    • 给你的名字加上引号,你最终会遇到同样的问题:)
    【解决方案3】:

    正如您所见,它根本不是 PHP5 甚至 PHP 问题。
    想要成为 PHP 用户的人必须具备基本的 HTML 知识。

    使用模板看起来更整洁:

    获取数据部分代码:

    $username = "";
    if isset($_POST['username'])) $username = htmlspecialchars($_POST["username"]);
    

    以及模板代码:

    <input type="text" name="username" value="<?=$username?>">
    

    如果您将代码分成两部分,它会变得更易于支持和可读

    【讨论】:

    • 使用短开放标签不是一个好习惯,因为服务器可以禁用它们,但我建议不要向 OP 推荐它。
    • @meder 只需打开它。没什么大不了的。这就是配置设置的用途。
    • 你为什么要这样做?首先使用它是一种不好的做法。如果我管理服务器,我永远不会使用 PHP。
    • @meder 谁说这是“不好的做法”?
    • @meder 不,它们并没有在 PHP6 中被淘汰,这是空洞的谣言。由这些“最有经验的 PHP 开发人员”传播。我在那里没有看到一个。如果您更喜欢胖权威作为证明,ZF 在他们的模板系统中使用短标签。
    【解决方案4】:

    只需确保在字段后面加上冒号即可:

      <option value="'.$row['name'].'">
    

    【讨论】:

      【解决方案5】:
      <input type="text" name="username"
      <?php echo (isset($_POST['username'])) ? ('value = "'.$_POST["username"].'"') : "value = \"\""; ?> />
      

      注意您的报价使用情况。

      【讨论】:

      • 给你的名字加上引号,你最终会遇到同样的问题:)
      • @Col Shrapnel - 这是一个非常微不足道的问题,我已经习惯了框架为我做这项工作,所以我懒得去建议了,但可以肯定......
      • 那么为什么不举一个你最喜欢的框架使用的例子呢?
      • 因为它超出了这个简单问题的范围,而且会使事情过于复杂。
      • 他的问题是他没有将双引号包裹在其中有空格的字符串周围(正确编码在 HTML 中具有值的属性),解决方案是将双引号包裹在它周围是有效的 HTML,从而回答了他的问题。你对不那么重要的事情过于挑剔了。感谢您的反对。
      【解决方案6】:

      使用引号并且它有效。 另一方面,需要使用以下内容:

      $param=preg_replace('/[^A-Za-z0-9 ]/','', $param);
      

      【讨论】:

      • 看起来它会从参数中删除一些字符但留下空格。空格应该被编码,但这不会这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多