2011-09-08 111 views
0

我無法逃避getItems函數內部的PHP變量:問題逃逸PHP變量

while($row = mysql_fetch_array($data)) 
    { 
    echo "<div class='favorite'>"; 
    echo "<div style='display: inline;'>".$row['Item']."</div>"; 
     if ($row['UID'] = $uid) { 
     echo "<div id='unlock'>Info</div>"; 
     } else { 
     echo "<div id='unlock' onclick='getItems('".$row['Item']."')'>Unlock</div>"; 
     } 
    echo "</div>"; 
    } 

呈現時(?爲使字)反正,當我看到它在我的網站,它說:

onclick="getItems(" whatever')' 

我在做什麼錯?

你可以看到這裏的代碼: http://www.chusmix.com/game/insert/get-items.php?user=19

+0

你能否周圍的代碼添加到發帖?看起來這可能是一個從前一行開始的語法問題。 – Zoey

+0

你想回應什麼? –

+2

嘗試:echo「

Unlock
」; –

回答

4

你的問題是,你的屬性值由單引號包圍,但你也是你的JavaScript使用單引號。

您必須在JavaScript中使用雙引號。但是,由於整個字符串(在PHP中)被雙引號包圍,因此您必須將其轉義。因此:

echo "<div id='unlock' onclick='getItems(\"".$row['Item']."\")' style='display: inline; float: right;'>Unlock</div>"; 

或者這樣:

echo "<div id='unlock' onclick='getItems(\"{$row['Item']}\")' style='display: inline; float: right;'>Unlock</div>"; 

爲了澄清什麼大括號做(從the PHP docs):

複合物(花)語法

這不叫複雜,因爲語法很複雜,但是因爲 它允許使用複雜的表達式。

任何具有字符串 表示的標量變量,數組元素或對象屬性都可以通過此語法包含在內。只需使用與字符串外部相同的方式編寫 表達式,然後 將其包裝在{和}中。

爲了進一步解釋,假設我們有以下情形:

$name = 'Apple'; 
$sentence = "$names are my favorite fruit"; 

我想要得到的是:Apples are my favorite fruit。但是,這不起作用。 PHP將改爲尋找一個名爲$names的變量,當它找不到它時,它會投訴。

因此,要解決這個問題,我們可以圍繞在大括號我們的變量:

$name = 'Apple'; 
$sentence = "{$name}s are my favorite fruit"; 

太好了!現在PHP會知道變量名的結尾和字符串的起始位置。


在一個側面說明:你可能會考慮切換到雙引號的屬性,因爲你現在做的方式是不合法的XHTML(除非你不在乎)。

+0

我現在看到這個{$ var}的東西有幾次了,從來沒有了解他們的用途,你能啓發我嗎? – evildead

+0

@evildead - 查看我更新的答案。 –

+0

非常感謝你 – evildead

0

或像這樣:

echo '<div id="unlock" onclick="getItems('."'".$row['Item']."'".')" style="display: inline; float: right;">Unlock</div>'; 

如果我不得不這樣做,它會看起來像:

<?php while(true) :?> 
    <div class="favorite"> 
    <div style="display: inline;"><?php echo $row['Item'];?></div> 
    <?php if ($row['UID'] = $uid):?> 
    <div id="unlock">Info</div> 
    <?php else: ?> 
    <div id="unlock" onclick="getItems('<?php echo $row['Item']; ?>)">Unlock</div> 
    <?php endif;?> 
</div> 
<?php endwhile;?> 
3

是的,有你的報價有問題。它應該是這樣的:

echo "<div id='unlock' onclick='getItems(\"".$row['Item']."\");' style='display: inline; float: right;'>Unlock</div>"; 

的問題是,你的開場白報價onclick和周圍的功能arguement的報價必須是一個別樣的報價。

這是很容易,雖然做的HTML,然後只需插入這樣的變量:

<div id="unlock" onclick="getItems('<?=$row['Item'];?>');" style="display: inline; float: right;">Unlock</div> 

這樣做,讓代替呼應HTML時可能會節省您的大量時間和混亂,而你將不必擔心所有轉義報價

+1

+1讓PHP處理動態部分並讓HTML單獨存在 – Phil

+0

@Phil我教了自己的PHP,並且用echo的方式做了所有的事情,直到我被僱用,並且我的同事開悟了我......大聲笑。 5000倍更容易。 –

+0

對不起,但這是不好的風格,我不會推薦你使用<?=作爲回聲。我使用它,直到我需要將我的網站移動到禁用此功能的php版本(imho這是默認設置),並且花費了足夠的時間來找出錯誤。 <?php echo ...?>有點更多打字,但它保存在任何地方,不僅在特定的安裝。 – evildead

0

內部onclick '正在關閉onclick本身。將其更改爲:

onclick='getItems(\"".$row['Item']."\")' 

這樣,在JS中,它使用不同類型的引號。

甚至更​​好......您可以離開PHP,並且有一種少得令人擔心的報價類型。

else { ?> 
    <div id='unlock' onclick='getItems("<?=$row['Item'];?>")' style='display: inline; float: right;'>Unlock</div> 
<?php 
} 
+2

我寧願使用<?php if(...):?> ... <?php else:...?> ... <?php endif; ?> – evildead

0

請嘗試以下操作。 編輯:改變以確保報價進行正確轉義

echo "<div id='unlock' onclick=\"getItems('{$nameArray[0]}')\" ></div>"; 
+0

這是錯的!你錯過給JavaScript的變量也需要引號! – evildead

+0

我剛試過,它怎麼錯了? – tam

+0

您錯過了JavaScript變量(其字符串) – evildead