PHP検索システム with CSV file

このQ&Aのポイント
  • PHPとCSVファイルを使用して簡易データベースを作成し、検索機能について考えています。
  • CSVファイルからデータを読み込み、検索ワードにヒットするデータを探す方法を知りたいです。
  • DBを使用する方法も考えましたが、規模が小さくPHPだけで処理できるので、CSVファイルでの検索を実現したいです。
回答を見る
  • ベストアンサー

PHP 検索 システム with CSV file 

いつもお世話になっています。 早速ですが、 現在、データベース(DB)を使用しないで、PHPとCSVファイルで簡易データベースを作成しています。 (DBは、それだけでも使い方を覚える必要があり、簡易的に作るにはCSVが良いと考えました。) 一通り、CSVファイルの読み込み、保存をするプログラムを完成させました。 (参考 http://ponk.jp/php_file/index.php?page=5) が、ここで検索機能をつけたいと思い、いろいろ調べていました。 しかし、DBを用いる方法は見つかりますが、なかなかCSVファイルを用いた検索方法がみつかりません。 現在想定しているのは、CSVファイルからデータ(table)を読み込み、その中から検索ワードにヒットするデータ(Column)を見つけるといった感じです。 簡易的には、 <?php $list = array('a','b','c','d','e','f'); $search = "d"; foreach ($list as $value){ if ($search == $value) {print "発見!";} } ?> という感じで作れましたが、今想定しているのは、 <?php $list = array('abcd','1234','xyz','日本'); $search = "y"; foreach ($list as $value){ : : (検索方法) : print "xyz を 発見!"; } ?> という感じです。 なにやら、DBを用いる場合では直接検索できる方法があるみたいですが、DBを用いると今後プログラム引渡しを行う際に、PHP以外にもやることが増えてしまうため、また、規模も小さいため、CSVファイルで済ませることができないかと考えています。 ご教授よろしくお願いします。

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

しょせんcsvはただのデータの固まりですから検索までかんがえるなら DBを選択肢にいれる必要が将来的にはでてくるかもしれませんね (特殊な集計処理が必要な場合はSQLに頼らざるを得ないと思います。) 今回の件についてはとりあえず正規表現で検索をかけるといけます。 エラー処理や例外処理をはしょっていますので正式な運用の際には 気をつけてください <?php $list = array('abcd','1234','xyz','日本'); $search = "y"; $search=preg_quote($search,'/'); foreach ($list as $value){ if(preg_match("/".$search."/mis",$value)) print $value." を 発見!"; } ?>

buronte
質問者

お礼

マッチングというのらしいですね。 上記のプログラムを使って、いろいろ勉強させていただきました。 その他、正規表現についても調べてみました。 おかげさまで、簡易的な検索ができるようになれました。 早期回答ありがとうございました!

関連するQ&A

  • phpでcsvデータをランダム表示について

    下記はcsvデータをランダムに1つだけ抽出するphpのプログラムですが、1度表示したデータに色をつけるとか、表示させない方法はありますか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 読み込みCSVファイル $lines = file('test.csv'); shuffle($lines); foreach ($lines as $line) { if ( ! in_array($line, $list)) { array_push($list, $line); if (count($list) >= $count) { break; } } } // CSVファイルに出力 $file = fopen('test2.csv', 'w'); foreach ($list as $l) { echo $l.'<br>'; if ($file) { fputs($file, $l); } } fclose($file); ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPのデータをCSVファイルに保存

    PHPで入力された情報を、CSVファイルに保存したいのですがうまくいきません。 $list=array($name,$jyusyo,$mail,$tel,$text); $fp=fopen('dat/dat.csv','a+'); foreach($list as $line){ fputcsv($fp,split(',',$line)); } fclose($fp); ウェブで調べてこのような形のものを作成してはみたんですが、 エラーが出てしまいます。CSVファイルに保存したい時は、 CSVファイルを先に作るべきなのでしょうか?そうでしたら、 作成の仕方を教えていただきたいです。 初心者ですがよろしくお願いします。

    • 締切済み
    • PHP
  • PHPのサイト内検索の結果をCSVに書き出すには

    Webサイトのサイト内検索が、どれくらい使用されているか調べるため、 検索結果をCSVで書き出したいと考えております。 php初心者のため、苦戦しております。 詳しい方がいらっしゃいましたら、ご教示ください。 サイトはCodeIgniter(コードイグナイター)を使用しており、PHP5.3.3です。 サイト内検索の仕組みは、form actionを使用しており、 htmlに記載のコードは以下です。 ------------------------------------------------------------------------------------------------------- <form action="search.php" method="get" data-form-id="keyword_webcode-search"> <input name="keyword_webcode" type="text" value="" rel="キーワード検索出来ます。"><br> <input type="submit" value="データを送信"> </form> ------------------------------------------------------------------------------------------------------ データ送信先のsearch.phpに書き出すためのコードを追加しておりますが、 何も起こりません。 コードを追加するファイルが間違っているのでしょうか? 追加したコードは以下です。 ------------------------------------------------------------------------------------------------------- $csv = fopen('file.csv', 'a'); fputcsv($csv, $ShiftJIS); fclose($csv); ------------------------------------------------------------------------------------------------------- 色々試してみましたが、うまく行かず行き詰まっています。 どなたかアドバイスいただければと思います。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPでcsvファイルを一覧表示するにはどうすれば良いのでしょうか?

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="1">'; while ($field_array = fgetcsv($fp, 10000, ',', '"')) { echo '<tr>'; foreach ($field_array as $value) { echo '<td>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '<table>'; //ファイルを閉じる fclose($fp); ?> プログラムだと、全ての項目が表示されてしまうので 少ない項目(3~4つ)で表示できるにはどうすれば良いのでしょうか? また、各項目毎のタイトルも付けたいのですが お願いします。

    • 締切済み
    • PHP
  • phpを使いファイル内を検索

    phpでファイル内を検索したいです。 以下のようにphpを書きましたが、やりたいことは1行目から5行目までの中でphpという言葉を検索し6行目から10行目までの中でsnsという文字を検索といったように、行数で分けて検索する言葉も分けたいです。 どのように書いて良いかなどのヒントなどいただけないでしょうか。 $file = dirname(__FILE__) . '/list.txt'; $word = 'php'; if(is_file($file)){ $array = @file( $file, FILE_IGNORE_NEW_LINES); if(in_array($word,$array)){ print_r($word); } } ?>

    • 締切済み
    • PHP
  • PDOでの検索システムについて

    プログラミング初学者です。 過去に検索システムを作る時にmysqlを使っていましたが、今回PDOを使った簡単な検索の仕組みを作ってみています。 実際に動作確認してみると検索結果で何もでず、var_dumpで確認してみるとNULLとなってしまいます。 いろいろ調べているのですが、PDOを使った場合の検索条件の部分の書き方がイマイチよくわかりません。 そしてだんだん深みにはまって迷走してしまっています。。。 アドバイスをいただけないでしょうか。 【検索フォーム(search.php)】 <form name="" method="POST" action="result.php"> <button type="submit" name="area" value="新宿">新宿</button> </form> 【検索結果(result.php)】 define('DB_HOST', 'localhost'); define('DB_USER', 'ユーザー名'); define('DB_PASSWORD', 'DBパスワード'); define('DB_NAME', 'DB名'); try { $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASSWORD); } catch (PDOException $e) { echo $e->getMessage(); exit; } $sql= "select * from shop where area='" . $_POST["area"] . "' "; $shop = array(); foreach ($dbh->query($sql) as $row) { array_push($shop, $row); } ?> <body> <?php foreach ($salon as $row) : ?> <?php echo htmlspecialchars($row['area'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['station'],ENT_QUOTES,'UTF-8'); ?> <?php endforeach; ?> </body> </html> ※ $sql= "select * from shop where area='" . $_POST["area"] . "' "; の部分に原因があるのかと私は考えています。 $sql= "select * from shop; とした場合は全件表示されるからです。 見難いコードで申し訳ありませんが、アドバイス頂ければ幸いです。

    • ベストアンサー
    • PHP
  • PHPとCSVファイル

    CSVファイルを用いて検索するプログラムを書いています。 CSVファイルの読み込みはできたのですが その後が詰まってしまい、質問させていただくことにしました。 流れとしてはdealer.php(ディーラー)→color.php(色)→sex.php(性別)と続き sex.phpで 男性(0)ならkekka.php(結果)へ。 女性(1)ならnaisou.php(内装)に移動します。 移動方法はすべてsubmitボタンを使用。 car.csv ディーラー,色,性別(0→男、1→女) toy,siro,0 toy,siro,1 toy,kuro,0 toy,kuro,1 nis,siro,0 nis,siro,1 nis,kuro,0 nis,kuro,1 hon,siro,0 . , . . , . 項目の多少の修正と追加があるのでCSVファイルは使用したいです。 PHPで性別の0と1を検索し、 それぞれのページに移動させるにはどうすればいいのでしょうか? 初めてプログラムを組んでいるため、分かりやすい解説が あるとうれしいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CSVファイルの改行

    似たような質問はあったのですが、解決できませんでした。 複数のテーブル(mysql)から抽出したデータをCSVファイルにして ダウンロードという動きを作りましたが、Excelでは改行されているのに メモ帳だと改行されません。 配列の最後に"\r\n"を挿入してみたところ、メモ帳での改行はできたのですが、 Excelに必要ない改行が入ってしまいます。(あたりまえですよね) 改行コードの入れるタイミングと方法を教えて頂けますか。 select文 while($rows = @mysql_fetch_array($result)){ $list[$i] = array ($aaa,$bbb,$ccc); $i++; } $filename = 'ファイル名'; $fp = fopen($filename.'.csv', 'w'); foreach ($list as $line) { fputcsv( $fp , $line ); } fclose($fp); ZIP圧縮処理後ダウンロード 環境:php5,mysql5

    • 締切済み
    • PHP
  • PHPでCSV出力したいです。

    phpを使ってCSVデータを出力したいです。 現在、DB内のデータ1行分(最終行)をCSV出力できているのですが 他の行のデータが出力されません。 まだまだphp初心者ですので知識のある方どうぞご助言ください。 以下、現在のソースです。 <?php require_once "Const.inc"; require_once "DBUtil.inc"; //DBコネクション取得 $db =& DBUtil::connect(); //クエリ生成 $query = "select ". "strfct.strfct_nm as nm, ". "emply.emply_id as id, ". "emply.emply_nm as nm2, ". "emply.pwd as pwd, ". "emply.e_strfct_id as sid ". "from ".      "emply ".  "inner join ". "strfct on strfct.strfct_id = emply.e_strfct_id "; $result = mysql_query($query); while($row99 = mysql_fetch_assoc($result)): $value_nm=$row99['nm']; $value_id=$row99['id']; $value_nm2=$row99['nm2']; $value_pwd=$row99['pwd']; $value_sid=$row99['sid']; $list = "\"" . $value_nm . "\",\"" . $value_id . "\",\"" . $value_nm2 . "\",\"" . $value_pwd . "\",\"" . $value_sid . "\"\n"; endwhile; mysql_free_result($result); $size = strlen($list); $filename = 'FCTDAT.csv'; //csvdll header("Content-Disposition: inline; filename=\"".basename($filename)."\""); header("Content-Length: ".$size); header("Content-Type: text/csv"); echo ($list); // DB切断 $db->disconnect(); ?> 以上のソースで原因と思われる部分はwhile文の中だと考えております。どうにかDB内のデータの全行を出力したいです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • csvファイルの不定長フィールドの値を取得する方法

    いつもお世話になります。 tst.csv aaa,bbbb,ccc dd,eeeeeee,ffff,gg,hh iii,jj ・・・・・ などのように レコードごとにフィールド数の異なるcsvファイルの 各レコードの値を取得したいのですが、できなくて試行錯誤しています。 フィールドの数が同じならば 例えば、フィールド数が2ならば $array = file("tst.csv"); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; list($fiel1,$fiel2) = split("\,",$RowData); print('$fiel1='.$fiel1.' $fiel2'.$fiel2."<br>"); $i++; } とすればできます。 ところが、フィールド数がいくつあるかわからないので、 list($fiel1,$fiel2) = split("\,",$RowData); を list($fiel) = split("\,",$RowData); としてforeachで値を取り出そうとしましたが、 foreach ($fiel as $Value) { echo $value.'<br>'; } Invalid argument supplied for foreach() というエラーが表示され できません。 何が、Invalid argumentなのか見当がつきません。 各レコードの値を $fiel[1] $fiel[2] $fiel[3] などに格納することはできないものでしょうか。 おわかりになる方なにとぞよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう