PHPのお勉強= 図書館機能構築

元ページへ(いぶき自由研究実験室)

リンク元ページに移動  PassWordページ

PHPの勉強入口 MySQLを使ったPage 

図書館機能構築 LazarusDBソフト SQLiteでプログラミング




この学習には始めはローカルサーバー上で行い
レンタルサーバーに上げるのはこの学習が一応終了
してからにします。
でないとサーバーが攻撃されても防御する機能を
付加できていないと共同サーバーの為、
同居者に迷惑がかかる可能性があるからです。


先ず専用のDatabaseTableを作成する

DatabaseName=honnoheya(図書館)

必要な Table = bbase,karkas,rysbase,pbbase

hongenbo(図書台帳),karkas(貸出管理簿),rysmabo(利用者名簿),sytpan(出版社名簿),yykhyo(予約帳簿)


Databasename honnoheya(図書館)
SQL create database honnoheya default charset=utf8mb4 collate=utf8mb4_unicode_ci; 実行済



各テーブルの必要項目の考察と決定

図書台帳

テーブル名 hongenbo(図書台帳)
誘引 台帳番号 書名 シリーズ名 巻号 NDC 著者記号 複本連番 ISBN 出版社 作者 本体単価 発行年月 予算 受入先 受入日 廃棄度番
カラム名 honbng honmei series kanmei ndc namaekigo fukuhonno isbn pablis sakusya tanka hatubaibi yosan ukesaki ukebi haikido
varchar(20) varchar(250) varchar(250) varchar(80) varchar(10) varchar(6) smallint varchar(18) varchar(10) varchar(160) int varchar(16) varchar(20) varchar(20) date int
SQL create table hongenbo (honbng varchar(20) not null primary key,honmei varchar(250),series varchar(250),kanmei varchar(80),ndc varchar(10),namaekigo varchar(6),fukuhonno smallint,isbn varchar(18),pablis varchar(10),sakusya varchar(80),tanka int,hatubaibi date,yosan varchar(20),ukesaki date,ukebi date,haikido int); 実行済

貸出管理簿

テーブル名 karkas(貸出管理簿)
誘引 通番 利用番 図書番 貸出日 貸出期限 返却日 予約日 取消 紛失日
カラム名 krbn rysbn tsybn kasibi kaesuhi kaesitahi yoyaku torikesu funsitubi
auto increment varchar(20) varchar(20) date date date date date date
SQL create table karkas (krbn int unsigned auto_increment not null primary key,rysbn varchar(20)not null,tsybn varchar(20) not null,kasibi date,kaesuhi date,kaesitahi date,yoyaku date,torikesu date,funsitubi date); 実行済

利用者名簿

テーブル名 rysmabo(利用者名簿)
誘引 利者番 名前 ふりかな 識別番 生年月日 性別 住所 連絡先 自宅TEL 連絡用TEL 登録日 解除日 職業
カラム名 rysno shimei furigana sikiban tanjyobi danjyo sumika renraku denwakiso denwafudan tourokubi kaijyobi sigoto
データ型 varchar(20) varchar(50) varchar(100) smallint date smallint varchar(200) varchar(200) varchar(20) varchar(20) date date varchar(20)
SQL create table rysmabo (rysno varchar(20) not null primary key,shimei varchar(50) not null,furigana varchar(100),sikiban smallint,tanjyobi date,danjyo smallint,sumika varchar(200),renraku varchar(200),denwakiso varchar(20),denwafudan varchar(20),tourokubi date,kaijyobi date,sigoto varchar(20)); 実行済
貸出表名










データベースhonnoheyaに3つのテーブルが作成されました以下が結果です。/全て表内のSQLを実行したことで実行済


2019/08/23 実行と編集


先頭ページ[ index.php]を作成

先ず先頭ページですと記入

次にPHPからMySQLに接続する一般的方法PHP Data Object(PDO)を使用

PDOはMysql以外のデータベースにも接続できる

また、DBサーバーが離れた場所にある場合も接続文字列で接続する

XAMPP/MAMPはPHPと同じサーバー上でMysqlが動いてる場合

mampのdefault of user,pasword="root","root"[xampp="root",""]

and localhost上のhost=127.0.0.1(常時)

mysql:dbname=honnoheya;host=127.0.0.1;charset=utf


説明 ご注意!≪登録確認できましたが、再度実行すればキー違反になります≫
url :  http://localhost/PHPの教科書/dbemysql/honnoheya/(index.php)
結果
php文 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>先頭ページ</title>
</head>
<body>
<h2>演習</h2>
<pre>
<?php

try {
   $db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8', 'root', 'root');
} catch (PDOException $e) {
   echo 'DB接続エラー: ' . $e->getMessage();
}

