2011-10-27 9 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; 
} 
?> 

今上記のコードは、名前や映画のIDを(フィールドが空白だった)を印刷didntの...ので、私はカットし、 $ mov_idと$ mov_nameの定義の後、whileループの中に$ ta_rowを貼り付けます。これはすべての問題を整理しました...しかし、私の質問はなぜコードが先に失敗したのか... $を定義した後に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 

...ヒアドキュメント構文正確(少なくともこのような観点から、)二重引用符で囲まれた文字列などを振る舞う

が、この考えてみましょう。

別の方法としては、これを行うことができます:

$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の変数はありません。

あなたはちょうど

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

は、望ましい結果を得るためにすることができ、ループの外に移動する## MOV_ID ##、その後## MOV_NAME ##のようないくつかのプレースホルダを使用したい場合は

関連する問題