2009-08-03 5 views
3

J'essaie de remplacer le code HTML par une instruction heredoc. Cependant, je reçois une erreur d'analyse dans les dernières line.I suis sûr que je ne l'ai pas laissé d'espace avant ou en retrait sur la balise de fermeture heredoc line.Following est une partie de le code:Problème avec l'instruction 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; 
    ?> 

Où est le problème? J'ai une question connexe en plus de ci-dessus. En tant que pratique de codage, est-il préférable d'utiliser le code PHP tout au long ou est-il préférable d'utiliser une syntaxe heredoc? Je veux dire, en mode PHP, le script rebondit entre le code HTML et PHP. Alors, quelle est la méthode préférée?

+0

que le code a besoin de quelques pré-tags, difficile de dire qui est la dernière ligne ... :) – falstro

+0

Honnêtement pour ce format, vous auriez probablement constaté que beaucoup moins de problèmes si vous utilise des guillemets simples. Vous auriez toujours toutes les nouvelles lignes et les espaces de tabulation, et ne rencontreriez pas les problèmes avec HEREDOC. –

Répondre

1

Les gars, finalement, j'ai réussi à faire sortir l'erreur d'analyse (ouf !!). Je viens de réécrire le code et ça a marché. Voici le code:

$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

<p><$num_shows Shows</p>

Est-ce une étrangère '<' caractère avant $num_shows?

+0

Je viens d'ajouter ici par erreur. Bien que ce ne soit pas présent dans le code original. –

+0

Et même si c'était là, il ne pouvait pas générer une erreur d'analyse, je pense. – fresskoma

2

Si ce code est exactement ce que vous utilisez, alors il y a un certain nombre d'espaces sur le côté gauche à l'exception du premier $ table = < < < ligne ENDHTML. L'hérédoc de fin doit être exactement aligné à gauche, sans espaces, tabulations ou autres caractères à sa gauche.

+0

Tout est parfaitement sur le côté gauche dans mon éditeur de code. Il montre seulement les espaces de gauche ici. Dieu .. Je vais déchirer mes cheveux à part :( –

+0

Pouvez-vous réduire le code à un cas de test plus petit? Enlevez heredocs jusqu'à ce que vous ne recevez plus l'erreur? –

+0

En fait, j'ai exécuté le code sans heredoc suntax c'est-à-dire en utilisant HTML avec du code PHP..qui fonctionne assez bien..je voulais juste essayer la syntaxe heredoc..et puis est venu le problème :( –

0

Cela ne poserait-il pas problème?

</tr> 
ENDHTML; 

Vous devriez probablement:

ENDHTML;

Edit: Mise en forme a échoué ... et Richy C. dit la même chose dans l'intervalle :(Je voulais simplement montrer que la première ENDHTML; a des espaces devant elle

0

Edit.: changé ob et en arrière et maintenant la boucle fonctionne pour moi ...

while($row = mysql_fetch_assoc($result)){ 
    extract($row); 
    $table .= <<< ENDHTML 
    <tr> 
     <td>$showid2</td> 
     <td>$showname2</td> 
    </tr> 
ENDHTML; 
} 
+0

Le problème de boucle génèrera une erreur d'analyse? –

+0

Je viens de le changer d'ob à heredoc et ça fonctionne en fait ... – OIS

6

de l'PHP manual about the Heredoc syntax:

L'identifiant de fermeture doit commencer dans la première colonne de la ligne.

Et un peu plus tard dans la belle rouge Avertissement boîte:

Il est très important de noter que la ligne avec l'identifiant de fermeture ne doit pas contenir d'autres caractères, à l'exception éventuellement un point-virgule (;). Cela signifie en particulier que l'identificateur ne peut pas être indenté, et qu'il n'y a pas d'espaces ou d'onglets avant ou après le point-virgule.

Alors vous devez écrire le code comme celui-ci de se conformer à la spécification de syntaxe:

$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; 

Il est à vous si vous voulez vraiment utiliser.

+0

J'ai essayé presque tout mais ce code d'analyse ne me dit pas au revoir Je pense que c'est mieux si je devais dire au revoir à heredoc –