$count = $db->exec('INSERT INTO rysmabo SET rysno="19101", shimei="安藤 武", furigana="あんどう たけし", sikiban=1, tanjyobi="2019-08-26", danjyo=1,sumika="岐阜県羽島市正木町新井2019-112",renraku="住所に同じ",denwakiso="058-392-3939",denwafudan="090-8112-8811",tourokubi="2019-08-27"');
echo $count . '名の利用者を登録しました';
?>
</pre>
</body>
</html>

演習

1名の利用者を登録しました
query create table rysmabo (rysno varchar(20) not null primary key,shimei varchar(50) not null,furigana varchar(100),sikiban smallint,tanjyobi date,danjyo smallint,sumika varchar(200),renraku varchar(200),denwakiso varchar(20),denwafudan varchar(20),tourokubi date,kaijyobi date,sigoto varchar(20));


説明 利用者名を羅列する処理SQL
ローカルホスト上で実行 / http://localhost/PHPの教科書/dbemysql/honnoheya/ryoraretu.php
server sunibuki上で / https://s13.ssl.ph/sunibuki/dbemysql/honnoheya/ryoraretu.phpで予定
結果
php文 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>利用者羅列ページ</title>
</head>
<body>
<h2>演習 利用者羅列</h2>
<pre>
<?php
try {
   $db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8', 'root', 'root');
} catch (PDOException $e) {
   echo 'DB接続エラー: ' . $e->getMessage();
}

$hairets = $db->query('select * from rysmabo');
while ($hairetu = $hairets->fetch()) {
print($hairetu['shimei']."\n");
}
?>
</pre>
</body>
</html>

演習 利用者羅列

安藤 武

1名
query create table rysmabo (rysno varchar(20) not null primary key,shimei varchar(50) not null,furigana varchar(100),sikiban smallint,tanjyobi date,danjyo smallint,sumika varchar(200),renraku varchar(200),denwakiso varchar(20),denwafudan varchar(20),tourokubi date,kaijyobi date,sigoto varchar(20));

利用者名を羅列する処理SQL
ローカルホスト上で実行 / http://localhost/PHPの教科書/dbemysql/honnoheya/jinin.php
server sunibuki上で / https://s13.ssl.ph/sunibuki/dbemysql/honnoheya/jinin.phpで予定


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>人員ページ</title>
</head>
<body>
<h2>演習 人員</h2>
<pre>
<?php
try {
   $db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8', 'root', 'root');
} catch (PDOException $e) {
   echo 'DB接続エラー: ' . $e->getMessage();
}

$hairets = $db->query('select * from rysmabo');
while ($hairetu = $hairets->fetch()) {
print($hairetu['shimei']."\n");
}
print("\n");

$ninzu = $db->query('select count(*) as giyou from rysmabo');
$kotae = $ninzu->fetch();
print($kotae['giyou']."名");

?>
</pre>
</body>
</html>

演習 人員

安藤 武

1名


フォームからの?情報を保存する?と聞いただけでは分からないですが取敢えずやってみましょう
先ず、テーブル(tablename= kioku )作成します。
column[0],[1],[2]name=[0]:["kobg"],[1]:["naiyou"],[2]:["jikan"]と言うテーブルを作成database=honnoheya

databasename = honnnoheya
create table kioku (kobn int unsigned auto_increment not null primary key,naiyou varchar text,jikan datetime);
work is SQl.TAB by databasename=honnoheya of phpMyAdmine , データベースhonnnoheyaにテーブルkiokuを作成しておく

次は(kioku.html)
<!DOCTYPE html>
<html lang="ja">
<html>
<head>
<meta charset="utf-8">
<title>ホーム内容記憶ページ</title>
</head>

<body>
<header>
<h1 class="font-weight-normal">記入内容を記憶します</h1>
</header>
<main>
<h2>ご記入された内容を保存しています</h2>

<form action="tadoru.php" method="post">
   <textarea name="naiyou" cols="50" rows="10" placeholder="伝言、御意見等有れば御記入してください"></textarea><br>
   <button type="submit">登録する</button>
</form>
</main>
</body>
</html>

記入内容を記憶します

ご記入された内容を保存しています


〔登録する〕
ここでこのフォーム(tadoru.php(=記憶をたどる))で表示します。
上記プログラム実行後の、表示フォームを作成します。
次の様になり、右に引き渡されます(tadoru.php)。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<!DOCTYPE html>
<html lang="ja">
<html>
<head>
<meta charset="utf-8">
<title>ホームに記憶した内容を辿るページ</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">記憶した内容を辿ります</h1>
</header>
<main>
<h2>前入力内容の情報を記録する</h2>
<pre>
<?php
try {
$db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8','root','root');
} catch (PDOException $e) {
 echo 'DB接続エラー: ' . $e->getMessage();
}
$kiiteyo = $db->prepare('INSERT INTO kioku SET naiyou=?, jikan=NOW()');
$kiiteyo ->execute(array($_POST['naiyou']));
echo '伝言を受け取りました';
?>
</pre>
</main>
</body>
</html>

