PHP

サンプル:ソックスパターン

今まで学習した復習をかねて、プログラムを作ってみました。
ソックスを編むためのプログラムです。最初は不安でしたが、何足も編んで安心しました。
実践だといろいろな問題が出てきて、苦労した部分もありますが、とても勉強になりました。
主として、次のようなことをやってみました。

  1. フォームで入力した画面が消えないようにした
  2. エラーチェックをする関数を作った。チェック内容は「データが入っていない」「入力が全角だったら」の2つ。
    全角の場合は、半角に変換するようにした。
  3. 関数を使って、ある数値の倍数になるようにした。

カラム(項目)を変更する

カラム(項目)のデータ型を変更する

カラムのデータ型は変更することができます。ただし、データ型が対応可能でない場合はエラーになります。

書式
ALTER TABLE テーブル名 MODIFY カラム名 データ型;

カラム「name」は10文字の設定になっています。これを30文字に変更してみます。
次のように入力します。

ALTER TABLE shain MODIFY name VARCHAR(30);
結果

sql15
30に変更されました!

カラムを後ろに追加する

新しい項目を最後の位置に追加します。

書式
ALTER TABLE テーブル名 ADD カラム名 データ型>;

生年月日のカラムをDATETIME型で追加してみます。

ALTER TABLE shain ADD birth DATETIME;
結果

一番下に追加されました。
sql16

生年月日を含めた新しいレコードを挿入してみます。

INSERT INTO shain VALUES('08','香山雄二',37,'1979-08-20');
【結果】

sql17

カラムを先頭に追加する

新しい項目を先頭の位置に追加するには、FIRSTを加えます。

書式
ALTER TABLE テーブル名 ADD カラム名 データ型 FIRST>;

カラムを任意の位置に追加する

新しい項目を先頭の位置に追加するには、加える位置のカラムを追加します。

【書式】
ALTER TABLE テーブル名 ADD 追加するカラム名 データ型 AFTER 前のカラム名>;

カラムnyusya(入社年月日)を、DATE型でname(名前)の後ろに追加してみます。

ALTER TABLE shain ADD nyusya date AFTER name;>
【結果】

sql18

データの型

データベースのテーブルには、カラムで指定した形式のデータしか入力できません。
データの形式には、整数型、通貨型、文字列型、日付・時刻型、などいろいろな型があります。

下記に挙げるのは一例です。
MySQL のリファレンスに詳細があります。

数値型の種類

TINYINT -128~127 1バイト整数
SMALLINT -32,768~32,767 2バイト整数
MEDIUMINT -8,388,608~8,388,607 3バイト整数
INT -2,147,483,648~2,147,483,647 4バイト整数
FLOAT -9,223,372,036,854,775,808~
9,223,372,036,854,775,807
単精度浮動小数点
DOUBLE -3.402823466E+38~-1.175494351E-38 倍精度浮動小数点

文字型の種類

CHAR 255文字まで 固定長の文字列
VARCHAR 1~65535バイト 可変長文字列
TEXT 65535文字まで 長い文字列
LONGTEXT 4294967295まで とても長い文字列

日付・時刻型

DATETIME 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 日付と時刻
DATE 1000-01-01 ~ 9999-12-31 日付
YEAR 1901~2155(4桁) 1970~2069(2桁)
TIME -838:59:59 ~ 838:59:59 時刻
  • 日付・時刻型のデータはシングルコーテーション、もしくはダブルコーテーションで囲みます。
  • MySQL では、日付は「YYYY-MM-DD」時刻は「HH:MM:SS」の形式で入力します。

テーブル作成とデータ入力

テーブルを作る

SQLでテーブルを作成するには、CREATE TABLE 文を使います。
テーブル名に続いて、カラム名(項目名)とデータ型をスペースで間を開けて記述します。カラムの間はカンマで区切ります。

書式
CREATE TABLE (カラム名1 データ型1, カラム名2 データ型2 ...)

新しく社員名簿を作ってみます。SQLのテキストフィールドに下記コードを入力します。

