【PHP+SQLite3】linuxコマンド登録ツールを作ってみた。


###当方のスペック
OS：Windows10 Home 64bit
メモリ:8GB
CPU:言いたくないほどダサい
(なんせ安いパソコンなので)
ローカル開発環境：XAMPP

実業務であまりphpを使う機会がないが、興味があるので以前勉強がてらに作っていたプログラムをメモとして残そうと考えている。

さらに登録するデータ量がある程度ほしいのと、資格の勉強も進めたかったことから作成してみようと考えた。
そして、lpic勉強のためのサイトpint-tのコマ問題のような雰囲気の
ものを作れたらと考えていた。

##機能
linuxコマンド、コマンドのオプション、コマンドのカテゴリー、
コマンドの機能(用途)を登録、削除、参照できるプログラム

DB：sqlite3
(理由：簡単に使えるから && DBの勉強に丁度よさそうだから)


###完成イメージ

![完成イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/c5183273-b021-5c36-8ea0-15eb51af5f15.jpeg)

###1.フォーム作成
登録ボタン(button1)、削除ボタン(button2)、参照ボタン(button3)


```php
<!DOCTYPE html>
<html lang="ja">
<meta charset="utf-8">
<form action="linux_command_resist.php" method="post">
<title>linuxコマンド登録</title>
<h1>linuxコマンド登録</h1>
コマンド：<input type="text" name="lword">
オプション:<input type="text" name="lopt"><br><br>
カテゴリー:
	<select name="l_category">
		<option>1capacity_planning</option>
		<option>2Linux_Kernel</option>
		 <option>3Boot_System</option>
		<option>4Device_FileSystem</option>
		<option>5Raid_Lvm</option>
		<option>6Network</option>
		<option>7Mentenance</option>
		<option>8DNS</option>
		<option>9WebServer</option>
		<option>10Samba_NFS</option>
		<option>11dhcp_ldap</option>
		<option>12mailService</option>
		<option>13SystemSecurity</option>
	</select>
	<br>
回答：<textarea name="l_ans" maxlength=500 cols=100 rows=5></textarea><br><br>
回答(短縮)<textarea name="l_sans" maxlength=500 cols=100 rows=5></textarea><br><br>
<input type="submit" value="確定" name="button1">
<input type="submit" value="削除" name="button2">
<input type="submit" value="参照" name="button3">

<br>
</form>
```

###2.登録処理
(１)ここでは、ファイル(DB)の有無をチェックする
なければ、データベースとテーブルを作成(query_c)。
(２)コマンド、オプション、コマンドの用途、コマンドの用途(短縮版)の入力後に
コマンドとオプションが登録されていれば、「既に存在している」旨の
メッセージを出し、未登録であれば登録後に登録内容を表示する

```php
<?php $lexam=isset($_POST["lword"])?htmlspecialchars($_POST["lword"]):null;
$l_opt0=isset($_POST["lopt"])?htmlspecialchars($_POST["lopt"]):null;
$l_opt0=trim($l_opt0);
$lans0=isset($_POST["l_ans"])?htmlspecialchars($_POST["l_ans"]):null;
$lsans0=isset($_POST["l_sans"])?htmlspecialchars($_POST["l_sans"]):null;
//テキストエリア内の改行を変換
$lans0=nl2br($lans0);

$lsans0=nl2br($lsans0);
$l_cate0=isset($_POST["l_category"])?htmlspecialchars($_POST["l_category"]):null;

$db_name='linux_quiz3.db';
$ext=file_exists($db_name);

$query_c="CREATE TABLE tbl_linux(exam0 VARCHAR(20),opt0 VARCHAR(30),category0 VARCHARA(50),ans0 VARCHAR(500),sans0 VARCHAR(500))";
//抽出
$query_select2="SELECT * FROM tbl_linux WHERE exam0 = ? AND opt0 = ?";
//挿入
$query_ist="INSERT INTO tbl_linux(exam0,opt0,category0,ans0,sans0) VALUES(?,?,?,?,?)";
//削除
$query_del="DELETE FROM tbl_linux WHERE exam0 = ? AND opt0 = ?";

function DataCheck($db0,$qry0,$val1,$val2)
{
	$result3=$db0->prepare($qry0);
	//パラメータをセット
	$result3->bindparam(1,$val1);
	$result3->bindparam(2,$val2);
	$result3->execute();
	//検索結果が配列に格納する
	$select_data=$result3->fetch();
	return $select_data;
}

//設定してあるとき
if(isset($_POST['button1']) && empty(trim($lexam)) == false){
	//データベースを開く
	$db1 = new PDO('sqlite:'.$db_name);
	//データベースが存在しないとき
	if(!$ext){
		if(empty(trim($lans0)) == false && empty(trim($lsans0)) == false){
			//データベーステーブルの作成
			$result1=$db1->exec($query_c);
			//データ書き込みのsql文を準備
			$result2=$db1->prepare($query_ist);
			//パラメータをセット
			$result2->bindparam(1,$lexam);
			$result2->bindparam(2,$l_opt0);
			$result2->bindparam(3,$l_cate0);
			$result2->bindparam(4,$lans0);
			$result2->bindparam(5,$lsans0);
			//実行
			$result2->execute();
			print "$lexam "."$l_opt0"."★は★".$l_cate0."★".$lans0.":".$lsans0;
		}else{
			print "回答と回答(短縮)を記載してください";
		}
	//データベースが存在するとき
	}else{
	//抽出のsql文を準備
		$select_data=DataCheck($db1,$query_select2,$lexam,$l_opt0);
		//結果があるとき
		if($select_data){
			print "[既に登録してあります。]";
			$retstr="$lexam "."$l_opt0"."は".$select_data['category0'].",".$select_data['ans0'].":".$select_data['sans0'];
			print $retstr."";

			//ユーザー名に対する結果が存在しないとき
		}else{
			if(empty(trim($lans0)) == false && empty(trim($lsans0)) == false){
				//データ書き込みのsql文を準備
				$result2=$db1->prepare($query_ist);
				//パラメータをセット
				//一番目のパラメータに$lexamをセット
				$result2->bindparam(1,$lexam);
				//二番目のパラメータに$l_opt0をセット
				$result2->bindparam(2,$l_opt0);
				//三番目のパラメータに$l_cate0をセット
				$result2->bindparam(3,$l_cate0);
				$result2->bindparam(4,$lans0);
				$result2->bindparam(5,$lsans0);				
				//実行
				$result2->execute();
				print "[新規登録]";
				$retstr="$lexam "."$l_opt0"."は".$l_cate0.",".$lans0.":".$lsans0;
				print $retstr."";
			}else{
				print "回答と回答(短縮)を記載してください";
			}
		}
	}
	//データベースを閉じる。
	$db1=null;
}

```
###3．データの削除処理
(１)コマンドとオプションが存在するかチェック
(２)存在すれば、該当コマンドに対するレコードを削除し、
削除した旨のメッセージを表示。
(３)存在しない場合、存在しない旨のメッセージを表示。

