Проблема с утверждением heredoc - PullRequest
3 голосов
/ 03 августа 2009

Я пытаюсь заменить код HTML оператором heredoc. Тем не менее, я получаю сообщение об ошибке разбора в последней строке. Я уверен, что я не оставил ни одного начального пробела или отступа в строке тега heredoc.

$table = <<<ENDHTML
    <div style="text-align:center;">
    <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
    <tr>
    <th>Show I.D</th>
    <th>Show Name</th>
    </tr>
    ENDHTML;
    while($row = mysql_fetch_assoc($result)){
            extract($row);
            $table .= <<<ENDHTML
            <tr>
                <td>$showid2 </td>
                <td>$showname2</td>
            </tr>
    ENDHTML;        
    }
    $table .= <<<ENDHTML
    </table>
    <p><$num_shows Shows</p>
    </div>
    ENDHTML; 
    echo $table;
    ?>

Где проблема? У меня есть связанный вопрос в дополнение к выше. Как практика кодирования, лучше использовать PHP-код повсюду или лучше использовать синтаксис heredoc. Я имею в виду, что, находясь в режиме PHP, скрипт перемещается назад и вперед между кодом HTML и PHP. Итак, какой метод является предпочтительным?

Ответы [ 6 ]

6 голосов
/ 03 августа 2009

Из руководства PHP о синтаксисе Heredoc :

Закрывающий идентификатор должен начинаться с первого столбца строки.

И чуть позже в приятном красном Предупреждение поле:

Очень важно отметить, что строка с закрывающим идентификатором не должна содержать других символов, кроме возможно точка с запятой (;). В особенности это означает, что идентификатор не может иметь отступ , и не должно быть пробелов или табуляции до или после точки с запятой.

Итак, вам нужно написать код, подобный следующему, чтобы соответствовать спецификации синтаксиса:

$table = <<<ENDHTML
    <div style="text-align:center;">
    <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
    <tr>
    <th>Show I.D</th>
    <th>Show Name</th>
    </tr>
ENDHTML;
    while($row = mysql_fetch_assoc($result)){
                extract($row);
                $table .= <<<ENDHTML
                <tr>
                        <td>$showid2 </td>
                        <td>$showname2</td>
                </tr>
ENDHTML;
    }
    $table .= <<<ENDHTML
    </table>
    <p><$num_shows Shows</p>
    </div>
ENDHTML;
    echo $table;

Это зависит от вас, если вы действительно хотите использовать это.

2 голосов
/ 03 августа 2009

Если этот код именно то, что вы используете, то в левой части есть несколько пробелов, за исключением первой строки $ table = <<< ENDHTML. Окончательный heredoc должен быть точно выровнен по левому краю без пробелов, табуляции или других символов слева от него. </p>

1 голос
/ 04 августа 2009

Ребята, наконец-то мне удалось убрать ошибку синтаксического анализа (фу!). Я просто переписал код, и он работал. Вот код:

$table = <<<ABC
  <div style="text-align:center;">
  <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
  <tr>
  <th>Show I.D</th>
  <th>Show Name</th>
  <th>Show Genre</th>
  </tr>
ABC;
  while($row = mysql_fetch_assoc($result))
  {
      extract($row);
$table .= <<<ABC
      <tr>
      <td>$showid2 </td>
      <td>$showname2</td>
      <td>$showtype2_label</td>
      </tr>
ABC;
  }
$table .= <<<ABC
  </table>
  <p>$num_shows Shows</p>
  </div>
ABC;

echo $table;
1 голос
/ 03 августа 2009

<p><$num_shows Shows</p>

Это посторонний символ '<' до <code>$num_shows?

0 голосов
/ 03 августа 2009

Редактировать: изменено на ob и обратно, и теперь цикл работает для меня ...

while($row = mysql_fetch_assoc($result)){
    extract($row);
    $table .= <<< ENDHTML
    <tr>
        <td>$showid2</td>
        <td>$showname2</td>
    </tr>
ENDHTML;
}
0 голосов
/ 03 августа 2009

Не создаст ли это проблемы?

</tr>
ENDHTML;

Вы, вероятно, должны:

ENDHTML;

Изменить: Форматирование не удалось ... и Ричи тем временем сказал то же самое :( Я просто хотел показать, что у первого ENDHTML; есть пробел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...