2011-09-08 70 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