薬価サーチ(検索)

薬価サーチ(検索)

薬価サーチ(検索)

平成24年4月1日現在のデータを検索できます。新薬価と旧薬価の比較にも対応。

一般名でなく、商品名で検索してください。ひらがなの検索には対応していません。

薬価サーチ(検索)の作り方

データベース兼PHPの勉強がてら、薬価サーチ(検索)というデータベースを作ってみた。

素材としては、厚生労働省が薬価基準のエクセルファイルを公開しているので、それを使わせてもらいました。

環境(PHPとMySQL)の設定

データベースの勉強は、作ることよりも、この環境設定が第一関門かと思います(自分的に)。

phpやMySQLはサーバー上で動くプログラムなので、一般のhtmlファイルを作るようなわけには行きません。もちろん、レンタルサーバーは大体この2つはインストールされているので、レンタルサーバー上で挙動を確認しながら作成するというのも一つの方法です。

通常は、自分のPCの中で作成、動作確認を行なって、データをエクスポート後、レンタルサーバー上のスペースにアップロードandインポートという方法が一般的になります。

XAMPPというソフトを使うと、apacheとmysqlを同時にインストールすることができます。通常は、インストーラ版でインストールして、起動するだけ。(ただし、スカイプがポート80を使用しているようなら別のポートにしないと競合してapacheが起動しません。)

runningが確認できたら、adminボタンを押すと、apache、mysqlともにlocalで起動できます。

apacheの方は、初期画面は、http://localhost/xampp/になっているので、自分の作成したphpファイルを動かしたい時は、phpファイルをC:\xampp\htdocsの中に置き(windowsの場合)、ブラウザでhttp://localhost/○○.phpのようにURLを指定して実行する。

mysqlの方は、adminを押すと、phpMyAdminというmysqlを簡単に操作することのできるソフトが起動するので、それを使ってデータベースを作成する。レンタルサーバー上であったとしても、MySQLを操作するのにこのソフトを使う(Xサーバー。他は未検証)。

データベースの作成

ここまで準備ができたら早速、データベースを作成する。PHPファイルより先に先ずはデータベースだ。

そして、その前に、データベースの情報をエクセルで準備することになる。今回は先に述べたとおり、厚労省のサイトから頂いたエクセルファイルを一つにまとめて、いらないフィールド(カラム)を削って、ID番号を振って、全体で8カラムにして、CSVで保存後、terapadでUTFに変換、改行コードをLFにして保存。

今の時点では、よく改行に関してはわからないけど、とりあえずこれで。

そしたら、phpMyAdminで、データベースを作成する。今回はysearchという名前で作成。

次に、テーブルを作成する。今回はysearchという名前で作成。カラム数は8。

カラム名は、自分が付けたい名前をアルファベットで、種別は、INTは数字、TEXTは文、最後の薬価は小数点2位あるので、DECIMALの長さ/値(8,2)で指定。

idはプライマリー(主キー)設定、自動で番号を割り振りたいので、オートインクリメントにチェックを付けておく。(主キー設定しないとオートインクリメント設定ができないこともある)、ユーザー定義やnullになっている場合は→なしへ。

値を入力し終えたら、下の方の保存するボタンを押すとテーブルが作成される。その右の実行ボタンは、カラム(列)を追加するボタン。

そしてインポート。インポートの画面は、実にシンプルなんだが、ここで以外にもつまづく。いまいちわからないんだよなここ。CSVをアップロード、ファイル文字セットはUTF-8、フォーマットはただのCSVでなく、LOADDETA文を使用したCSVの読み込みを選択、カラム終末記号にカンマを、行末端記号はautoだと1行しか読み込まないんで、空欄にしておき、実行。LOCAL キーワードを使用するの意味は今はわからず、とりあえずチェックのまま。CSVで読み込むと長いデータの読み込みは固まる。

ここで、先ほどのCSVファイルをインポートしたいのだが、何もしないとファイルが大きいのか、SQL文が長いのかよくわからないけど、たぶんエラーになる。

「Got a packet bigger than ‘max_allowed_packet’ bytes」というやつだ。対処法は、windowsの場合、C:\xampp\mysql\binの中のmy.iniという構成ファイルの、max_allowed_packet = 1Mという記述を、8Mとかにすれば良い。実はここでポートもいじれるみたい。

直し終わったら、コントロールパネル→管理ツール→サービス→mysqlで再起動。

その後、SQLの「SHOW VARIABLES LIKE max_allowed_packet;」で、サイズを確認すると、変わっていることが確認できるはず。SQLの命令は小文字でも良い。大文字がメンドイ人は小文字でOK。