CREATE TABLE shain (id VARCHAR(10),name VARCHAR(10),age INT);

mydb の下に shain テーブルができました。

sql5

すべてのテーブルを表示する

データベースに存在するすべてのテーブルを表示するには、SHOW TABLES を使います。

書式
SHOW TABLES;
結果

sql6

テーブルの構造を確認する

テーブルのカラム構造は DESC で表示できます。

書式
DESC テーブル名;

次のように入力してみました。

DESC shain;
結果

sql9

テーブルにデータを挿入する

テーブルにデータを挿入するには、 INSERT を使います。

書式
INSERT INTO テーブル名 VALUES(データ1,データ2...);

次のように入力してみました。

INSERT INTO shain VALUES('01','峯太郎',58);
結果

sql10

カラム名を指定してデータを挿入する

カラムの順番に関係なく、カラム名を指定して挿入することができます。

INSERT INTO テーブル名 (カラム名 , カラム名 ,.......)
       VALUES(データ , データ ,.......);

次のように順番を変えて入力しました。

INSERT INTO shain(name,id,age) VALUES('高倉賢治','04',56);
結果

一度にデータを入力する

一度に複数レコードのデータを入力することができます。

書式
INSERT INTO テーブル名 (カラム名1 , カラム名2 ,...) 
  VALUES(データ1 , データ2 ,...),(データ1 , データ2 ,...),...;

では、次のようにデータを入力してみます。

INSERT INTO shain(id,name,age) VALUES('005','宍戸譲二',35), 
('006','石原雄二',37), ('007','島倉ちよ',28);
結果

sql12

データを表示する

カラムのデータを表示させるには、SELECT を使います。

書式
SELECT カラム名1, カラム名2,... FROM テーブル名;

名前と年齢を表示させたいと思います。次のように入力してみます。

SELECT name, age FROM shain;
結果

すべてのデータを表示する

すべてのレコードを入力するには 「SELECT * FROM テーブル名」を使います。
次のように入力してみました。

SELECT * FROM shain;
結果

sql14

SQLの入り口に立ったばかりですが、なかなか面白いです。
コマンドがすべてなんですね。ふむふむ。

SQLを使おう

桐やAccessのようなデータベースソフトを使ってきましたので、SQL を知らずに過ごしました。
MySQL を使うにおいては、SQL言語は避けて通れないようです。

SQLは、「Structured English Query Language」(構造化英文問い合わせ言語)として1970年代にIBM社で開発されました。その後、ISOやJISによって規格化されたことにより普及が進み、現在ではリレーショナルデータベースの事実上の標準言語となっているそうです。

SQLには、大まかに次のような機能があります。

  1. データを格納するテーブルなどデータベースの構造を定義します。
  2. 追加・更新・削除など、データベースの操作を行います。
  3. データベースの制御を行います

SELECT文でデータを選択

SELECT文とはデータベースのテーブルからデータを検索し、取得するSQLのことです。
SELECT文の基本はSELECTのあとに表示したいカラムをカンマで区切って並べ、FROM  のあとにテーブル名を記述します。

phpMyAdmin にアクセスして、サイドメニューからデータベースを選択します。(mydb)
[SQL]タブをクリックします。
SQL文を入力して「実行」をクリックします。

sql1

次のような画面に切り替わります。
sql2

INSERT文でデータを挿入しよう

INSERT文は、データを追加したい表の列とそれに対応した値を順に指定します。

構文
INSERT INTO テーブル名 (列名 , 列名 ,.......)
       VALUES(データ , データ ,.......);

meibo テーブルに、新しいデータを挿入するには、SQLのテキストフィールドに次のように入力します。

INSERT INTO meibo (id,name)
       VALUES (105,'さざえ');
結果

sql3

無事さざえさんの名前が追加されていました~
sql4

MySQLでデータベース を作ろう

MySQLとは

