データベースの連結とページの追加

データベースの連結とページの追加

薬価サーチを作った時は、エクセルでいう1つの表だけをインポートして終わりだったけど、今回は2つの表をつなげる、リレーションというのを使ってみる。

また、ページ数が増えた場合の、「次のページヘ」ボタンも設置してみる。

つなげた表はこちら

※東邦薬品の発注システム(ENIF.net)が、なぜだか在庫分析の所で一部の薬品でメーカーの表示漏れがある上に、在庫分析の論理在庫数が現在の数値を即座に反映できないので、それらを補完するために、棚卸→CSV出力から得たデータを、全医薬品リストのデータとつなげて出力→ソートにて表示を目的とする。



外部ファイルの読み込み(インクルード)

phpでの外部ファイル読み込みは、require(‘○○.php’);を使用する。Wordpressでいうget_header();のようなもの。Wordpressでも文の途中でrequireを使えば外部から読み込めるのかな?

<?php 
mysql_connect('ホスト名','ユーザー名','パスワード') or die(mysql_error());
mysql_select_db('データベース名');
mysql_query('set names utf8');
?>

//インクルードの例
<?php 
require('aaa.php');
?>

上記のようなファイルは、別にファイルを作り、外部からのインクルードがいいみたい。

データベースの連結

データベースを連結するために、2つのテーブルをインポートもしくは、作成する。

フィールドを作り、

CSVファイルを編集(エンコードも)し、

インポートする。

下記2つのテーブルを結合して表示させる。


なお、2つの表に共通している項目が1つはないと結合できない

本来は、IDのような数字で関連付けがいいんだろうけど、今回は、薬品名(yaku)を使って2つのテーブル(yksearchとfuji)を結合する。

select f.yaku,y.meka from fuji f,yksearch y where f.yaku=y.yaku limit 0,10

訳すと、from以下で、fujiはfと、yksearchはyとショートカットキーを定義(fでもaでも何でもOK。ただ長いのを打つのがメンドイので)し、whereでf(fuji)のyakuとy(yksearch)のyakuがイコールであるレコード(行)を、fとyから、fのyakuとyのmekaの2つのフィールド(列)を、limit(開始位置,表示列)で10列だけ、最初から表示しなさい。

limitの表示列は、0がidでいう1に相当する。プログラミング独自の数え方だ。

これをSQLで表示させると、以下のように表示される。

ページの移動

この時点ではページ間移動ができないので、各ページへのリンクを作成する。ここでは、

<?php 
//次のページヘ等のリンクがクリックされたら、その情報がpageというidで送られる。それを変数に代入。
$page=$_REQUEST['page'];
//初期ページの時に$pageに値が入っていないので、値がなければ1とする。
if($page==''){
    $page=1;
    }
//最初のページを指定。マイナスにならないように、$pageは1より小さい場合は1とする。
$page=max($page,1);
 
//最後のページを指定。無いページを指定できないように。ページ数を取得し、$pageはそのページより大きくならないように。
$sql='SELECT COUNT(*) AS cnt FROM fuji';
$recordSet=mysql_query($sql);
$table=mysql_fetch_assoc($recordSet);
$maxPage=ceil($table['cnt']/10);
$page=min($page,$maxPage);
 
//limitの開始位置の設定    
$start=($page - 1)*10;
 
//phpでの変数の連結(ドットを使用)
$recordSet=mysql_query("select f.yaku,y.meka from fuji f,yksearch y where f.yaku=y.yaku limit ".$start.",10");
?>
 
<table width="500" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
<tr>
<th scope="col">薬品名</th>
<th scope="col">メーカー</th>
</tr>
 
<?php 
while($table=mysql_fetch_assoc($recordSet)){
?>
 
<tr>
<td><?php echo(htmlspecialchars($table['yaku'])); ?></td>
<td><?php echo(htmlspecialchars($table['meka'])); ?></td>
</tr>
 
<?php 
}
?>
</table>
 
<ul class="x3">
<?php 
//ulをfloatでメニュー。page番号をphpで指定。
if($page > 1){
?>
<li><a href="3.php?page=<?php echo($page-1);?>">前のページ</a></li>
<?php 
}else{
?>
<li>前のページヘ</li>
<?php 
}
?>
<?php 
if($page < $maxPage){
?>
<li><a href="3.php?page=<?php echo($page+1);?>">次のページ</a></li>
<?php 
}else{
?>
<li>次のページヘ</li>
<?php 
}
?>
</ul>

補足として、最後のページの文は、select countはテーブルのデータ件数を取得するSQLで、ASを使って、別名(cnt)をつけている。fujiというテーブルから列数を取得し、その件数をcntという名前にして、$sqlという変数に入れている。2つのテーブルからデータ取得の場合は行が多い方のテーブルを指定。

$recordSetにselectの表示内容を代入→$tableにハッシュで代入→$tableのデータ件数を10で割って、切り上げた数字を最後のページ番号として$maxPageに入れる→ページ数が、全ページ数より大きい時はmaxPageにする。(また、変数の使い回しはできるようだ)

$sql='SELECT COUNT(*) AS cnt FROM fuji';
$recordSet=mysql_query($sql);
$table=mysql_fetch_assoc($recordSet);
$maxPage=ceil($table['cnt']/10);
$page=min($page,$maxPage);

floatメニューのところの、if文は、ページがなければリンクを外す処置。(ページが1より大きければ、前のページへのリンクを、ページが最大ページより小さければ、次のページへのリンクを作ります。)

注:リレーションしたテーブル(つまり、2つの表をくっつけた表)でページ移動を行うには、SESSIONを使う必要があります。単一のテーブルであればこれで大丈夫です。

続きはこちら→テーブルのソート機能を有効にする

2012年2月24日7:07 PM | カテゴリー: Mysql | コメント(0)

コメントを残す

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