```php

//削除のとき
if(isset($_POST['button2']) && empty(trim($lexam)) == false){
	//データベースを開く
	$db1 = new PDO('sqlite:'.$db_name);
	if($ext){
		if(DataCheck($db1,$query_select2,$lexam,$l_opt0)){
			$result_d=$db1->prepare($query_del);
			//一番目のパラメータに$lexamをセット
			$result_d->bindparam(1,$lexam);
			//二番目のパラメータに$l_opt0をセット
			$result_d->bindparam(2,$l_opt0);
			//実行
			$result_d->execute();
			print "$lexam "."$l_opt0"."を削除しました";
		}else{
			print "$lexam "."$l_opt0"."はありません";
		}
	}	
	//データベースを閉じる。
	$db1=null;
}
```

###4.参照処理
(１)選択したカテゴリに登録されてあるデータを表示



```php

//参照
if(isset($_POST['button3'])){
	
	$db1 = new PDO('sqlite:'.$db_name);
	$query_all="SELECT * FROM tbl_linux WHERE category0 = ?";

	if($ext){
		$result_a=$db1->prepare($query_all);
		//パラメータに$l_cate0をセット
		$result_a->bindparam(1,$l_cate0);
		//実行
		$result_a->execute();
		//検索結果が配列に格納する
		while($select_data=$result_a->fetch(PDO::FETCH_ASSOC)){
			print $select_data['exam0']." ".$select_data['opt0']."|".$select_data['category0']. "|" .$select_data['ans0']."|".$select_data['sans0']."</br>";	
			print "------------------------------------------------------------------------------------------------------"."</br>";
		}
	}	
	//データベースを閉じる。
	$db1=null;
}
?>

</html>
```

###5.ファイルの保存と、起動方法

エディタで保存するときは、文字コードをUTF-8で保存する。
ファイルの保存場所は
「xamppのインストールディレクトリ\htdocs\ファイル名.php」とする。

動作確認するには、Xamppコントロールパネルで「apatch」をスタートさせて
、ブラウザのurlに「http\://localhost/ファイル名.php」と入力すれば
確認ができる。

###6.動作確認
（１）コマンドの登録
入力後に登録ボタンを押す

![linux_command_resist1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/41e605e8-02da-926d-e3fe-cbf6d832ffce.jpeg)

(２)コマンドの登録
赤枠のように、登録したコマンドが表示される。

![linux_command_resist2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/2692dd4b-9755-98f8-e740-3b7a9743219c.jpeg)


(３)カテゴリー選択して、登録したコマンドが存在するか確認

![linux_command_resist_refar1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/e4cac710-3a50-06a5-030b-419d8bea5ca0.jpeg)

![linux_command_resist_refar2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/83ed57e3-f26d-1124-c72e-28c996ea70ad.jpeg)

赤枠の場所で登録されていることを確認。