2013-07-23 37 views
0

我想將項目插入到自動填充函數的javascript數組中。我從數據庫中獲取數組所需的值,所以我使用PHP獲取它們。然後我只是將每個項目推入JavaScript數組。然而,它一直告訴我,我有一個「意外標記ILLEGAL」,它看起來像是指向插入的單個「引號」字符,然後有一個換行符,然後繼續實際值。使用PHP插入JavaScript時獲取意外的換行

我的JavaScript/PHP

<script type="text/javascript"> 
     $(function() { 
      var availableTags = []; 
      <?php 

       foreach ($modelList as &$model) 
       echo "availableTags.push('$model');" . "\n"; 
      ?> 
      $("#devicemod").autocomplete({ 
       source: availableTags 
      }); 
     }); 


     </script> 

那麼錯誤信息......

$(function() { 
       var availableTags = []; 
       availableTags.push(' 
***Uncaught SyntaxError: Unexpected token ILLEGAL*** 
ODEL: T]422P');availableTags.push('');availableTags.push('!');availableTags.push('!6.1/120{ MODEL: TM402P');availableTags.push('!A`$');availableTags.push('!DP1110 CREATED ON: JAN 29 2002');availableTags.push('!MODEL: TM402P'); 

應該練得......

availableTags.push('ODEL:T]422P'); 
availableTags.push(''); 
etc... 
+0

確保您的變量沒有任何報價。如果有的話,你將不得不逃脫它們。 –

+0

您可能還想用'\ n'替換換行符 – Jeff

回答

1

使用json_encode()你可以在一個單一的(安全)的步驟做:

<script type="text/javascript"> 
$(function() { 
    $("#devicemod").autocomplete({ 
     source: <?php echo json_encode($modelList); ?> 
    }); 
}); 
</script> 

json_encode()功能可確保該值是根據JavaScript的符號規則正確轉義。這可以防止在這種情況下值包含單引號時的令人討厭的意外。

如果$modelList是不是真正的名單(即按鍵不按順序編號),你應該申請array_values()第一:

... 
     source: <?php echo json_encode(array_values($modelList)); ?> 
... 
+0

完美!謝謝。 – harmonickey

1

這是一個壞主意:

echo "availableTags.push('$model');" . "\n"; 

如果$model包含任何javascript元字符,特別是',則會引入語法錯誤並殺死整個<script>塊。永遠不要直接輸出任意文本到Javascript上下文 - 你基本上容易受到JS的等價物SQL injection attack的影響。

在最低限度,你應該使用json_encode(),以保證您的文字語法有效期爲你使用它在上下文:

echo 'availableTags.push(' . json_encode($model) . ");\n"; 

或更好,但...爲什麼這一切時,推你可以自動生成一個數組?

<?php 
$data = array(); 
foreach ($modelList as $model) { 
    $data[] = $model; 
} 
?> 
var availableTags = <?php echo json_encode($data); ?>;