2011-10-27 23 views
0

我寫了下面的代碼...定界符格式及其實施

<?php 

$conn=mysql_connect("localhost","",""); 
if($conn) 
echo "connection established"; 

mysql_select_db("moviesite"); 

$que="select * from movie"; 
$result=mysql_query($que,$conn); 
?> 

<html> 
<title>movie database</title> 
<body> 
<table border=1 align=center> 
<th colspan=2> 
PEOPLE<a href='movie.php?action=add & id='>[ADD]</a> 
</th> 

<?php 
$ta_row=<<<eod 
    <tr> 
    <td> 
    $mov_name 
    </td> 
    <td> 
    <a href='movie.php?action=edit & id=$mov_id'>[EDIT]</a> 
    <a href='movie.php?action=delete & id=$mov_id'>[DELETE]</a> 
    <td> 
    </tr> 
eod; 

while($row=mysql_fetch_array($result)) 
{ 
$mov_id=$row["id"]; 
$mov_name=$row["name"]; 
echo $ta_row; 
} 
?> 

現在上面的代碼didnt打印的名稱或電影的ID(田野一片空白)...所以我切在$ mov_id和$ mov_name的定義之後,將$ ta_row粘貼到while循環中......這樣就排除了所有問題......但是我的問題是爲什麼代碼早期失敗......因爲它是在定義$後輸出ta_row mov_id和$ mov_name,所以如果$ ta_row只是一個字符串,它的內容變量應該被改變......爲什麼它們沒有改變?

回答

3

因爲heredoc就像任何其他字符串一樣 - 它的值在您聲明時是固定的。如果在宣佈$ta_row時未設置變量$mov_id$mov_name,則不能在$ta_row中使用它們。

如果您想要做一些像您一樣嘗試做的事情,您將不得不使用類似str_replace()sprintf()的東西 - 將原始字符串中的佔位符替換爲要顯示的實際值。

考慮一下:

$myVar = "Some string containing a $var"; 
$var = 'Variable'; 
echo $myVar; 
// Outputs: Some string containing a 

現在這個:

$var = 'Variable'; 
$myVar = "Some string containing a $var"; 
echo $myVar; 
// Outputs: Some string containing a Variable 

... here文檔的行爲正是就像一個雙引號字符串(從這個角度來看,至少)。

或者你可以這樣做:

$myVar = 'Some string containing a $var'; 
$var = 'Variable'; 
echo $myVar; 
// Outputs: Some string containing a $var 
echo str_replace('$var',$var,$myVar); 
// Outputs: Some string containing a Variable 

...因爲$myVar現在是單引號,$var出現在它的字面。然後,當您運行str_replace()時,它將替換爲值$var,而不是文字字符串。

這可能值得您重新閱讀this

0

當它在循環之前時,它不起作用,因爲它試圖使用變量$mov_id$mov_name的值,因爲它們當時存在。由於它們在代碼中沒有被定義,所以沒有什麼可以添加的。之後,$ta_row就是一個簡單的變量,它包含一個字符串,並且只包含HTML的一個字符串 - 無變量。

如果您想將其移出循環,使用一些佔位符像## MOV_ID ##和## MOV_NAME ##,那麼你可以只

echo str_replace(array('##MOV_ID##', '##MOV_NAME##', array($mov_id, $mov_name), $ta_row); 

,以獲得期望的結果