質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

2回答

768閲覧

php.iniでエラーメッセージが表示されず、エラー原因がわからない

homepage-site

総合スコア50

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2021/09/08 05:03

前提・実現したいこと

csvデータを下から数えて10行目から最後までを表示させたい

ヘディングのテキスト

<?php if (have_posts()): ?> <?php if(isset($_GET['s']) && empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach (array_slice($rows, -10) as $row) vprintf("%s %s\n", $row); var_dump($row); ?>

発生している問題・エラーメッセージ

なし

補足

var_dump($row);で確認したところ
2021-09-07-4-27-36 126.156.166.227 2021-09-07-4-27-52 126.156.166.227 2021-09-07-4-31-03 126.156.166.227 2021-09-07-4-50-36 126.156.166.227 2021-09-07-4-52-03 126.156.166.227 2021-09-07-4-52-15 126.156.166.227 2021-09-07-4-52-26 126.156.166.227 2021-09-07-5-01-27 126.156.166.227 2021-09-07-5-14-25 126.156.166.227 2021-09-08-4-48-06 126.133.202.39 array(3) { [0]=> string(18) "2021-09-08-4-48-06" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " }
と出てます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/09/08 06:52

使用しているPHPのバージョンは何ですか?
homepage-site

2021/09/08 06:57

wordpressでコードを使用しているのですがバージョンは5.8です
guest

回答2

0

自己解決

<?php if (have_posts()): ?> <?php if(!isset($_GET['s']) || empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach(array_slice($rows, -10) as $row) vprintf("%s %s\n", array($row[0], $row[2])); ?>

投稿2021/09/08 11:41

homepage-site

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何もエラーは起きてませんが、上の書き方だとやりたいことができません。その理由として、foreachは非破壊的メソッド(元の変数の値が変化しない上に、asでループさせた変数もただの参照用)なので、処理中に別の変数に移し替える必要があります。

php

1while ($row = fgetcsv($fp)) array_push($rows, $row); //現状ここ(A)の$rowが出力される 2flock($fp,LOCK_UN); 3fclose($fp); 4foreach (array_slice($rows, -10) as $row) vprintf("%s %s\n", $row); //foreachの中なので、変更されない 5var_dump($row); // Aの$rowが出力される 6}

このように別の入れ物用の変数を使えば大丈夫かと。

php

1while ($row = fgetcsv($fp)) array_push($rows, $row); //現状ここ(A)の$rowが出力される 2flock($fp,LOCK_UN); 3fclose($fp); 4$row2 = []; //新たなオブジェクト用の変数B 5$rows = array_slice($rows, -10); 6foreach( $rows as $row){ 7 $row2[] = $row; 8} 9var_dump($row2); // Bの$row2が出力される 10}

投稿2021/09/08 05:17

編集2021/09/08 05:21
FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

homepage-site

2021/09/08 05:36

教えていただきありがとうございます。 コードを試してみたところ文字以外のIPと日時も表示されなくなったので、原因を調べてみます。 var_dump($row);で確認したところ array(10) { [0]=> array(3) { [0]=> string(18) "2021-09-07-4-31-03" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [1]=> array(3) { [0]=> string(18) "2021-09-07-4-50-36" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [2]=> array(3) { [0]=> string(18) "2021-09-07-4-52-03" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [3]=> array(3) { [0]=> string(18) "2021-09-07-4-52-15" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [4]=> array(3) { [0]=> string(18) "2021-09-07-4-52-26" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [5]=> array(3) { [0]=> string(18) "2021-09-07-5-01-27" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [6]=> array(3) { [0]=> string(18) "2021-09-07-5-14-25" [1]=> string(15) "126.156.166.227" [2]=> string(10) "ううう " } [7]=> array(3) { [0]=> string(18) "2021-09-08-4-48-06" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } [8]=> array(3) { [0]=> string(18) "2021-09-08-5-31-30" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } [9]=> array(3) { [0]=> string(18) "2021-09-08-5-32-43" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } } と出てきましたが エラーは表示されません。
FKM

2021/09/08 06:30 編集

エラーは表示されていないですが、取得したい部分の抽出処理が間違っているだけです。取得したいのは CSVの行の下10行でしょうか。それともCSVの1行あたりの10個分のデータでしょうか。
homepage-site

2021/09/08 06:32

すみません。質問の内容がわかりずらいかもしれませんが、取得したものを表示したいのですが。 IPと日時しかのみ表示されて内容が表示されません。 解決策を今探しているのですが…
homepage-site

2021/09/08 06:40

2021-09-03-13-28-52,126.255.28.185,"ううう " 2021-09-03-13-29-46,126.255.28.185,"ううう " 2021-09-03-13-29-49,126.255.28.185,"ううう " 2021-09-06-14-43-33,126.204.198.239,"ううううううううううううう " 2021-09-06-14-45-37,126.204.198.239,"ううううううううううううう " 2021-09-07-3-09-52,126.156.166.227,"ううううううううううううう " 2021-09-07-3-10-34,126.156.166.227,"ううううううううううううう " 2021-09-07-3-15-56,126.156.166.227,"ううううううううううううう " 2021-09-07-3-17-27,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-07,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-29,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-04,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-19,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-33,126.156.166.227,"ううう " 2021-09-07-3-26-02,126.156.166.227,"ううう " 2021-09-07-3-26-40,126.156.166.227,"ううう " 2021-09-07-3-27-08,126.156.166.227,"ううう " 2021-09-07-3-27-27,126.156.166.227,"ううう " csvにはこのように表示されていて、下の10件最新のものを表示したいのですが、現状はIPと日時のみ表示されます。
FKM

2021/09/08 06:55 編集

そもそものCSVがちゃんとデータを読み込んでいない可能性が高そうです。fgetcsvはバグの温床で、ロケール設定あたりで検索するといいでしょう。
homepage-site

2021/09/08 07:18

調べてみます。 アドバイスありがとうございます。
homepage-site

2021/09/08 07:22

バージョンを確認したところPHP 7.4でした。
homepage-site

2021/09/08 08:48

ファイルに 2021-09-03-13-28-52,126.255.28.185,"0 " 2021-09-03-13-28-52,126.255.28.185,"ううう " 2021-09-03-13-29-46,126.255.28.185,"ううう " 2021-09-03-13-29-49,126.255.28.185,"ううう " 2021-09-06-14-43-33,126.204.198.239,"ううううううううううううう " 2021-09-06-14-45-37,126.204.198.239,"ううううううううううううう " 2021-09-07-3-09-52,126.156.166.227,"ううううううううううううう " 2021-09-07-3-10-34,126.156.166.227,"ううううううううううううう " "ううう " と記述してみたところ2021-09-03-13-28-52 126.255.28.185 2021-09-03-13-28-52 126.255.28.185 2021-09-03-13-29-46 126.255.28.185 2021-09-03-13-29-49 126.255.28.185 2021-09-06-14-43-33 126.204.198.239 2021-09-06-14-45-37 126.204.198.239 2021-09-07-3-09-52 126.156.166.227 2021-09-07-3-10-34 126.156.166.227 ううう 2021-09-08-8-39-56 126.133.201.56 2021-09-08-8-40-31 126.133.201.56 と表示されたので日本語は取得できているようですがfgetcsvのバグですかね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問