2017-05-01 49 views
0

有什麼不對下面的代碼:PHP中的兩個連續的heredocs?

static function queryVariables($variable_name) 
    { 

     $query = <<<SQL 
SELECT * 
    FROM variables v 
    WHERE v.nam = '$variable_name' 
SQL;  

    $ans = self::$conn->select($query); 


     $query = <<<SQL 
SELECT v.id, v.nam variable_nam, v.descr variable_descr, us.id subset_id, us.unit_id, us.ord, us.nam subset_nam, us.color, us.min_value, us.max_value 
    FROM variables v 
    LEFT JOIN unit_subsets us ON v.unit_id = us.unit_id 
    WHERE v.nam = '$variable_name' 
SQL; 

     $ans = self::$conn->select($query); 

     return $ans; 
    } 

我知道這是邏輯上不正確的,因爲覆蓋$query變量。但問題是:爲什麼它不明白這裏有兩個heredocs?它把整個塊作爲一個定界符並拋出

Undefined variable: ans 

例外,因爲它試圖嵌入$ans到定界符。

如何解決?

+0

將兩個heredocs一個接一個地放在一起,就像在測試文件中工作得很好。 –

回答

2

我在SQL;關閉標識符後面看到空格。你不能擁有它們。分號必須是換行符之前的最後一個字符。

SQL;  
    ^^^^^^^ 

作爲每documentation

需要注意的是,結束標識符的行必須包含沒有其他字符,除了分號這是非常重要的(;)。這意味着特別是標識符可能不會縮進,並且在分號之前或之後可能沒有任何空格或製表符。認識到關閉標識符之前的第一個字符必須是由本地操作系統定義的換行符也很重要。在UNIX系統上這是\ n,包括Mac OS X.結束分隔符後面還必須跟有一個換行符。

如果這個規則被破壞,並且結束標識符不是「乾淨」,它將不被視爲結束標識符,PHP將繼續尋找一個。如果在當前文件結束之前未找到適當的結束標識符,則最後一行會出現分析錯誤。

2

它在documentation清楚地解釋:

需要注意的是,結束標識符的行必須包含沒有其他字符,除了分號這是非常重要的(;)。這意味着特別是標識符可能不會縮進,並且在分號之前或之後可能沒有任何空格或製表符。

SQL;在發佈的代碼中首次出現在同一行中,後面跟着一堆空格。刪除它們,它會按照你的意圖工作。