phpのプログラムなんですが・・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
zuttomo

phpのプログラムなんですが・・・・

#1

投稿記事 by zuttomo » 9年前

以下のコードを実行すると
Warning: Creating default object from empty value in C:\xampp\htdocs\nikonikoXML.php on line 242
というエラーが出て原因がわからず困っています。
当該箇所は$x[$i]->URL=$sp[$i]; の部分で、値が入らず空になってると思われます。
宣言の仕方がわるいのかわかりません
知っておられるかたお力を貸して頂けると幸いです
よろしくお願いします。

コード:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ライブドアの天気予報を表示する</title>
</head>
 <body>
<?php

$filename = 'test.txt';
$filename = 'sst.txt';
$filename = 'gyousuu.txt';
$filename2 = 'RSSlog.txt';
$i = 0;//総検索済み回数
$v = 0;// function Filewriteでつかう存在する動画の通し番号(0,1,2,3,4,5・・・・)
$j = 0;// function Filewrite存在する動画の通し番号(0,1,2,3,4,5・・・・)
$size= 0;
//ファイルに記録する構造体(配列)グロバル変数
$ono = array();
$oIsno = array();//sm○○○から実際に存在する動画ナンバー$jを保存しておく
$serchtimes = array();//検索済み回数$iを保存しておく



