我写了(感谢Stackoverflow帮助)一个PHP脚本(称为wunder_temp.php),它显示了给定数量的Weatherunderground.com站的温度和位置。
我将此脚本包含在我的页脚中,但它在单页上运行良好。 如果我打开http://www.flapane.com/guestbook/guestbook.php,我的页脚中将不显示温度,error.log说: [09-Sep-2012 09:46:45 UTC] PHP致命错误:第47行/home/xxx/public_html/wunder_temp.php中的字符串不支持[]运算符
$display = file($cachename, FILE_IGNORE_NEW_LINES); //ignore \n for non-reporting stations
foreach ($display as $key=>$value){
if($key % 2 == 0){
$temperature[] = $value; // EVEN (righe del file cache pari)
}else{
$location[] = $value; // ODD - **HERE IS LINE 47**
}
}
奇怪的是,guestbook.php是我网站的唯一页面,其中wunder_temp.php不起作用。
以上代码的作用是读取缓存文件并在$ temperature []数组中输入偶数行,在$ location []数组中输入奇数行。 这是我的缓存文件中的一个示例:
26.8
Stadio San Paolo di Napoli, Napoli
24.4
Pozzuoli
老实说,我不知道为什么我会在留言簿页面上看到错误。
事实证明,“罪魁祸首”是函数loadmore.php,它使用twitter风格的ajax函数加载留言簿评论(并包含在guestbook.php中)。如果我不包含它,wunder_temp.php运行良好,并且不会产生任何错误。
loadmore.php:
<div id='contcomment'>
<div class="timeline" id="updates">
<?php
$sql=mysql_query("select * from gbook_comments ORDER BY id DESC LIMIT 9");
while($row=mysql_fetch_array($sql))
{
$msg_id=$row['id'];
$name=$row['name'];
$url=$row['url'];
$email=$row['email'];
$location=$row['location'];
$date= strtotime($row['dt']); //unix timestamp
$country_code=$row['country_code'];
$message=$row['body'];
$link_open = '';
$link_close = '';
if($url){
// If the person has entered a URL when adding a comment,
// define opening and closing hyperlink tags
$link_open = '<a href="'.$url.'" target="_blank" rel="nofollow">';
$link_close = '</a>';
}
// Needed for the default gravatar image:
$url_grav = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/img/default_avatar.gif';
// Show flags
$image = strtolower($country_code) . ".png";
if (file_exists("./img/flags/" . $image)){
$show_image = true;
$image_link = "<img src='/guestbook/img/flags/$image' alt='user flag' />";
}else{
$show_image = false;
}
echo '<div class="comment">
<div class="avatar">
'.$link_open.'
<img src="http://www.gravatar.com/avatar/'.md5($email).'?size=50&default='.urlencode($url_grav).'" alt="gravatar icon" />
'.$link_close.'
</div>
<div class="name">'.$link_open.$name.$link_close.' </div><div class="location"><i>(da/from '.$location.' '.$image_link.' )</i></div>
<div class="date" title="Added at '.date('H:i \o\n d M Y',$date).'">'.date('d M Y',$date).'</div>
<p>'.$message.'</p>
</div>' ;
} ?>
</div>
<div id="more<?php echo $msg_id; ?>" class="morebox">
<a href="#" class="more" id="<?php echo $msg_id; ?>">Carica Commenti più vecchi / Load older entries</a>
</div>
</div>
ajax_more.js AJAX twitter-style load-more-comments功能:
$(function() {
//More Button
$('.more').live("click",function()
{
var ID = $(this).attr("id");
if(ID)
{
$("#more"+ID).html('<img src="moreajax.gif" />');
$.ajax({
type: "POST",
url: "ajax_more.php",
data: "lastmsg="+ ID,
cache: false,
success: function(html){
$("div#updates").append(html);
$("#more"+ID).remove();
}
});
}
else
{
$(".morebox").html('Nessun altro commento / No more comments');
}
return false;
});
});
ajax_more.php(上述脚本需要):
<?
include "connect.php";
if(isSet($_POST['lastmsg']))
{
$lastmsg=$_POST['lastmsg'];
$lastmsg=mysql_real_escape_string($lastmsg);
$result=mysql_query("select * from gbook_comments where id<'$lastmsg' order by id desc limit 9");
$count=mysql_num_rows($result);
while($row=mysql_fetch_array($result))
{
$msg_id=$row['id'];
$name=$row['name'];
$url=$row['url'];
$email=$row['email'];
$location=$row['location'];
$date= strtotime($row['dt']); //unix timestamp
$country_code=$row['country_code'];
$message=$row['body'];
$link_open = '';
$link_close = '';
if($url){
// If the person has entered a URL when adding a comment,
// define opening and closing hyperlink tags
$link_open = '<a href="'.$url.'" target="_blank" rel="nofollow">';
$link_close = '</a>';
}
// Needed for the default gravatar image:
$url_grav = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/img/default_avatar.gif';
// Show flags
$image = strtolower($country_code) . ".png";
if (file_exists("./img/flags/" . $image)){
$show_image = true;
$image_link = "<img src='/guestbook/img/flags/$image' alt='user flag' />";
}else{
$show_image = false;
}
echo '<div class="comment">
<div class="avatar">
'.$link_open.'
<img src="http://www.gravatar.com/avatar/'.md5($email).'?size=50&default='.urlencode($url_grav).'" alt="gravatar icon" />
'.$link_close.'
</div>
<div class="name">'.$link_open.$name.$link_close.' </div><div class="location"><i>(da/from '.$location.' '.$image_link.' )</i></div>
<div class="date" title="Added at '.date('H:i \o\n d M Y',$date).'">'.date('d M Y',$date).'</div>
<p>'.$message.'</p>
</div>' ;
}
?>
<div id="more<?php echo $msg_id; ?>" class="morebox">
<a href="#" id="<?php echo $msg_id; ?>" class="more">Carica Commenti più vecchi / Load older entries</a>
</div>
<?php
}
?>
感谢任何帮助
答案 0 :(得分:5)
$location
已经是该页面上的字符串。这就是您在使用它们之前正确初始化变量的原因:
$temperature = $location = array();
foreach ($display as $key => $value){
if ($key % 2 == 0){
$temperature[] = $value;
} else {
$location[] = $value;
}
}
更好的是,将您的变量范围更好地分开,这样就不会出现类似的名称冲突。将函数和类与其私有变量作用域一起使用,并且不要将所有内容放在全局范围内。
答案 1 :(得分:3)
似乎是一个可变范围的问题。
当您在loadmore.php
中加入guestbook.php
时,您隐含地将$location
声明为字符串:
$location=$row['location'];
循环的这一行:
$location[] = $value; // ODD - **HERE IS LINE 47**
不是在第一次迭代时隐式声明一个新的数组变量,而是试图将$ value附加到先前声明的字符串变量,因此错误。
尝试在loadmore.php或guestbook.php中为$ location指定一个不同的名称,或者使loadmore.php成为一个函数(因此它在自己的作用域中运行),然后在包含其代码后从你的guestbook.php脚本中调用它在上面。或者如果要将其重新用作数组,请使用$ location变量的显式声明(只需在循环之前添加$location = array();
)。
答案 2 :(得分:1)
我认为loadmore.php和/或ajaxmore.php正在将一个全局变量($location
)设置为字符串。当留言板页面尝试索引此变量时,您会收到错误。
解决方案:使用函数和局部变量。
答案 3 :(得分:0)
$location=$row['location'];
就是问题所在。因为PHP没有块级范围,所以您基本上预先设置此变量并尝试使用[]设置它的数组索引。因为它是一个字符串,它会破坏。
您应该始终初始化变量以避免这些类型的冲突:
即
$location = array();
答案 4 :(得分:0)
重命名其中一个脚本的$ location。某处有$ location = $ row ['location']。此外,在将变量用作数组时声明变量:
$array = array();
$array[] = 'item'; // when you add an item here, $array will always accept an array push.