記憶した内容を辿ります

前入力内容の情報を記録する

伝言を受け取りました


以下は確認をしていません技術を紹介しているだけです。


登録ができた内容の確認を表?で行う為の試行(kakunin.php)
<!DOCTYPE html>
<html lang="ja">
<html>
<head>
<meta charset="utf-8">
<title>登録ができた内容の確認を表?で行う為の試行</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">登録内容を確認できるようにします</h1>
</header>
<main>
<h2>登録されたマトメと具体的な内容を確認できるようにします</h2>
<!-- <pre>タグは使用しない -->
<?php
try {
$db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8','root','root');
} catch (PDOException $e) {
 echo 'DB接続エラー: ' . $e->getMessage();
}
/*テキスト枠に記入した内容をkobnの降順に表示します。(order by kobn)*/
$kiiteyo = $db->prepare('select * from kioku order by kobn desc');
?>
<article>
<?php while ( $kiiteyo = $kioku->fetch()): ?>
<p><a href="#"><?php print($kiiteyo['naiyou']): ?></a></p>
<!-- <p>〜</p>で囲まれたテキストは1つの段落 -->
<time<?php print($kiiteyo['jikan']); ?></time>
<hr><!-- 「HR」とは「horizontal rule(水平方向の罫線)」で、水平の横線を引くのタグ。 -->
<?php and while; ?>
</article>
<!-- </pre>タグは使用しない -->
</main>
</body>
</html>





mb_substrは表示する文字数を指定する場合に使用(kakunin2.php)
mb_substr(文字列,始まる位置,表示する文字数)
下記に用法例を記します

<article>
<?php while ( $kiiteyo = $kioku->fetch()): ?>
<p><a href="#"><?php print(mb_substr($kiiteyo['naiyou'].0,80)); ?></a></p>

任意の引数をsqlの引数記入しておく
<main>
<h2>例:固定の引数を渡す</h2>
<?php
try {
$db = new PDO('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8','root','root');
} catch (PDOException $e) {
 echo 'DB接続エラー: ' . $e->getMessage();
}
$kiiteyo = $db->query('select * from kioku where kobn =1');
?>
</main>

固定引数をsqlに記述しておき戻るボタンでdekiru2.phpに戻る(kakunin2.phpからdekiru2.php)
executeで動的に引数に任意(或は順次)のキーの値を引き渡し

$kiiteyo = $db->query('select * from kioku where kobn =1');
$kiite = $kiiteyo->fetch();
?>
<article>
<pre><?php print($kiite['naiyou']); ?></pre>
<a href="dekiru2.php">戻る</a>
</article>

次は動的に引数をURLに記述し切り替える(dekiru3.php)
http://localhost/kakunin3.php?kobn=3と入力し移動(エンターキー)

$kiiteyo = $db->prepar('select * from kioku where kobn=?');
$kiiteyo->execute(array($_REQUEST['kobn']));
$kiite = $kiiteyo->fetch());
?>
<article>

次は(dekiru2.php)
a hrefはphpによるリンク先の指定或いはダウンロードまでのパスでここでは立ち上げるページまでのパス
又、<a herf="#""><?php ...?>の様に引き渡す先を指定しない場合はこのように["#" ]を書く

<article>
<?php while ($kiite = $kiiteyo->fetch()); ?>
<p><a href="kakunin2.php?kobn=<?php print($kiite['kobn']; ?> <?php print(mb_substr($kite['naiyou'],0,80)); ?>
</a></p></article>

次は送信されたパラメーターを受け取る時のデータの審査をすることで、
エラーの対応をする事で起きるリスクを避ける事が出来る(kakunin3.php)
先ず、is_numericは整数の時trueを返し[!]を前に添える事で否定を表すので[!is_nume..で
数値でないなら次の分を実行する!

  .....
echo 'DB接続エラー: ' . $e-getMessage();
}
$kiite = $_REQUEST['kobn'];
if (!is_numeric($kiite)) {
print('不正な選択をされました・・・!');
exit();
}
$kiiteyo = $db->prepare('select * from kioku where id=?');

又引き渡された値が整数の内でも正の値を示さないなら処理を止め整数でないと警告を発する同じく(kakunin3.php)
kobn >= 1 選択された項目の1以上になっているので1未満なら処理を止めましたと注意を促す事に成る

  .....
