【问题标题】:HTML with PHP - <script>-section code suddenly ends - bug?带有 PHP 的 HTML - <script>-部分代码突然结束 - 错误?
【发布时间】:2015-10-04 22:30:10
【问题描述】:

我在 php-html-mixed 代码中遇到了一个非常奇怪的行为。我正在使用 XAMPP 3.2.1 (PHP 5.2.0) 和 IntelliJ IDEA 14.1。

这就是我的代码的样子(为了便于阅读,已删除,如果您需要更多信息,请告诉我):

<?php
for($i=0; $i<count($stringArray); $i++) {
    $pieces = explode($GLOBALS['delimiter'], $lineData[$i]);
?>
    <div>
        ...
        <input id="<?php echo $pieces[$someValidNumber]; ?>_identifier" ...>
        ...
        <script>
            // some javascript with <?php echo $variable; ?>
        </script>
       ...
    </div>
<?php } ?>

当该循环运行 n 次时会发生什么,对于 n-1 一切看起来都很好,但在第 n 次运行中,在 &lt;script&gt;-section 中,代码突然停止。 HTML 文件以关闭所有标签正确结束。

如下所示 (n=4):

$('input[id$="MegaSteel_tons"]').val(output2);
$('#MegaSteel_cart').prop(

或(n=2):

$('input[id$="BarZwo_meters"]').val(output2);
$('#BarZwo_cart').prop('type', 'button').change

请注意,随着 n 的增加,停止不会在以后以一种确定的方式发生。这意味着当我尝试 n=3 时,结果如下:

$('input[id$="Bar_meters"]').val(output2);
$('#Bar_cart').prop('type', 'button').change();
var price

我的知识已经走到了尽头。这是什么原因造成的?


应要求提供更多代码:

$lineData = array();
$f = fopen('products.csv', 'r');
while (($line = fgetcsv($f)) !== false) {
    if (strpos($line[0], $productLine) !== false) {
        // the above produces single value arrays, thus we access them with [0]
        $pieces = explode($GLOBALS['delimiter'], $line[0]);
        $index = (int)$pieces[2];
        // todo: input must check that index is not already taken
        $lineData[$index-1] = $line[0];
    }
}
fclose($f);

ksort($lineData);

for ($i = 0; $i < count($lineData); $i++) {

    $pieces = explode($GLOBALS['delimiter'], $lineData[$i]);

    $prod_name = $pieces[0];
    $prod_lineNumber = $pieces[2];
    $prod_quantity = $pieces[3];
    $prod_tons = $pieces[4];
    $prod_meters = $pieces[5];
    $prod_pricePerTon = $pieces[6];

        ?>
        <p>
            <!-- User-Input-->
            <b> <?php echo $pieces[0]; ?></b> - <?php echo $prod_lineNumber; ?><br/>
            Units: <input id="<?php echo $prod_name; ?>_quantity" type="text">
            Tons: <input id="<?php echo $prod_name; ?>_tons" type="text">
            Meters: <input id="<?php echo $prod_name; ?>_meters" type="text">
            Price per ton: <?php echo $prod_pricePerTon; ?>
            Calculated price: <span id="<?php echo $prod_name; ?>_price">0</span>
            <input id="<?php echo $prod_name; ?>_cart"
                   type="hidden" value="Add to shopping cart!"
                   onclick="addToCart('<?php echo $prod_name; ?>')">
            <!-- Auto-Update-->
            <script>
                // first field - quantity
                $('input[id$="<?php echo $prod_name; ?>_quantity"]').on('keyup', function () {
                    var value = parseFloat($(this).val());
                    var output1 = value * <?php echo $prod_tons . " / " . $prod_quantity; ?>;
                    var output2 = value * <?php echo $prod_meters . " / " . $prod_quantity; ?>;
                    $('input[id$="<?php echo $prod_name; ?>_tons"]').val(output1);
                    $('input[id$="<?php echo $prod_name; ?>_meters"]').val(output2);
                    $('#<?php echo $prod_name; ?>_cart').prop('type', 'button').change();
                    var price = output1 * <?php echo $prod_pricePerTon; ?>;
                    $('#<?php echo $prod_name; ?>_price').text(price);
                });
                // second field - tons
                $('input[id$="<?php echo $pieces[0]; ?>_tons"]').on('keyup', function () {
                    var value = parseFloat($(this).val());
                    var output1 = value * <?php echo $prod_quantity . " / " . $prod_tons; ?>;
                    var output2 = value * <?php echo $prod_meters . " / " . $prod_tons; ?>;
                    $('input[id$="<?php echo $prod_name; ?>_quantity"]').val(output1);
                    $('input[id$="<?php echo $prod_name; ?>_meters"]').val(output2);
                    $('#<?php echo $prod_name; ?>_cart').prop('type', 'button').change();
                    var price = value * <?php echo $prod_pricePerTon; ?>;
                    $('#<?php echo $prod_name; ?>_price').text(price);
                });
                // third field - meters
                $('input[id$="<?php echo $pieces[0]; ?>_meters"]').on('keyup', function () {
                    var value = parseFloat($(this).val());
                    var output1 = value * <?php echo $prod_quantity . " / " . $prod_meters; ?>;
                    var output2 = value * <?php echo $prod_tons . " / " . $prod_meters; ?>;
                    $('input[id$="<?php echo $prod_name; ?>_quantity"]').val(output1);
                    $('input[id$="<?php echo $prod_name; ?>_tons"]').val(output2);
                    $('#<?php echo $prod_name; ?>_cart').prop('type', 'button').change();
                    var price = output2 * <?php echo $prod_pricePerTon; ?>;
                    $('#<?php echo $prod_name; ?>_price').text(price);
                });
            </script>
        </p>
    <?php
}
?>

通过全局变量访问的分隔符是;。它在一个名为functions.php 的文件中定义,该文件通过require_once("functions.php); 包含在index.php 中(上面的代码)。

以下显示了正在解析的文本文件(请注意,这不是最佳解决方案,而是迈向完整数据库的第一步)。

Foo;Steel;1;20;30;40;4500.3
Bar;Copper;2;20;30;40;4500.3
BarFoo;Steel;3;20;30;40;4500.3
FooBar;Steel;2;20;30;40;4500.3
FooBear;Steel;4;20;30;40;4500.3

请注意,产品(Foo、Bar、...)按其产品线(Steel、Copper、...)分组,然后按第 3 列中的数字排序(以 ;-分隔的行中的第三个值) .

访问 steel-group echo $lineData[$i] 显示以下内容:

Foo;Steel;1;20;30;40;4500.3
FooBar;Steel;2;20;30;40;4500.3
BarFoo;Steel;3;20;30;40;4500.3

这与正在解析的文件中的预期完全相同。


更新:更改为另一个 php 版本(5.4、5.6)并不能解决问题。


更新:在 Powershell 中“C:\xampp\php\php.exe index.php | Out-File test.html”生成了一个 html 文件,它没有上述问题。所以有一个解决方法。我将进一步消化 IntelliJ IDEA。

与此同时,我还删除了 &lt;p&gt;...&lt;/p&gt; 标签,这些标签并没有解决问题。

【问题讨论】:

  • 离题,关于 PHP 版本。我注意到您现在评论说问题仍然存在于 php 5.4 中,但最初的问题是针对 5.2 的。如果您仍在生产服务器上使用 php 5.2,我强烈 建议您尽快升级 - 5.2 自 2011 年初以来已停止使用。它没有一直以来都有安全修复,并且已知其中存在大量主要安全漏洞。如果你在互联网上实时运行它,你迟早会被黑客入侵,如果你还没有被黑客入侵的话。
  • 尝试删除开始和结束&lt;p&gt;标签。我在循环中使用&lt;p&gt; 标记时遇到了问题。出于某种原因,它们似乎没有遵循起止模式
  • PHPFiddle 如果您查看输出的源代码,您会发现一切都在重新渲染,没有任何问题。所以你的代码很好。罪魁祸首一定是别的……
  • 你真正的问题是你在做意大利面:语言和逻辑的混合。
  • 对不起,这真是难看的意大利面条代码,我什至看不懂。您想将产品信息从服务器传递到 javascript。您基本上可以在 php 中将产品定义为一个对象,并将其作为 JSON 传递给一个变量,然后在其余代码中使用 javascript 变量。

标签: javascript php html intellij-idea


【解决方案1】:

你想要一条鱼还是学钓鱼?

“让它变得简单,尽可能简单。不再需要了。”爱因斯坦

好的,这可能是一个简单的答案,但确实如此。 您无法在合理的时间内维护/调试这样的意大利面条代码。看看你对这个问题松懈的时间。即使有赏金,你也很难解决它,因为有才华的人不会花时间在这样的代码上。

您的代码很干净。没有批评者。但你的方法不是。在 10 年的编码中,我经常遇到这种情况。损失的时间,能源费用。把这一切弄清楚,简化,综合,失败就会出现。你的代码会更强大。

这是我的真实答案。

【讨论】:

  • 感谢您的意见。我将把它用于我在 web-dev 中的进一步发展。然而,我很高兴我能以我目前的知识完成这种项目。谈论更好的实践:您将如何生成根据服务器资源动态构建的 HTML/JavaScript 代码?我在哪里可以学到?
  • @michaelbahr 一旦你了解了编码(并且你做到了——像你的问题一样混合各种语言——),想想架构。看到大块,没有更多的行。很快 - 在这里工作 2 之间 - 我会说我更喜欢一些 Ajax 代码(“你会根据服务器资源生成动态构建的 HTML/JavaScript 代码吗”=> AJAX)。 AJAX 和 JSON。然后处理所有代码 HTML/JS,不再使用 PHP。我有这样的错误原因 ?> HTML/JS 内部太多了。
【解决方案2】:
for ($i = 0; $i < count($lineData)+1; $i++)

应该给你一个“未定义的偏移量”通知,尝试将其替换为

for ($i = 0; $i < count($lineData); $i++)

另外,我认为你必须确定

$lineData[$index-1] = $line[0];

产生一个数组,其所有索引从0到count($lineData)-1

【讨论】:

  • 感谢您的意见。但是,这并不能解决代码生成的突然停止问题。 +1 是对稍后将在另一个问题中解决的问题的开发修复。我将从上面的代码中删除它。 $lineData 确实具有从 0 到 count($lineData)-1 的所有索引。这些是 0,1,2。
【解决方案3】:

尝试在脚本开头设置error_reporting(E_ALL);ini_set('display_errors', 1);。可能是 php 抛出错误并且没有显示它。使用这些命令,您将激活错误报告并显示这些错误。

【讨论】:

    【解决方案4】:

    也许可以尝试制作类似的东西:

    <?php
    $body = 'your javasrcipr text';
    for ($i = 0; $i<count($lineData); $i++) {
        print_r($body);
    }?>
    

    并检查它对您的网站的影响

    【讨论】:

    • 我的意思是你只是检查在这种情况下是否发生错误。这取决于你应该在哪里寻找可能的错误
    猜你喜欢
    • 2012-01-20
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多