формат heredoc и его реализация - PullRequest
0 голосов
/ 27 октября 2011

я написал следующий код ...

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

теперь вышеприведенный код не печатал название или идентификатор фильма (поля были пустыми) ... поэтому я вырезал и вставил $ ta_row внутри цикла while после определения $ mov_id и $ mov_name ... this разобрались со всеми проблемами ... но мой вопрос заключается в том, почему код потерпел неудачу раньше ... так как я выводил ta_row после определения $ mov_id и $ mov_name, поэтому, если $ ta_row - просто строка, ее переменные содержимого должны были быть изменены. .. почему они не изменились?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Поскольку 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 вместо литеральной строки.

Вероятно, стоит перечитать это .

0 голосов
/ 27 октября 2011

Это не сработало, когда у вас было это до цикла, потому что он пытался использовать значения переменных $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);

, чтобы получить желаемый результат

...