echo 'DB接続エラー: ' . $e-getMessage();
}
$kiite = $_REQUEST['kobn'];
if (!is_numeric($kiite) || $kiite <= 0) {
print('正しく選択をして下さい・・・!');
exit();
}
$kiiteyo = $db->prepare('select * from kioku where id=?');

次は指定の文字数を超えた時の表示方法を加えます(kakunin4.php)
内容を羅列したときの文字制限を超えた時文字を加え解り易くしたい。その文字を指定するには

<article>
<?php while ($kiite = $kiiteyo->fetch()): ?>
<?php if ((mb_strln($kiite['naiyou']))>80): ?>
<p><a href="kakunin3.php"><?php print(mb_substr($kite['naiyou'],0,80)); ?></a></p>
<?php else:  ?>
<p><a href("kakunin3.php"><?php print($kiite['naiyou']: ?></a></p>
<?php endif; ?>
</article>



データベース接続プログラムを共有するモジュール?を作成しておく(dbtunagi.php)

<?php
try {
$d = new PDD('mysql:dbname=honnoheya;host=127.0.0.1;charset=utf8','root','root');
} catch (PDOException $e) {
echo 'DBにつながらず: ' .  $e->getmessage();
}
?>

接続モジュールを使用する練習(dbtngriyo.php)
<?php require('dbtunagi.php'); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DB接続モジュールの共有</title>
</head>
<body>
<header>
<h1>DB接続モジュールを共有専用に作る</h1>
</header>
<main>
<h2>DB接続モジュールを試してみる</h2>
<?php
$kiitene = $db->query('select * from hongenbo order by honbng desc');
?>
<article>

(kakikomi.php)
ポイント
prepareはSQL分の無害化をしてくれる

<?php require('dbtunagi.php'); ?>
<!DOCTYPE html>
<html lang="ja">
...
<main>
<pre>
<?php
$statement = $db->prepare('insert into hongenbo set honbango=?,honmei='あなたの前には交差点が有る',torokubi=NOW()');
$statement->execute(array($_POST['honmei']);
echo '図書の登録完了';
?>

(kakunin.php)
<?php require('dbtunagi.php'); ?>
<!DOCTYPE html>
<html lang="ja">
...
<main>
<pre>
<?php
$kiiteyo = $db->prepare('select * from hongenbo where honbngo=?');
$kiiteyo->execute(array($_REQUEST['honbng']));
$kiite = $kiiteyo->fetch();
?>


表示レコード数任意の件数を任意の位置から羅列する(siteikensu.php=件数分け)
('... order by honbngo limit 0,8')=初めから8データ表示 して、次のページに切り替える事を繰り返す
但し初めから表示の始まる位置と件数を固定した場合

<?php
$kiiteyo = $db->query('select * from hongenbo order by honbng 0,8');
?>

次は始まりの位置を動的に変える場合(siteikensu2.php)
urlパラメーターで始まる位置を切り替える
下記のurlとパラメーターを記入すEnterを押す
http://localhost/.../.../siteikensu2.php?page=? ...*
bindParamは数値としてパラメータを受け取る
bindParam(x(数値例=1,11,89),$_REQUEST['page(urlで指定したパラメーター=*(上記url例))']

<?php
$kiiteyo = $db->prepaer('select * from hongenbo order by honbng ?,8');
$kiteyo->bindParam(1, $_REQUEST['page'],PDO::PARAM_INT);
$kiiteyo->execute();
?>

更にurlパラメーターに指定したpageをページ8*?(ページ)として指定する方法(siteikensu3.php)
urlの記入文字は変えない

<?php
$page = $_REQUEST['page'];
$start = 5 * ($page - 1);
$kiiteyo = $db->prepaer('select * from hongenbo order by honbng ?,8');
$kiteyo->bindParam(1, $start,PDO::PARAM_INT);
$kiiteyo->execute();
?>

そしてパラメーターを省略した場合に対応させる(siteikensu4.php)
http://localhost/.../.../siteikensu4.php
コードを変えていなければ下記のように表示されます
Notice: Undfined index: page in .../index.php on line XX
では、urlパラメータがない時は1ページ目として表示するには
isset変数でパラメータの存在を確認存在時はtrue else false を返す
又、最後にページにリンクを作成して使い易くする

<?php
if (isst($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
$page = &page $_REQUEST['page'];
} else {
$page = 1;
}$start = 5 * (page - 1);
...
<?php endwhile; ?>
<a href="siteikensu5.php?page=2">2ページ目へ</a>
</article>

更に表示するページボタンを上にも下にも付ける(siteikensu5.php)
<?php



?>


以上

もしここでインストールしたmysqlを使用して、ディスクトップ上でDatabaseアプリケーションを作成することが可能です。
Lazarusを使い、その方法を次のページで試してみましょう。

先頭へ