【问题标题】:Echo JavaScript alert of a PHP array value on an HTML button?HTML 按钮上的 PHP 数组值的 Echo JavaScript 警报?
【发布时间】:2012-04-04 09:48:47
【问题描述】:

我正在尝试使用 PHP 在股票交易游戏中回显一组按钮(买入和卖出)。这些按钮最终将有一个 onclick= 事件处理程序,该处理程序调用一个 JavaScript 函数来填充表单上的一些字段,但我只是试图让一个带有一条数据的 alert() 工作。我只是无法从我的 echo 语句中获取结果以正确打印警报,因此它甚至不会触发。我还使用了 print_r ($stockInfo) 来确保我的数组正确填充了测试数据。

这是我的数组:

$stockInfo = array(
    array('name' => 'Company 1', 'description' => 'Description 1', 'price' => '100', 'yield' => '.05'),
    array('name' => 'Company 2', 'description' => 'Description 2', 'price' => '89', 'yield' => '.06'),
    array('name' => 'Company 3', 'description' => 'Description 3', 'price' => '110', 'yield' => '.03')
);

还有我试图生成按钮的 PHP 代码:

<?php
echo <<<EOT
    <button id="buy" class="btn btn-primary btn-small" onclick="alert('$stockInfo[0]["name"]');">Buy</button>
EOT;
?>

该代码的结果是:

<button id="buy" class="btn btn-primary btn-small" onclick="alert('Array["name"]');">Buy</button>

我就是想不通为什么我连一个简单的开火警报都得不到。运行:

echo $stockInfo[0]["name"];

正确打印出“Company 1”,但它不会在 alert() 的参数中打印该文本。

我已经阅读了 Stackoverflow 和许多网络文章,并在过去一天进行了实验,但我就是想不通。如果有人能提供任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

    标签: php javascript echo alert heredoc


    【解决方案1】:

    要在heredoc syntax 中使用变量,您必须在它们周围加上大括号:

    <?php
    echo <<<EOT
        <button id="buy" class="btn btn-primary btn-small" onclick="alert('{$stockInfo[0]["name"]}');">Buy</button>
    EOT;
    ?>
    

    【讨论】:

    • @Madmartigan 谢谢,当我收到我的答案已被编辑的消息时,我只是补充说。
    • 由于这并不总是正确的,我正在寻找解释它的实际段落,我发现最接近的是:"Heredoc 文本的行为就像一个双引号字符串,没有双引号。这意味着不需要对heredoc中的引号进行转义,但仍然可以使用上面列出的转义码。变量被扩展,但同样表达复杂变量时必须注意 在heredoc 中和字符串一样。"
    • 非常感谢 jeroen 和 Madmartigan(我喜欢 Willow!)。那行得通。我对 PHP 很陌生,回显复杂的字符串绝对是现在最让我绊倒的事情。我将使用您的代码作为我编写的其他内容的基础。再次感谢!
    • 对使用HEREDOC语法的其他人来说只是一个FYI,最后的“EOT;”前面必须没有任何东西。当前面有一个选项卡时,我得到了一个错误,但是一旦我把它一直推到左边,这个语句就起作用了。很奇怪,但至少它起作用了。
    • @jeroen 是的,我在摆弄 HEREDOC 一段时间后看到了这一点。我没有从官方文档开始,我只是阅读了一些博客文章和教程,没有人提到 EOT 需要一直推到左边。为什么前导空格/制表符会有所作为仍然没有多大意义,但至少我知道:)
    【解决方案2】:
    echo <<<EOT
        <button id="buy" class="btn btn-primary btn-small" onclick="alert({$stockInfo[0]["name"]});">Buy</button>
    EOT;
    ?>
    

    【讨论】:

      【解决方案3】:

      理想情况下,您不希望像那样将变量直接放入输出中,因为如果该字符串中只有一个 ',您的 JavaScript 就会搞砸。

      相反,通过不使用 HEREDOC 并使用正确的方法来避免这两个问题:

      echo "<button id=\"buy\" class=\"...\"
         onclick=\"alert(".htmlspecialchars(json_encode($stockInfo[0]['name'])).");\">Buy</button>";
      

      json_encode 实质上使任何 PHP 变量(资源除外)能够直接转储到 JavaScript 代码中。

      htmlspecialchars 使结果可以安全地用于 HTML 属性。

      【讨论】:

      • 看起来差不多完美,它呈现的 HTML 是:
      • 它不起作用,因为 json_encode 产生双引号,并且属性已经在使用它们。
      • 好点。我忘了考虑到这一点。 5 秒内修复。
      • 碰巧注意到您的更新,但您只是遇到了更多问题。您需要 alert() 的值单引号,或将 onclick 属性的引号更改为单引号。很好用htmlspecialchars,但你正在倒退。这里真的不需要json_encode。您关于“使任何 PHP 变量(资源除外)能够直接转储到 JavaScript 代码中”的陈述过于宽泛而无用,所以恐怕我不得不记下这个答案。这是您的代码演示:codepad.org/aXw3esy6
      • 您关于 htmlspecialchars 使任何属性安全的说法也具有误导性,尤其是在 javascript 的上下文中,您可以在不使用 HTML 特殊字符的情况下进行技巧。最好不要将不受信任的数据完全放在 js 事件属性中。但是,是的,它会使其“安全”,因为它是有效的 HTML/JS。
      猜你喜欢
      • 2017-09-29
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 2019-06-23
      • 2017-09-01
      相关资源
      最近更新 更多