Подтвердить что ты не робот

HTML с PHP - <script> - код раздела внезапно заканчивается - ошибка?

В php-html-смешанном коде возникло очень странное поведение. Я использую 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-м запуске в разделе <script> код внезапно останавливается. 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 (третье значение в '-сепаратированных строках).

Доступ к стальной группе 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.

Тем временем я также удалил теги <p>...</p>, которые не исправили проблему.

4b9b3361

Ответ 1

Вы хотите рыбу или научиться ловить рыбу?

"Сделайте это простым, как можно более простым. Нет больше". А.Эйнштейн

Хорошо, это, может быть, простой ответ, но это правда. Вы не можете поддерживать/отлаживать такой код спагетта в течение разумного количества времени. Посмотрите на то, что вы потеряли эту проблему. Даже с щедростью вам удастся решить эту проблему, потому что талантливые люди не платят за такой код.

Ваш код чист. Нет критиков. Но ваш метод - нет. Я очень часто испытывал такие случаи за 10 лет кодирования. Часы потеряны, затраты энергии. Уточните все это, упростите, синтезируйте, появится ошибка. Ваш код будет сильнее.

Это мой подлинный ответ.

Ответ 2

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

должно дать вам уведомление "Undefined offset", попробуйте заменить его

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

Кроме того, я думаю, вы должны быть уверены, что

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

создает массив со всеми индексами от 0 до count ($ lineData) -1

Ответ 3

Попробуйте установить error_reporting(E_ALL); и ini_set('display_errors', 1); в начале вашего script. Возможно, php выдает ошибку и не показывает ее. С помощью этих команд вы активируете отчет об ошибках и покажете эти ошибки.

Ответ 4

Возможно, попробуйте сделать что-то вроде этого:

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

и проверьте, что он делает на вашем сайте.