1

特定の数のWeatherunderground.comステーションの温度と場所を示すPHPスクリプト(wunder_temp.phpと呼ばれる)を作成しました(Stackoverflowのヘルプにも感謝します)。

このスクリプトをフッターに含めましたが、1ページでうまく機能します。http://www.flapane.com/guestbook/guestbook.phpを開くと、温度がフッターに表示されず、error.logに次のように表示されます。[09-Sep-2012 09:46:45 UTC] PHP Fatalエラー:[]演算子は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は、私のWebサイトでwunder_temp.phpが機能しない唯一のページです。

上記のコードは、キャッシュファイルを読み取り、$temperature []配列に偶数行を入れ、$location[]配列に奇数行を入れます。これが私のキャッシュファイルからのサンプルです:

26.8
Stadio San Paolo di Napoli, Napoli
24.4
Pozzuoli

正直なところ、ゲストブックのページだけにエラーが表示される理由はわかりません。

「犯人」は、Twitterスタイルのajax関数を使用してゲストブックのコメント(およびguestbook.phpに含まれている)をロードする関数loadmore.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&amp;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&ugrave; vecchi / Load older entries</a>
</div>
</div>

ajax_more.js AJAX twitterスタイルの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&amp;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&ugrave; vecchi / Load older entries</a>
</div>

<?php
}
?>

どんな助けでも大歓迎です

4

5 に答える 5

5

$locationはすでにそのページの文字列です。これが、変数を使用する前に変数を適切に初期化する理由です。

$temperature = $location = array();

foreach ($display as $key => $value){
    if ($key % 2 == 0){  
         $temperature[] = $value;
    } else {
         $location[] = $value;
    }
}

さらに良いことに、そのような名前の衝突が発生しないように、変数スコープをより適切に分離します。プライベート変数スコープで関数とクラスを使用し、すべてをグローバルスコープに入れないでください。

于 2012-09-09T10:28:18.443 に答える
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();ループの前に追加するだけです)。

于 2012-09-09T10:27:57.937 に答える
1

loadmore.phpやajaxmore.phpがグローバル変数($location)を文字列に設定していると思います。ゲストブックページがこの変数のインデックスを作成しようとすると、エラーが発生します。

解決策:関数とローカル変数を使用します。

于 2012-09-09T10:27:45.283 に答える
0

$location=$row['location']; 問題です。PHPにはブロックレベルのスコープがないため、基本的にこの変数を事前設定し、[]を使用して配列インデックスを設定しようとしています。文字列なので壊れます。

これらの種類の競合を回避するために、常に変数を初期化する必要があります。 $location = array();

于 2012-09-09T10:28:51.230 に答える
0

スクリプトの1つの$locationの名前を変更します。$ location = $row['location']がどこかにあります。また、変数を配列として使用する場合は、次のように宣言します。

$array = array();
$array[] = 'item'; // when you add an item here, $array will always accept an array push.
于 2012-09-09T10:29:15.093 に答える