MySQLとは、Oracle社が開発・公開しているリレーショナルデータベース管理システム(RDBMS)の一つです。
最も普及している人気の高いDBMSの一つで、オープンソースソフトウェアとして公開されており、誰でも自由に入手、利用、改変、再配布などができます(IT用語辞典より)
特徴として次のようなものがあげられます。

  1. 動作が速い
  2. オープンソース
  3. 多くのOSで動作する
  4. 多くのプログラム言語が対応している
  5. 無償、および有償の2つの形態がある

MySQLでデータベースを作成

XAMPP のコントロールパネルで、「MySQL」をスタートさせます。
この学習で使うMySQLのバージョンは [5.5.32]です。

20160704-4

[Admin]ボタンをクリックします。プラウザから phpMyAdmin が起動します。

160704-5

下のほうに次のようなメッセージが出ます。これはパスワードが設定されてない場合です。

160704-6

  1. パスワードはユーザーの「特権を編集」から設定ができます
    sql7
  2. 上記の設定が終わったら「phpMyAdmin」フォルダの「config.inc.php」をテキストエディタで開いて、パスワードを設定します。
    sql8

パスワードに関する詳しい説明はリファレンスにあります。

データベースを作成します。

左側のテキストボックスに、データベース名を入力し、右側(照合順序)のコンボボックスから「utf8_general_ci」を選択し「作成」をクリックします。
160704-7

テーブルを作成しよう

サイドバーの「mydb」をクリックすると、右側にテーブル作成画面が表示されます。
テーブル名とカラム数(項目の数)を入力します。
テーブル名には「meibo」、カラム数には「2」を入れてみます。
右端の「実行」をクリックします。

次のような画面に変わります。ここではデータの構造を設定します。
「id」には INT型、「name」には text型を設定してみます。最後に「保存」をクリックします。

160704-9

サイドバーの「mydb」をクリックして展開すると、次のようにテーブルが作られているのが確認できます。
160704-10

データを入力しよう

「挿入」タブをクリックします。
右側のテキストフィールドに、データを入力して「実行」をクリックします。
id には「100」を、name には「千絵」を入れてみました。
「表示」タブをクリックすると、入力したデータが確認できます。
160704-11

同様の操作(挿入から)で、次々とデータを入れることができます。
160704-12

書式 sprintf

書式を整える関数 sprintf

sprintf()関数は、フォーマットした文字列を変数に書き出します。
arg1、arg2、++ パラメタは、メインの文字列のパーセント(%)サインに挿入されます。
この関数は “1ステップづつ”動きます。最初の%サインでは、arg1が挿入され、 2番目の%サインでは、arg2が挿入される、など。

構文
sprintf(format,arg1,arg2,arg++)
サンプル

PHPの公式サイトから借りてきました

<?php
$n =  43951789;
$u = -43951789;
$c = 65; // ASCII コードの 65 は 'A' です

// %% に注目しましょう。これは、リテラル '%' を文字として出力します
printf("%%b = '%b'\n<br />", $n); // 2 進表現
printf("%%c = '%c'\n<br />", $c); // ascii 文字を表示します。chr() 関数と同じです
printf("%%d = '%d'\n<br />", $n); // 標準の整数表現
printf("%%e = '%e'\n<br />", $n); // 科学記法
printf("%%u = '%u'\n<br />", $n); // 正の整数の、符号なし整数表現
printf("%%u = '%u'\n<br />", $u); // 負の整数の、符号なし整数表現
printf("%%f = '%f'\n<br />", $n); // 浮動小数点表現
printf("%%o = '%o'\n<br />", $n); // 8 進表現
printf("%%s = '%s'\n<br />", $n); // 文字列表現
printf("%%x = '%x'\n<br />", $n); // 16 進表現 (小文字)
printf("%%X = '%X'\n<br />", $n); // 16 進表現 (大文字)

printf("%%+d = '%+d'\n<br />", $n); // 正の整数に符号指定子を使用
printf("%%+d = '%+d'\n<br />", $u); // 負の整数に符号指定子を使用
?>
実行

