我写了以下代码......
<?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(字段是空白的)...所以我在定义$ mov_id和$ mov_name之后在$循环中剪切并粘贴$ ta_row ...解决了所有问题...但我的问题是为什么代码早先失败...因为我在定义$ mov_id和$ mov_name后输出ta_row所以如果$ ta_row只是一个字符串,其内容变量应该已经改变。 ..为什么他们没有改变?
答案 0 :(得分:3)
因为heredoc就像任何其他字符串一样 - 当你声明它时它的值是固定的。如果在声明$mov_id
时未设置变量$mov_name
和$ta_row
,则无法在$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
...... Heredocs的行为完全就像双引号字符串一样(从这个角度来看,至少)。
或者你可以这样做:
$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。
答案 1 :(得分: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);
获得所需的结果