Heredoc deyimi ile sorun

6 Cevap

Ben bir heredoc deyimi ile HTML kodunu değiştirmek için çalışıyorum. Ancak, son line.I içinde ayrıştırma hatası alıyorum ben heredoc kapanış etiketi line.Following herhangi önde gelen boşluk veya girinti sol değil eminim olduğunu a part of kodu:

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

Where is the problem? I have a related question in addition to above. As a coding practice, is it better to use PHP code throughout or is it better to use a heredoc syntax. I mean, while in PHP mode, the script bounces back and forth between the HTML and PHP code. So, which is the preferred method?

6 Cevap

Beyler, nihayet (phew!!) Benim yolumdan ayrıştırma hatası alıyorum başardı. Ben sadece kod yeniden yazdı ve çalıştı. İşte kod:

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

Kimden PHP manual about the Heredoc syntax:

Kapanış tanımlayıcı must satırın ilk sütununda başlar.

Ve bir süre sonra güzel kırmızı Warning kutusu:

Bu kapanış tanımlayıcı ile çizgi possibly a semicolon (;). That means especially that the identifier may not be indented , ve orada önce herhangi bir boşluk ya da sekme olabilir ya da olmayabilir dışında hiçbir karakter içermelidir dikkat etmek çok önemlidir noktalı virgülden sonra.

Yani sözdizimi şartnameye uygun olduğu bu gibi bir kod yazmak gerekiyor:

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

Eğer gerçekten kullanmak istiyorsanız, bu size kalmış.

Bu kodu kullanarak tam olarak ne ise, o ilk $ tablo = <<< ENDHTML hattı hariç sol alt tarafındaki boşluk vardır. Biten heredoc bunun tam solunda bir boşluk, sekme ya da diğer karakterler ile sol-uyumlu hale getirilmesi gerekmektedir.

<p><$num_shows Shows</p>

Bu bir yabancı '<' karakter önce $num_shows?

Bu bir sorun teşkil etmez misiniz?

</tr>
ENDHTML;

Muhtemelen gerekir:

ENDHTML;

Edit: Formatting failed ... and Richy C. said the same in the meantime :( I just meant to show that the first ENDHTML;has whitespace in front of it.

Düzenleme: sırt ve şimdi döngü benim için çalışıyor ob ve değiştirildi ...

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