日付の書式

月と日を2桁(ゼロを補う)で表示してみます。

サンプル
<?php
$date = sprintf('%04d年 %02d月 %02d日',2016,7,3);
?>

<?php
print("月と日を2桁で表示: ".$date);
?>
実行

関数 function

PHPのスクリプトでは、あらかじめ定義されている多くの関数を使うことができます。関数を知れば知るほど、開発の効率が向上します。
標準で用意されているほかに、ユーザーが独自で関数を作ることができます。これをユーザー定義関数といいます。よく使うものなどは関数を定義しておくと便利です。
※ PHPの関数一覧はこちら(関数リファレンス)にあります。

ユーザー定義関数

【書式】

function 関数名() {
  処理に必要なプログラム
  }

結果の値が必要な場合には returnステートメントを使って値を返します。これを戻り値(返し値)と呼びます。
【サンプル】

<?php
//足し算の結果を返す関数
function tasizan($num1, $num2) 
    {
      return $num1 + $num2;
	}
   //ここから関数を呼び出す部分 
   $n1 = 100;
   $n2 = 200;
   echo "$n1 + $n2 = " ;
   echo tasizan($n1,$n2);	
?>
実行

引数の参照渡し

引数にアンパサンド(&)をつけると、引数を参照渡しすることができます。参照渡しした引数は、関数の処理の中で元の引数の値を変更することができます。
【サンプル】
次の例では引数に「まっこい」を指定して関数を呼び出していますが、関数の中で「ジャンリュック」に変わりました。こんなんでいいのかな?(自信ないけど)

<?php
	   function mypet(&$name) 
	     {
		    $name = "ジャンリュック";
		 }
		 
	   //関数を呼び出す
	   $dogname = "まっこい";
	   echo ("初代のわんこは $dogname<br><br>");
	   mypet($dogname);
	   echo ("2代目わんこは $dogname");
?>
実行

繰り返し while

while

while文は繰り返し処理を実行する前に条件式を評価します。
評価された条件式が true の場合は、カッコ({)以下のコードを実行し、false の場合は、実行せずスキップします。
途中でループから抜け出る場合は break を使います。

書式
while (式) {
   処理スクリプト
} 
サンプル

下記サンプルでは処理の後に、$i の値を1つ増加し、$i の値が5になったときに終わります。

<?php
	$i = 0;
	while ($i < 10) {
		if ($i == 5) {
			echo "$i 回目<br>";
			break;
		}
		echo "$i 回目<br>";
		$i++;
	}
?>

実行

do while

do while文は、最後に条件式が評価されます。最低でも1回はループの中に入ることになります。

サンプル
<?php
	$i = 0;
	do {
		if ($i == 5) {
			echo "$i 回で終わります<br>";
			break;
		}
		echo "$i 回目のループ<br>";
		$i++;
	}while ($i < 10)
?>

実行

for文

for文は、ループに入る前に初期値式を実行し、条件式で評価します。
条件に合えば処理を行い、増減式を実行してから処理に戻ります。
条件が合わない場合はループを実行しません。

サンプル
<?php
	   $name = array("Jean","Emily","Mccoy");//配列を3つ用意
	   for($i = 0; $i < 3 ; $i++) {          //条件と増減
	      echo ("$name[$i]<br>");            //出力
	   }
?>
実行

条件分岐 switch

switch を使う

switch文は、同じ変数を繰り返し評価する場合に、効率的な条件文を記述することができます。
それぞれのcase値と比較し、該当する値が見つかれば break に至るまで処理を実行します。

書式
switch (制御式) {
case 値1:
    文
    文
    ………
    break;
case 値2:
    文
    文
    ………
    break;
default:
    文
}
サンプル
<?php
	$age = 49;
	switch ($age) {
	     case "100": 
		    echo ("100歳です やったね");
			break;	
		 case "50":
		    echo ("50歳です。もっとがんばろ");
			break;	
		 default:
		    echo ("$age 歳です");
	}
?>

実行