「CSV 入力のカラム数が不正です (行: 1)」というエラーもある。これは単純にCSVファイルの時点でのカラム数とデータベースのカラム数が一致していない場合のエラーだ。

無事インポート出来れば下記のようになる。

テーブル名の変更は、ALTER TABLE 変更前テーブル名 RENAME 変更後テーブル名;なんだが、新規テーブルが自動で作成される感じで(table 2など)作られたテーブル名がなぜか変更できない。名前が悪いのか、半角スペースが悪いのか。。。

localで作ったデータベースは、SQL形式でエクスポートすることで、テーブルごとレンタルサーバーにインポートできる。

レンタルサーバー(Xサーバーの場合)にログイン後、mysql設定から、mysqlの追加とユーザーの追加をする(ホスト名はイジる必要はない)。ここで作ったユーザーIDとパスワードは、mysqlへのログイン情報であり、Wordpressのログイン情報でもなければ、サーバーへのログイン情報でもない。

Xサーバーは、同じphpmyadminを使用していじることができるので、それを使って先ほどのSQLファイルをインポートすればOKだ。

PHPファイルの作成

ここまで終わったら、phpファイルを作成する。

検索フォーム(つまり、検索したい薬の名前を打ち込むフォーム)のファイルと、結果のファイルの2つをphpファイル(UTF-8で)として作成する。


<p>薬価サーチ</p>
<form id="x1" name="x1" method="post" action="2.php">
<dl>
<dt><label for="x2">薬品名</label></dt>
<dd><input name="x2" id="x2" type="text" size="35" maxlength="255" /></dd>
</dl>
<input type="submit" value="検索する" />
</form>

<?php 
mysql_connect('ホスト名','ユーザーID','パスワード') or die(mysql_error());
mysql_select_db('データベース名');
mysql_query('set names utf8');
 
$resh=htmlspecialchars($_POST['x2'],ENT_QUOTES);
$res=mysql_escape_string($resh);
 
$recordSet=mysql_query("select * from yksearch where yaku like '%{$res}%'");
?>
 
<table width="500" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
<tr>
<th scope="col">id</th>
<th scope="col">区分</th>
<th scope="col">成分名</th>
<th scope="col">規格</th>
<th scope="col">薬品名</th>
<th scope="col">メーカー</th>
<th scope="col">後発</th>
<th scope="col">薬価</th>
</tr>
 
<?php 
while($table=mysql_fetch_assoc($recordSet)){
?>
 
<tr>
<td><?php echo(htmlspecialchars($table['id'])); ?></td>
<td><?php echo(htmlspecialchars($table['kubun'])); ?></td>
<td><?php echo(htmlspecialchars($table['seibun'])); ?></td>
<td><?php echo(htmlspecialchars($table['kikaku'])); ?></td>
<td><?php echo(htmlspecialchars($table['yaku'])); ?></td>
<td><?php echo(htmlspecialchars($table['meka'])); ?></td>
<td><?php echo(htmlspecialchars($table['ge'])); ?></td>
<td><?php echo(htmlspecialchars($table['yakka'])); ?></td>
</tr>
 
<?php 
}
?>
</table>

$resh=htmlspecialchars($_POST[‘x2’],ENT_QUOTES);は、フォームのデータのタグの機能を打ち消す効果。

$res=mysql_escape_string($resh);は、これまた、SQLのorだかなんだかの特殊な命令を防ぐエスケープ命令。

phpから、mysqlを呼び出すには、mysql_query();を使う。(カッコの中は”でくくる、mysql_queryの中は;は不要)

select文で表示された情報は、$recordSet変数で取り出す。$recordSet=mysql_query(‘select * from ysearch’); 。select以外のinsert文とかの時は、主としてsprintfを混ぜて追加しているようだ。変数の決まりがあるのはselectだけ。

like %$res% の変数は{}でくくること。シングルの中にダブルはエラーになる。likeは部分検索の条件命令。ページ検索の時は、各ページの文字を全て1つのフィールドにいれるのだろうか?今は不明。

$recordSet=mysql_query(‘select * from ysearch where yaku like “%{$aaa}%”‘);はダメ。

$recordSet=mysql_query(“select * from ysearch where yaku like ‘%{$aaa}%'”);はOK

$recordSet変数に代入された情報は、mysql_fetch_assocで連想配列(いわゆるハッシュ)にして別の変数(ここでは$table)に代入、while文で、$tableがtrueのあいだ(情報があれば)、ハッシュのキーを使って値を代入して行っている。

あとは、このphpファイルをサーバーの好きなところにアップロードして、読みこめばOK。htdocsのように置き場所に指定はない。

2012年2月21日12:04 AM | カテゴリー: Mysql | コメント(0)

コメントを残す

メールアドレスが公開されることはありません。