function filewrite2($filename,$somecontent){

// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}


function fileread($filename2){
// ファイルの中身を読んで文字列に格納する

$URLandle = fopen($filename2, "r");
$contents = fread($URLandle, filesize($filename2));
fclose($URLandle);
return $contents;
}






function numberfilewrite($y){
global $v;
global $i;
global $tousi;
$filename = 'gyousuu.txt';
$somecontent = $v."<>".$tousi."<>".$i."\r\n";//もうすでにループを終えたあとにこの関数を呼び出してるので$yには最後の存在した動画ナンバー$iには検索した回数が入ってる

// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}



function write($filename){

global $x,$v,$size;// 通し番号を付けとく
global $tousi;
$v+=1;

for($i=0 ; $i<$size; $i++) {

$somecontent .= $x[$i]->num."<>".$x[$i]->sm."<>".$x[$i]->imgurl."<>".$x[$i]->title."<>".$x[$i]->setsumei."<>".$x[$i]->view."<>".$x[$i]->mylist."<>".$x[$i]->coment."<>".$x[$i]->URL."\r\n";
}
$tousi= $n;
// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。上書きモード
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}



function lwws($sm){//ログにあるurlから取得したsm○○○○でxmlを再取得
global $x,$size;//グローバル変数の構造体xの値を関数内で変更するにはこう宣言する

for($i=0 ; $i<$size; $i++) {
$rssurl = "http://ext.nicovideo.jp/api/getthumbinfo/".$sm[$i];
$xml = simplexml_load_file($rssurl);

$x[$i]->num = $i;
$x[$i]->sm = $sm[$i];
$x[$i]->imgurl = $xml->thumb->thumbnail_url;
$x[$i]->title = $xml->thumb->title;
$x[$i]->setsumei = $xml->thumb->description;
$x[$i]->mylist =(int) $xml->thumb->mylist_counter;
$x[$i]->view =(int) $xml->thumb->view_counter;//なぜかstring型になってるんで後でソートする為int型にしておく
$x[$i]->coment =(int) $xml->thumb->comment_num;
$x[$i]->URL = $xml->thumb->watch_url;
}
}


function hyouzi(){


global $x,$size;//グローバル変数の構造体xの値を関数内で変更するにはこう宣言する
      for($i=0 ; $i<$size; $i++){
      $outdata .= "<table style='width: 300px; height: 200px; border:1px solid #ff00ff;'>";
      $outdata .= "<tr><td align='center'><a href=".$x[$i]->URL."><img src=".$x[$i]->imgurl."></a></td></tr><br>";
      $outdata .= "<tr><td align='center'><a href=".$x[$i]->URL.">".$x[$i]->title."</a>";
      $outdata .= "</td></tr>\n";

      $outdata .= "<tr><td>".$x[$i]->setsumei."</td></tr>";
      $outdata .= "<tr><td>タグ:".$tag."</td></tr>";
      $outdata .= "<tr><td>再生数:".$x[$i]->view."</td></tr><br>";
      $outdata .= "<tr><td>コメント数:".$x[$i]->coment."</td></tr>";
      $outdata .= "<tr><td>マイリスト数:".$x[$i]->mylist."</td></tr><br>";
      $outdata .= "<tr><td>URL:".$x[$i]->URL."</td></tr><br>";
      $outdata .= "</table>";

}

echo $outdata;

}

//usort($x, "cmp");で構造体xを昇順にソートするためだけの関数。詳しくはusortで検索
//$aは構造体xの要素 $bはその次の要素
function cmp($a, $b)
{
    if ($a->mylist == $b->mylist) {
        return 0;
    }
    return ($a->mylist > $b->mylist) ? -1 : 1;//構造体のマイリスト数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}

function cmp1($a, $b)
{
    if ($a->coment == $b->coment) {
        return 0;
    }
    return ($a->coment > $b->coment) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}

function cmp2($a, $b)
{
    if ($a->view == $b->view) {
        return 0;
    }
    return ($a->view > $b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}


function cmp3($a, $b)
{
    if ($a->mylist/$a->view == $b->mylist/$b->view) {
        return 0;
    }
    return ($a->mylist/$a->view > $b->mylist/$b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}


function cmp4($a, $b)
{
    if ($a->coment/$a->view == $b->coment/$b->view) {
        return 0;
    }
    return ($a->coment/$a->view > $b->coment/$b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}
//新着RSSをRSSlog.txtから開いて構造体に入れる
  function add() {
global $size;//要素数はグローバル変数
$filename2 = 'RSSlog.txt';
$URLandle = fopen($filename2, "r");
$contents = fread($URLandle, filesize($filename2));
fclose($URLandle);
$sp = split("\r\n", $contents);//これでtxtの内容一行ごとに配列$sp[0]、$sp[1]、$sp[2]・・・・・に入れた
$size = sizeof($sp);
for($i=0 ; $i<sizeof($sp); $i++) {
$x[$i]->URL=$sp[$i]; 
}
for($i=0 ; $i<sizeof($sp); $i++) {//正規表現使うの面倒なんでexplode使って区切る。URLを/で区切って配列smに代入
list($user, $pass, $uid, $gid, $sm[$i]) = explode("/", $x[$i]->URL);
}
return $sm;//$smはログファイルにあるURLのケツのsm97899とかが入ってる
}

//クラスで構造体を作る。public変数は個人の名前・年齢・体重みたいな
class A
{
  public $num;
  public $sm;
  public $imgurl;
  public $tltle;
  public $setsumei;
  public $view;
  public $mylist;
  public $coment;
  public $URL;
  public $tag;

}

$x[131] = new A;//構造体の宣言。




$sm = add();
lwws($sm);

usort($x, "cmp");//構造体xをマイリスト数が多い順にソートソート。cmpは関数名
write('tmp01.txt');//その順にtmp01に保存
usort($x, "cmp1");//構造体xをコメント数が多い順にソート。ソートするパターンは関数を使って数種類用意しとくと便利
write('tmp02.txt');
usort($x, "cmp2");//構造体xを再生数が多い順にソート
write('tmp03.txt');
usort($x, "cmp3");//構造体xをマイリスト比が多い順
write('tmp04.txt');
usort($x, "cmp4");//構造体xをコメント比が多い順
hyouzi();//ソート後のコンテンツを表示
write('tmp05.txt');
for($i=0 ; $i<30; $i++) {
echo $x[$i]->tltle." 再生数:".$x[$i]->view." マイリスト数:".$x[$i]->mylist." コメント数:".$x[$i]->coment." マイリスト比:".$x[$i]->mylist/$x[$i]->view." コメント比:".$x[$i]->coment/$x[$i]->view."<br>"; 
}
 ?>
</body>
</html>

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: phpのプログラムなんですが・・・・

#2

投稿記事 by YuO » 9年前

警告中に書いてある,242行目は提示コードでは}だけであるため,別物である気もしますが……。
警告が提示コードの236行目で起きているとして,関数addの中で$xがそれより前に宣言されていません。
引数で渡す等の処理をする必要があります。

コード自体に気になる点は (インデントとかglobalキーワードの利用とかCLIで十分とか) 色々あるのですが,問題点だけなら上記の問題を対処するだけで,警告に対処可能なはずです。

zuttomo

Re: phpのプログラムなんですが・・・・

#3

投稿記事 by zuttomo » 9年前

>YUOさん
返信ありがとうございます
宣言の位置を関数の前に持ってきたり
Globalをつけたりしても同様のエラーが出ました・・・
グローバル変数ローカル変数の問題だと思うのですがわかりません。

コード:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ライブドアの天気予報を表示する</title>
</head>
 <body>
<?php

$filename = 'test.txt';
$filename = 'sst.txt';
$filename = 'gyousuu.txt';
$filename2 = 'RSSlog.txt';
$i = 0;//総検索済み回数
$v = 0;// function Filewriteでつかう存在する動画の通し番号(0,1,2,3,4,5・・・・)
$j = 0;// function Filewrite存在する動画の通し番号(0,1,2,3,4,5・・・・)
$size= 0;
//ファイルに記録する構造体(配列)グロバル変数
$ono = array();
$oIsno = array();//sm○○○から実際に存在する動画ナンバー$jを保存しておく
$serchtimes = array();//検索済み回数$iを保存しておく
//クラスで構造体を作る。public変数は個人の名前・年齢・体重みたいなもん
class A
{
  public $num;
  public $sm;
  public $imgurl;
  public $tltle;
  public $setsumei;
  public $view;
  public $mylist;
  public $coment;
  public $URL;
  public $tag;

}

$x[131] = new A;//ここが構造体の宣言。




function filewrite2($filename,$somecontent){

// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}


function fileread($filename2){
// ファイルの中身を読んで文字列に格納する

$URLandle = fopen($filename2, "r");
$contents = fread($URLandle, filesize($filename2));
fclose($URLandle);
return $contents;
}






function numberfilewrite($y){
global $v;
global $i;
global $tousi;
$filename = 'gyousuu.txt';
$somecontent = $v."<>".$tousi."<>".$i."\r\n";//もうすでにループを終えたあとにこの関数を呼び出してるので$yには最後の存在した動画ナンバー$iには検索した回数が入ってる

// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}



function write($filename){

global $x,$v,$size;// 通し番号を付けとく
global $tousi;
$v+=1;

for($i=0 ; $i<$size; $i++) {

$somecontent .= $x[$i]->num."<>".$x[$i]->sm."<>".$x[$i]->imgurl."<>".$x[$i]->title."<>".$x[$i]->setsumei."<>".$x[$i]->view."<>".$x[$i]->mylist."<>".$x[$i]->coment."<>".$x[$i]->URL."\r\n";
}
$tousi= $n;
// ファイルが存在しかつ書き込み可能かどうか確認します
if (is_writable($filename)) {

    // この例では$filenameを追加モードでオープンします。
    // ファイルポインタはファイルの終端になりますので
    // そこがfwrite()で$somecontentが追加される位置になります。上書きモード
    if (!$URLandle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // オープンしたファイルに$somecontentを書き込みます
    if (fwrite($URLandle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    fclose($URLandle);

} else {
    echo "The file $filename is not writable";
}
}



function lwws($sm){//ログにあるurlから取得したsm○○○○でxmlを再取得
global $x,$size;//グローバル変数の構造体xの値を関数内で変更するにはこう宣言する

for($i=0 ; $i<$size; $i++) {
$rssurl = "http://ext.nicovideo.jp/api/getthumbinfo/".$sm[$i];
$xml = simplexml_load_file($rssurl);

$x[$i]->num = $i;
$x[$i]->sm = $sm[$i];
$x[$i]->imgurl = $xml->thumb->thumbnail_url;
$x[$i]->title = $xml->thumb->title;
$x[$i]->setsumei = $xml->thumb->description;
$x[$i]->mylist =(int) $xml->thumb->mylist_counter;
$x[$i]->view =(int) $xml->thumb->view_counter;//なぜかstring型になってるんで後でソートする為int型にしておく
$x[$i]->coment =(int) $xml->thumb->comment_num;
$x[$i]->URL = $xml->thumb->watch_url;
}
}


function hyouzi(){


global $x,$size;//グローバル変数の構造体xの値を関数内で変更するにはこう宣言する
      for($i=0 ; $i<$size; $i++){
      $outdata .= "<table style='width: 300px; height: 200px; border:1px solid #ff00ff;'>";
      $outdata .= "<tr><td align='center'><a href=".$x[$i]->URL."><img src=".$x[$i]->imgurl."></a></td></tr><br>";
      $outdata .= "<tr><td align='center'><a href=".$x[$i]->URL.">".$x[$i]->title."</a>";
      $outdata .= "</td></tr>\n";

      $outdata .= "<tr><td>".$x[$i]->setsumei."</td></tr>";
      $outdata .= "<tr><td>タグ:".$tag."</td></tr>";
      $outdata .= "<tr><td>再生数:".$x[$i]->view."</td></tr><br>";
      $outdata .= "<tr><td>コメント数:".$x[$i]->coment."</td></tr>";
      $outdata .= "<tr><td>マイリスト数:".$x[$i]->mylist."</td></tr><br>";
      $outdata .= "<tr><td>URL:".$x[$i]->URL."</td></tr><br>";
      $outdata .= "</table>";

}

echo $outdata;

}

//usort($x, "cmp");で構造体xを昇順にソートするためだけの関数。詳しくはusortで検索
//$aは構造体xの要素 $bはその次の要素
function cmp($a, $b)
{
    if ($a->mylist == $b->mylist) {
        return 0;
    }
    return ($a->mylist > $b->mylist) ? -1 : 1;//構造体のマイリスト数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}

function cmp1($a, $b)
{
    if ($a->coment == $b->coment) {
        return 0;
    }
    return ($a->coment > $b->coment) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}

function cmp2($a, $b)
{
    if ($a->view == $b->view) {
        return 0;
    }
    return ($a->view > $b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}


function cmp3($a, $b)
{
    if ($a->mylist/$a->view == $b->mylist/$b->view) {
        return 0;
    }
    return ($a->mylist/$a->view > $b->mylist/$b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}


function cmp4($a, $b)
{
    if ($a->coment/$a->view == $b->coment/$b->view) {
        return 0;
    }
    return ($a->coment/$a->view > $b->coment/$b->view) ? -1 : 1;//構造体のコメント数が多い順。昇順にソートするなら不等号逆にする。文字を扱うのはstrcmp使う
}
//新着RSSをRSSlog.txtから開いて構造体に入れる
  function add() {
 
global $x,$size;//要素数はグローバル変数
$filename2 = 'RSSlog.txt';
$URLandle = fopen($filename2, "r");
$contents = fread($URLandle, filesize($filename2));
fclose($URLandle);
$sp = split("\r\n", $contents);//これでtxtの内容一行ごとに配列$sp[0]、$sp[1]、$sp[2]・・・・・に入れた
$size = sizeof($sp);
for($i=0 ; $i<sizeof($sp); $i++) {
$x[$i]->URL=$sp[$i]; 
}
for($i=0 ; $i<sizeof($sp); $i++) {//正規表現使うの面倒なんでexplode使って区切る。URLを/で区切って配列smに代入
list($user, $pass, $uid, $gid, $sm[$i]) = explode("/", $x[$i]->URL);
}
return $sm;//$smはログファイルにあるURLのケツのsm97899とかが入ってる
}




$sm = add();
lwws($sm);

usort($x, "cmp");//構造体xをマイリスト数が多い順にソートソート。cmpは関数名
write('tmp01.txt');//その順にtmp01に保存
usort($x, "cmp1");//構造体xをコメント数が多い順にソート。ソートするパターンは関数を使って数種類用意しとくと便利
write('tmp02.txt');
usort($x, "cmp2");//構造体xを再生数が多い順にソート
write('tmp03.txt');
usort($x, "cmp3");//構造体xをマイリスト比が多い順
write('tmp04.txt');
usort($x, "cmp4");//構造体xをコメント比が多い順
hyouzi();//ソート後のコンテンツを表示
write('tmp05.txt');
for($i=0 ; $i<30; $i++) {
echo $x[$i]->tltle." 再生数:".$x[$i]->view." マイリスト数:".$x[$i]->mylist." コメント数:".$x[$i]->coment." マイリスト比:".$x[$i]->mylist/$x[$i]->view." コメント比:".$x[$i]->coment/$x[$i]->view."<br>"; 
}
 ?>
</body>
</html> 

閉鎖

“C言語何でも質問掲示板” へ戻る