2012-01-03 57 views
1

我試圖將一個PHP字符串傳遞給一個javascript函數。 PHP部分看起來像這樣:將一個朋友的名字的PHP字符串傳遞給javascript函數

<?php 
    foreach ($friends as $key => $friend) { 
    // Extract the pieces of info we need from the requests above 
    $id = assertNumeric(idx($friend, 'id')); 
    $name = idx($friend, 'name'); 
    // Here we link each friend we display to their profile 
    echo(' 
    <li> 
    <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')"> 
    <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . ' 
    </a> 
    <form> 
    <input type="button" value="Meet" onclick="postMeet(. $name.)"/> 
    </form> 
    </li>'); 
    } 
?> 

javascript函數看起來像這樣。如果我將$ key或$ id傳遞給函數,但不傳遞$ name,它會很好地工作。任何人有任何想法?我很新的PHP和JavaScript。

<script type="text/javascript"> 
function postMeet(key) 
{ 
     var met = 'Met '; 
     var body = met + ' '+ key; 
     FB.api('/me/feed', 'post', { message: body }, function(response) { 
       if (!response || response.error) { 
       alert(response[0]); 
       alert('Error occured'); 
       } else { 
       alert('Post ID: ' + response.id); 
       } 
       });   
} 
</script> 

回答

6

有三樣東西在你的echo語句來考慮:

  1. $name是你要去一個字符串作爲字符串文字嵌入HTML中的onclick屬性的JavaScript中,因此您要通過它的位置進入你的postMeet函數,你必須在它周圍加引號。 JavaScript允許字符串文字被引用'",只要它們是平衡的。由於我們用"(因爲HTML不允許')引用onclick屬性,所以最容易使用'來分隔JavaScript字符串。所以:圍繞它放置'

  2. postMeet調用位於HTML屬性(onclick)內,這意味着讀取標記時將讀取爲HTML文本。因此,你必須確保有特殊的任何字符到HTML(例如,主要<&,加上在這種情況下"因爲你使用"作爲分隔符爲您onclick屬性)正確編碼爲&lt;&amp;&quot; 。 PHP提供了htmlspecialchars函數來做到這一點。也許你在想「但$name將永遠不會有<」。這就是錯誤如何顯現。養成對這些東西進行完全編碼的習慣,並且當你輸出更有趣的東西時你不會忘記。此外,人們在數據庫中填寫「名稱」字段的各種廢話。

  3. 一個JavaScript字符串中,反斜線和任何種類報價您用來分隔字符串中(例如,'"必須進行轉義(用反斜槓)。所以你必須考慮可能在$name或更好的情況下,完全爲自己辯護。字符串文字'T.J. Crowder'有效,但字符串文字'Gerard 't Hooft'導致語法錯誤,因爲't Hooft中的'未被轉義。它必須寫成"Gerard 't Hooft"(用雙引號分隔)或'Gerard \'t Hooft'(轉義單引號)。 PHP提供了一個方便的功能,addslashes,它將在',",\和空字節之前插入反斜槓。

所以把所有在一起,我們必須包裝某種報價圍繞變量的值,當我們輸出到postMeet,我們必須編碼特殊HTML字符,我們必須確保報價和如逃脫用反斜槓:

//    +--- start string literal with single quote 
//    | 
//    vv 
onclick="postMeet(\''. addslashes(htmlspecialchars($name)) .'\')" 
//      ^^^^^^^^^^ ^^^^^^^^^^^^^^^   ^^ 
//       |   |     | 
// escape ", ', and \ -----+   |     | 
//   encode special HTML chars --+     | 
//     end literal with single quote ---------+ 

如:

echo(' 
    <li> 
    <a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')"> 
    <img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . ' 
</a> 
<form> 
<input type="button" value="Meet" onclick="postMeet(\''. addslashes(htmlspecialchars($name)) .'\')"/> 
</form> 
</li>'); 

記住解釋事情的三層是很重要的:PHP是interpretin g你的PHP代碼和輸出標記到一個HTML頁面;瀏覽器正在解釋HTML標記,其中包括onclick屬性的內容;並且JavaScript解釋器解釋onclick屬性的字符串內容(瀏覽器在點擊發生時將其傳遞),該屬性必須是有效的JavaScript代碼。

下面是一個更加獨立的示例,它很容易複製並粘貼到測試頁面中。使用「查看源文件」的測試頁面上看到什麼瀏覽器看到的,當然點擊div地看到,一切運行正常:

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>PHP Escape Test</title> 
</head> 
<body> 
<?php 
    $stuff = "Gerard 't Hooft says <<\"theoretical physics is FUN & a great way to aid humankind!\">>"; 
    echo('<div onclick="foo(\'' . addslashes(htmlspecialchars($stuff)) . '\')">Click me</div>'); 
?> 
<script> 
function foo(stuff) { 
    alert(stuff); 
} 
</script> 
</body> 
</html> 
+0

我希望你會發一條消息 - onclick =「postMeet(\'」。htmlspecialchars($ name)。「\')」 – devdRew 2012-01-03 12:07:34

+0

@devdRew:不,我沒有因爲他使用''''而不是'''引用傳遞給'echo'的字符串,但是我錯過了一對'''字符,所以謝謝。 – 2012-01-03 12:11:59

0
echo(' 
<li> 
<a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')"> 
<img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . ' 
</a> 
<form> 
<input type="button" value="Meet" onclick="postMeet(. $name.)"/> 
</form> 
</li>'); 
} 

錯誤的部分。 $ name。,。 $名稱。改成 \'' 。 $名稱。 '\',所以這應該是

echo(' 
<li> 
<a href="#" onclick="window.open(\'http://www.facebook.com/' . $id . '\')"> 
<img src="https://graph.facebook.com/' . $id . '/picture?type=square" alt="' . $name . '">'. $name . ' 
</a> 
<form> 
<input type="button" value="Meet" onclick="postMeet(\'' . htmlspecialchars($name) . '\')"/> 
</form> 
</li>'); 
} 

這就是爲什麼

$name = 'Andrew'; 
$var = '$name'; // outputs '$name'; 
$var = "$name"; // outputs 'Andrew'; 
+0

...如果'$ name'包含'''?或者'''? – 2012-01-03 12:01:52

+0

然後是htmlspecialchars($ name),但我認爲的主要問題是如何將VAR的VALUE轉換爲字符串:) – devdRew 2012-01-03 12:06:23

+0

如果你只是說「放在引號周圍」,完全知道那不會是一般情況下的完整答案,你只是在後面設置提問者。 – 2012-01-03 12:08:03

0

的onclick =「postMeet($名。 ) 「/>

由於 的onclick =」 postMeet(」。$名字。 ')「/>

+0

完美地工作: \' '。htmlspecialchars($ name)。'\' 謝謝大家! – 2012-01-03 12:29:21

相關問題