带PHP的HTML - <script> -section代码突然结束 - bug?

mic*_*ahr 22 html javascript php intellij-idea

我在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 } ?>
Run Code Online (Sandbox Code Playgroud)

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

这看起来如下(n = 4):

$('input[id$="MegaSteel_tons"]').val(output2);
$('#MegaSteel_cart').prop(
Run Code Online (Sandbox Code Playgroud)

或(n = 2):

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

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

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

我知道了.是什么导致这个?


按要求提供更多代码:

$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
}
?>
Run Code Online (Sandbox Code Playgroud)

通过全局变量访问的分隔符是;.它在一个名为的文件中定义,该文件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
Run Code Online (Sandbox Code Playgroud)

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

访问钢铁组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
Run Code Online (Sandbox Code Playgroud)

这与预期的解析文件完全相同.


更新:更改为另一个PHP版本(5.4,5.6)无法解决此问题.


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

与此同时,我还删除了<p>...</p>没有解决问题的标签.

3pi*_*pic 4

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

“让它变得简单,尽可能简单。仅此而已。” 爱因斯坦

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

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

这就是我真实的答案。

  • 感谢您的意见。我将把它作为我在网络开发领域的进一步发展之路。然而,我很高兴我实际上用我现有的知识完成了此类项目。谈论更好的实践:如何生成根据服务器资源动态构建的 HTML/JavaScript 代码?我在哪里可以学到这个? (2认同)
  • @michaelbahr 一旦你了解了编码(并且你知道了 - 像你的问题一样混合各种语言 - ),思考架构。看到大块,不再需要排队。很快 - 在这两个作品之间 - 我想说我更喜欢一些 Ajax 代码(“你会生成根据服务器资源动态构建的 HTML/JavaScript 代码吗” =&gt; AJAX)。AJAX 和 JSON。然后使用所有 HTML/JS 代码,不再需要 PHP。我有这样的错误原因 &lt;? ?&gt; HTML/JS 里面太多了。 (2认同)