[改造]一行目のログがスルーされる

このQ&Aのポイント
  • あるBBSを改造して「検索部分」だけ使用したいのですが、改造したいphpは、仕様で一行目のログがスルーされるのです。
  • 一行目も検索対象にしたいのですが、どこが邪魔していますか?
  • 検索部分を使用したいのですが、一行目のログがスルーされてしまいます。一行目も検索対象にしたい場合、どの部分を改造すれば良いでしょうか?
回答を見る
  • ベストアンサー

[改造]一行目のログがスルーされる

お世話になります。 わからないので、丸投げで申し訳ないですが、ご返答お願いします。 あるBBS(http://php.s3.to/bbs/bbs8.php)を改造して「検索部分」だけ使用したいと思います(書き込みなんかは別のBBSを使用してます) なのですが、改造したいphpは、仕様で一行目のログがスルーされるのです。 それで、一行目も検索対象にしたいのですが、どこが邪魔していますか? /*-- 検索 --*/ function search() { if (trim($_GET['w']) != "") { // スペース区切りを配列に $word = htmlspecialchars($_GET['w']); $words = preg_split("/( | )+/", $word); // ログ決定 if ($_GET['logs'] == 0) { $lines = file(LOGFILE); array_shift($lines); } elseif (file_exists(PASTDIR.$_GET['logs'].".txt")) { $lines = file(PASTDIR.$_GET['logs'].".txt"); } else { return false; } $result = array(); foreach ($lines as $line) { //ログを走査 $find = FALSE; //フラグ foreach ($words as $w) { if ($w == "") continue; //空文字はパス if (stristr($line, $w)) { //マッチ $find = TRUE; if ($_GET['kyo']) $line = str_replace($w, "<b style='color:green;background-color:#ffff66'>$w</b>", $line); } elseif ($_GET['andor'] == "and") { //ANDの場合マッチしないなら次のログへ $find = FALSE; break; } } if($find) array_push($result, $line); //マッチしたログを配列に } $arg['total'] = count($result); if (get_magic_quotes_gpc()) $word = stripslashes($word); $arg['word'] = $word; if (count($result) > 0) { $page_def = ($_GET['pp']) ? (int)$_GET['pp'] : PASTDEF; $page = ($_GET['page']) ? (int)$_GET['page'] : 0; // 記事表示 for ($i = $page; $i < $page+$page_def; $i++) { $oya = $res = ""; if (!trim($result[$i])) break; list($num,$name,$pass,$date,$time1,$imgno,$host,$email,$mailflag,$url,$icon,$tail,$imgw,$imgh,$imgflag,$com) = explode(",", $result[$i]); list($color,$b_color) = explode(";", $col); if ($url != "") $url = "http://".$url; if ($icon != "") $icon = I_DIR.$icon; if ($type == 0) $oya = true; else $res = $type; // 親記事格納 $arg['out'][] = compact('num','name','pass','date','time1','imgno','host','email','mailflag','url','icon','tail','imgw','imgh','imgflag','com'); } $arg['page_def'] = $page_def; $arg['st'] = $page + 1; $arg['to'] = $i;

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

ソースをろくに読まず、テキトーに回答してます。 見当違いな あさってな回答かもしれません。ご了承ください。 ↓この部分。 // ログ決定 if ($_GET['logs'] == 0) { $lines = file(LOGFILE); array_shift($lines); } array_shift() って関数。 これ使うと、配列の先頭から、一個取り出して、取り出された分、配列が一個減ります。 これが 何か 影響しているんじゃないかな?と思ったりしました。

monica_panda
質問者

お礼

ありがとうございます! array_shift($lines); この一行消したら、上手くいきました(^^) 助かりましたー!!

関連するQ&A

  • PHPによる行データのアップダウン

    PHPによる行データのアップダウン フォームからデータ行をGETした内容をアップダウンさせたいのですが、どうにも入れ替えができません。 プログラムコードのアドバイスをください。 *ログファイルの中(data.dat) ゴリラ チューリップ ばなな ストロベリー ペンギン <?php $data = "data.dat"; function row_up() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]-1]; //前の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } elseif($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } fputs($fp,$lines[$i]); } fclose($fp); } function row_down() { $lines = @file($data); $lines[$ont] = $lines[$_GET[row]]; //自分 $lines[$_GET[row]] = $lines[$_GET[row]+1]; //次の人 $fp = fopen($data,"w"); rewind($fp); for($i=0;$i<count($lines);$i++) { if($lines[$i] == $lines[$ont]){ fputs($fp,$lines[$ont]); } elseif($lines[$i] == $lines[$_GET[row]]){ fputs($fp,$lines[$_GET[row]]); } fputs($fp,$lines[$i]); } fclose($fp); } switch($_GET[mode]) { case up: row_up(); break; case down: row_down(); break; default: break; } ?>

    • ベストアンサー
    • PHP
  • 親記事を削除するとレスも削除

    いつも参考にさせてもらっています。 タイトルどおりなのですが、 親記事を削除すると親Noを含むレスをすべて削除できるように $lines = file('res.log'); for ($i = 0; $i < count($lines) + 1; $i++) { $items = explode("\t", $lines[$i]); if ($items[1] == $_GET['oya_del']) { $dno = $i; $dnum2++; if ($dnum) array_splice($lines $dno, $dnum2); $fp = fopen('res.txt', 'w'); foreach($lines as $line) fputs($fp, $line); fclose($fp); } } と、記述しています。 しかしレスが2つ以上あると、1つ残ってしまいます。 どのようにしたらよいのか教えていただけないでしょうか。 お願いいたします。

    • ベストアンサー
    • PHP
  • ページ処理

    毎度お世話になってます 同じような質問を数回させていただいたのですが 自分の技量不足のため上手く行きませんでした なので再度質問の形を変えてお聞きさせていただきます 今以下のようなコーティングでデータベースを 作成しています その際のページ処理が上手くいきません どのように上手くいかないかというと マッチしたサイト全てが検索結果に表示されてしまいます このコーティングをベースに構成したいのですが 何とかなりますでしょうか? $view=2; sub subtwo {open(fp,"log.txt"); @lines = <op>; close(op); $bigin = $in{"page"} * $view; $end = $bigin + $view; if($i !~ /\d+/){$i = 0}; if($open eq "") {foreach $line (@li) {($abc,$def,$ghi,$jkl,) = split(/,/,$line); $chk = 1; foreach $k (@key) {if(index($line,$k,)<0) {$c = 0; last}} if($c>0) {print "<A HREF=\"$abc\">$def</A><br>\n";<br>\n";}}}} ############################################ sub subthree {$bigin = $in{"page"} * $view; $end = $bigin + $view; if($end<$マッチした総数の変数) {$nextpage=$in{"page"}+1; print qq(<FORM method="get" action="kensaku.cgi"> <INPUT TYPE=HIDDEN NAME="page" VALUE="$nextpage"> <INPUT TYPE="SUBMIT" VALUE="next"> </FORM>\n);} if($bigin>0) {$backpage=$in{"page"}-1; print qq(FORM method="get" action="kensaku.cgi"> <INPUT TYPE="HIDDEN" NAME="page" VALUE="$backpage"> <INPUT TYPE="SUBMIT" VALUE="back">\n);} if($page<0) {$page=0} }

  • 検索時エラー

    はじめまして PHPを用いてsystem.csv内を検索するんですが、ある文字を入力すると Warning: eregi() [function.eregi]: REG_BADRPT と表示されてしまいます。 例えば: 藤、++ などです。 なぜでしょうか? またどのように修正してあげたらいいのでしょうか? よろしくお願いいたします。 <?php if($_GET["key"]==""){ print"キーワードを入力してくださいね"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"EUC-JP","auto"); $Result=array(); $Data=file("system.csv"); for($i=0;$i<sizeof($Data);$i++){ $lines=strip_tags($Data[$i]); if(eregi($KeyWord,$lines,$text_b)){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><?=$line[2]?><a href="item.php?id=<?=$line[0]?>"><?=$line[1]?></a></li> <?php } } } ?>

    • 締切済み
    • PHP
  • logファイルをひらいての処理の仕方を教えてください。

    データベース検索のperlをカスタマイズ中です。 ユーザが入力したものを、検索条件のひとつにしたいのですが、表示されません。 インプットしたものはlogファイルに書き込まれるので、それを開いて反映させればいいのだろうということまでは、なんとかわかるのですが、どのように表記していいのか・・・今はない知恵を絞ってこのように表記しているのですが。 if (!open(FD,"$logfile")) { &error(0); } @lines = <FD>; $cnt = @lines; close(FD); print "<select name=P2 >\n"; print "<option value=\"0\" selected>指定なし\n"; $i =0; foreach $line (@lines) { ($no,$sub,$com1,$com2,$com3,$p1,$p2,$p3,$p4) = split(/\,/,$line); chop; if ($p2 ne '') { $i++; $p2s{($p2)[0]}++; $n++; } } foreach (keys %p2s) { print "<option value=\"$_\">$_\n"; } print "</select></td>\n";

  • 書き込み時に勝手にクリアさせない記述

    ログファイルをHTMLにして、 HTMLの中の<!--START-->から<!--END-->に書き込み 処理していくというようなでチャットを作っています。 その中で、書き込み処理の内容を下記のように書いて local($job) = @_; open(IN,"$logfile") || &error("Open Error : $logfile"); @lines = <IN>; close(IN); $i=0; $match=0; @temp=(); foreach (@lines) { chop($_); if ($match) { $i++; push(@temp,"$_\n"); } elsif ($_ eq '<!--START-->') { $match=1; } if ($i > $logs-2 || $_ eq '<!--END-->') { last; } } 記述はこれで間違いないと思ってるのですが 発言フォームでログ数$logsを 選択メニューなどフォームで調整したりすると 書き込むたびに前のログが消えてしまいます。 なぜかわかりません。 どなたか、解決策をご教授お願いします。

    • ベストアンサー
    • Perl
  • phpでのログファイル要素の取り出しについて

    お世話になります。 phpで以下の事をする場合についてなのですが、 log.dat(ログファイル) (log.datの内容) 643,1232,abceee,やま, 543,896,ddc.jp,かわ, 343,2435,rrsc,国, 214,1130,edbv.com,鳥, ※ログの順番はソートによって変わるようになっています 上記ログファイルの指定した部分だけを取り出して表示させたい場合、 例えば以下のようにforeachなどのループで毎回、 照合させて取り出すしか方法はないでしょうか。 hoge.php ============================ $id = $_GET['id']; $lines = file("log.dat"); foreach ($lines as $line) { $data=split("," ,$line); if'($data[2] == $id) { print "$data[1]"; break;} } ===================================== これを、たとえばですが、 以下のような記述で任意の箇所に何箇所か表示させる事ができるようにしたいのですが <?require("./hoge.php?id=rrsc");?> そのたびにlog.datをループさせてifで照合させて・・・ とやりますとログファイルもそこそこ大きくなってきますと 何回もループさせる事からサーバー負荷の点が気になってしまいまして このような場合、他に効率の良い方法などございましたら ご教授いただけないでしょうか。 (データベース等の使用は出来ず、あくまでログファイルを使って行わなければなりません) お手数をおかけしますがもしご存知の方がいらっしゃいましたら ご教授いただけますと幸いです。 (PHP Version 4.3.9 で稼動することが前提となります)

    • ベストアンサー
    • PHP
  • アクセスログの見方について

    いつもお世話になっております。 私が借りているレンタルスペースはアクセスログを閲覧することが可能なのですが、何件かよく分からないアクセスがあります。 例えば、こういったものになります。 (実際のものとは若干、変更してあります) 999.999.999.999 - - [01/Jan/2003:12:12:12 +0900] "GET /web/css.css HTTP/1.1" 404 227 "http://homepage-rei.com/bbs.cgi?page=5" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)" homepage-rei.com/bbs.cgiが参照元になっており、css.cssというファイルのリクエストがあった、ということは分かりますが、このファイルが自分のサイトにない場合でもリクエストが出ているようです。(だから404が返っているようです) こういった事は頻繁にあるのでしょうか。 詳しい方、回答をいただけると幸いです。

  • CSVファイルの10件表示について

    PHP初心者です。 CSVデータを活用してサイトを作ろうとしているのですが、 フリーワードで検索すると下記のようなエラーが出てしまいます。 Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 77287300 bytes) in レンタルサーバー(ロリポップ)に memory_limitについて問い合わせたところ、 消費メモリを削減して対処してほしいと言われました。 10件だけ表示するようにすれば解決するかと思い、 自分なりにあれこれいじってみたのですが、 うまくいきませんでした。 10件だけ表示する方法やメモリ消費を抑える方法を お分かりになる方がいらっしゃいましたら、 ぜひご教授お願いいたします。 -index.php-トップページ <form action="search.php" method="get"><input type="text" name="key" size="90"> <input type="submit" name="submit" value="検索"></form> -seach.php-検索結果表示ページ <?php if($_GET["key"]==""){ print"キーワードを入力してください"; }else{ $KeyWord=$_GET["key"]; $KeyWord=htmlspecialchars($KeyWord); $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS"); $KeyWord=mb_convert_kana($KeyWord,s); $ArrKeyword=explode(" ",$KeyWord); $Result=array(); $Data=file("item.csv"); for($i=0;$i<sizeof($Result);$i++){ $lines=strip_tags($Data[$i]); $Match=true; for($n=0;$n<sizeof($ArrKeyword);$n++){ if(!eregi($ArrKeyword[$n],$lines)){ $Match=false; break; } } if($Match==true){ array_push($Result,$Data[$i]); } } ?> <?php $n=sizeof($Result); if($n==0){ print"見つかりませんでした"; }else{ print"{$n}件見つかりました"; ?> <ul> <?php for($i=0;$i<sizeof($Result);$i++){ $line=explode(",",$Result[$i]); ?> <li><a href="item.php?id=<?=$line[0]?>"><?=$line[3]?></a></li> <?php } } } ?> 下記の行がエラーのようです。 for($i=0;$i<sizeof($Result);$i++){

    • ベストアンサー
    • PHP
  • PHP pagerについて

    現在mysqlに登録されているデータを表示させてなおかつ表示制限をつくっています。 pagerにて表示を分割しています。 http://www.phppro.jp/qa/3073のソースを参考に作成したみたのですが、 下記が自分なりに編集したコードです。 define(LMAX, 5); if (!isset($_GET['page'])) { $page = 1; } else { $page = intval($_GET['page']); if ($page == 0 ) { die('page no error'); } } $skip = ($page - 1) * LMAX; $query = sprintf('SELECT * FROM `test` LIMIT '.$skip.','.(LMAX + 1)); $result = mysql_query($query, $link) or die(mysql_error()); $line = 0; while ($row = mysql_fetch_array($result)) { if ($line >= LMAX) { break; } if ($line == 0) { // ヘッダ出力 $r_list .= "<tr>\n"; $r_list .= "<th>テスト1</th>\n"; $r_list .= "<th>テスト2</th>\n"; $r_list .= "<th>テスト3</th>\n"; $r_list .= "<th>テスト4</th>\n"; $r_list .= "</tr>\n"; } $line++; $r_list .= "<tr>\n"; $r_list .= "<td>" .$row["test1"]. "</td>\n"; $r_list .= "<td>" .$row["test2"]. "</td>\n"; $r_list .= "<td>" .$row["test3"]."</td>\n"; $r_list .= "<td>" .$row["test4"]."</td>\n"; $r_list .= "</tr>\n"; } if ($page > 1) { $prev = '<a href="?page=' . ($page - 1) . '">Prev</a>'; } if ($line > LMAX) { $next = '<a href="?page=' . ($page + 1) . '">Next</a>'; } としています。 いくつかご質問がお分かりの方が、いらっしゃいましたら教えていただけないでしょうか? ・define(LMAX, 5);のところで5にしているにもかかわらず5件表示がされない。 ・このコードだとPrevやNextがでない。 ・ 2個目の$r_list .= "</tr>\n";の下に$line++;を書くとPrevやNextが表示される。 以上になります。 宜しくお願いいたします。

    • 締切済み
    • PHP