<学習する内容>
Webサーバへの送信機能(POSTメソッド)を使って得意先情報を登録する動きを理解します。
1)得意先データを登録するプログラムを作成する
PHPのHTTP POSTメソッドを使ってデータ入力の機能を追記します。
下記のサンプルプログラムをコピーもしくはダウンロードし指定のフォルダーに配置してください。
必ずDBのパスワードを********から設定したパスワードに変更してください
ファイル名:customerlist2_6.php
配置先URL:
http://localhost/customerlist2_6.php
<?php
//DBへの接続
$host = 'localhost'; //サーバ名
$user = 'root'; //ユーザ名
$pass = '********'; //DBのパスワード(自環境のパスワードに書き換えのこと)
$dbnm = 'sales'; //データベース名
$conn = mysqli_connect($host,$user,$pass,$dbnm) or die("er 接続できません");
//データの受信
$fnc = filter_input(INPUT_POST, 'fnc');
$set_customerCode = filter_input(INPUT_POST, 'set_customerCode');
$set_customerName = filter_input(INPUT_POST, 'set_customerName');
$set_zipcode = filter_input(INPUT_POST, 'set_zipcode');
$set_address1 = filter_input(INPUT_POST, 'set_address1');
$set_address2 = filter_input(INPUT_POST, 'set_address2');
//データ有無チェック
$mess = null; //$messのリセット(これを定義しないとwarning)
if(isset($fnc)){
if(empty($set_customerCode)){
$mess = '得意先コードが未登録です。';
if(empty($set_customerName)){
$mess = '得意先コードと得意先名が未登録です。';
}
}else{
if(empty($set_customerName)){
$mess = '得意先名が未登録です。';
}else{
$set_customerName = mb_convert_kana($set_customerName,'AKS'); //文字の全角化
$set_customerName = str_replace(' ','',$set_customerName); //空白をとる
$set_customerName = "'$set_customerName'"; //varcharの変数を"''"囲む
}
}
if(empty($set_zipcode)){
$set_zipcode = 'null'; //データがなければ'null'を代入
}else{
$set_zipcode = "'$set_zipcode'";
}
if(empty($set_address1)){
$set_address1 = 'null'; //データがなければ'null'を代入
}else{
$set_address1 = "'$set_address1'";
}
if(empty($set_address2)){
$set_address2 = 'null'; //データがなければ'null'を代入
}else{
$set_address2 = mysqli_real_escape_string($conn,$set_address2);
$set_address2 = "'$set_address2'";
}
}
//データ登録
if(empty($mess)){ //データチェックで問題がない($messに何もデータがない)
if($fnc == 1){ //新規登録
//重複チェック
$sql="select customerCode from Mcustomer where customerCode = $set_customerCode;";
$res = mysqli_query($conn,$sql) or die("エラー $sql");
$row = mysqli_fetch_array($res);
if(isset($row)){
$customerCode_chk = $row["customerCode"];
}
if(!isset($customerCode_chk)){
$sql = "insert into Mcustomer
(
customerCode
,customerName
,zipcode
,address1
,address2
) values (
$set_customerCode
,$set_customerName
,$set_zipcode
,$set_address1
,$set_address2
)
;";
mysqli_query($conn,$sql) or die ("error $sql");
}
}
if($fnc == 2){ //更新登録
$sql = "update Mcustomer set
customerName = $set_customerName
,zipcode = $set_zipcode
,address1 = $set_address1
,address2 = $set_address2
where customerCode = $set_customerCode
;";
mysqli_query($conn,$sql) or die ("error $sql");
}
}
echo <<<EOT
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="/style.css" type="text/css">
<title>得意先一覧表</title>
</head>
<body>
得意先一覧表 {$mess}<br>
<table bgcolor="#a9a9a9" cellspacing="1px" style="font-size:12px;" >
<tr bgcolor="#D3D3D3" style="height:24px;" align="center">
<td width="90">得意先コード</td>
<td width="200">得意先名</td>
<td width="70">郵便番号</td>
<td width="200">住所1</td>
<td width="200">住所2</td>
<td width="60">登録</td>
</tr>
<tr bgcolor="white" style="height:24px;" align="left">
<form method="POST" action="{$_SERVER['PHP_SELF']}">
<input type="hidden" name="fnc" value="1">
<td>
<input type="text" name="set_customerCode" style="width:98px;">
</td>
<td>
<input type="text" name="set_customerName" style="width:198px;">
</td>
<td>
<input type="text" name="set_zipcode" style="width:68px;">
</td>
<td>
<input type="text" name="set_address1" style="width:198px;">
</td>
<td>
<input type="text" name="set_address2" style="width:198px;">
</td>
<td>
<input type="submit" value="新規" style="width:60px;">
</td>
</form>
</tr>
EOT;
//DBからデータを抽出
$sql = "select customerCode,customerName,zipcode,address1,address2 from Mcustomer;";
$res = mysqli_query($conn,$sql) or die("エラー $sql");
while($row = mysqli_fetch_array($res)){ //while(){ ~ }繰り返し処理
$customerCode = $row["customerCode"];
$customerName = $row["customerName"];
$zipcode = $row["zipcode"];
$address1 = $row["address1"];
$address2 = $row["address2"];
echo <<<EOT
<tr bgcolor="white" style="height:24px;" align="left">
<form method="POST" action="{$_SERVER['PHP_SELF']}">
<input type="hidden" name="fnc" value="2">
<input type="hidden" name="set_customerCode" value="{$customerCode}">
<td width="100">
{$customerCode}
</td>
<td>
<input type="text" name="set_customerName" style="width:198px;" value="{$customerName}">
</td>
<td>
<input type="text" name="set_zipcode" style="width:68px;" value="{$zipcode}">
</td>
<td>
<input type="text" name="set_address1" style="width:198px;" value="{$address1}">
</td>
<td>
<input type="text" name="set_address2" style="width:198px;" value="{$address2}">
</td>
<td>
<input type="submit" value="修正" style="width:60px;">
</td>
</form>
</tr>
EOT;
} //← 繰り返し処理の }
echo <<<EOT
</table>
</body>
</html>
EOT;
?>
<解説>
116行目から136行目は<form> ~ </form>
<input type="hidden" name="fnc" value="1">
変数fncの値を「1」とする。(新規登録として定義する)
<input type="text" name="set_customerCode">
ここのinputの欄で入力されたデータは変数set_customerCodeとして送信
他のname="set_******" も同様
151行目から172行目は<form> ~ </form>
<input type="hidden" name="fnc" value="2">
変数fncの値を「2」とする。(更新として定義している)
<input type="hidden" name="set_customerCode" value="{$customerCode}">
プライマリーキーとして送信(where句として利用する)
各value="$*****"はselect文ので抽出されたデータを表示
10行目から16行目
$fnc = filter_input(INPUT_POST, 'fnc'); 変数$fncのデータの受け取り
他の$**** = filter_input(INPUT_POST,***);も同様
18行目から51行目
受け取ったデータのチェック
issetは$fncにデータがセットされているかの条件式です。(セットされていればチェックを実行)
$mess = null; データを初期化(このようにデータを定義しないとwarningが表示されます。)
if文は()で条件を記述し、条件の沿った処理内容を{ ~ }で囲ってます
empty()は空、データがnull、「0」といった場合正となり{ ~ }の処理がなされます
!empty()は逆でデータが入った状態であるとなります。ただし0のデータがあっても空とみなします。
他、strlen()は入っているデータの長さ(桁)があるという意味になります。よってデータが入っている条件として利用されます。
$set_customerName = mb_convert_kana($set_customerName,'AKS');ですが英数字、カナ、空白を全角にします。
例えば、ABC商会とABC商会同じ会社でもDB的には別となります。本サイトではすべて全角としております。
A:英数字を全角化
K:カナを全角化
S:半角の空白を全角化
$set_customerName = str_replace(' ','',$set_customerName);はスペースを除去してます。
例えば、ABC商会株式会社とABC商会 株式会社と入力する場合もあります。本サイトでは空白がない登録を統一化しています。
尚' 'の部分ですが、全角の空白記載してます。これを''(何もない)に変換してます。
if(empty($set_customerCode))は、プライマリーキーであり無いとSQLでエラーになるため
$set_customerCodeはそもそも得意先名がないと登録の意味がありません
これら2つは$messで警告メッセージを代入し表示させます
他の$set_*********は、文字列なのでデータがないとSQLでエラーとなります。よってデータのないときは'null'を代入します。
$set_customerCode = null; これはデータが何も代入されていない
$set_customerCode = 'null'; これはnullという文字が代入されている
データがあるときは「'」で囲わないといけないので"'$set_*******'"を代入してます。
mysqli_real_escape_stringとは、sql文のデータの中に「'」が入っている場合エラーになります。
例)得意先名はCOMPANY'sとします。 そうなるとcustomerName = 'COMPANY's' となり「'」が重なってしまいます。
これを退避させるコマンドがmysqli_real_escape_string()です。
企業名やブル名で使われことがあるのでcustomerNameとaddress2に適用させました。
53行目から90行目
DBへのデータ登録のSQL文になります
53行目から56行目はデータの有無をチェック
データがなければinsert処理、データがあれば処理せずアラート($mess)に登録し表示させます。
60行名から62行目にif(isset($row)){ }の記述があります。これは$rowの中にデータがセットされているかどうかを判定してます。
セットされていれば、$row["customerCode"]のデータを$customerCode_chkに代入します。この判定をしないと、今回のPHPのバージョン(PHP8)では
エラーと判定さて下記の警告文が表示されます。
Warning: Trying to access array offset on value of type null in C:
mpp\htdocs\chk.php on line 61
これはデータのない配列データにNULLをセットしようしているためです。
※配列は、2.11章で解説しております。
変数$fncが1の場合は、insert文、2の場合はupdate文して処理を分けてます。
次はSQLのon duplicate key updateを使って簡素化します。
得意先登録SQL Duplicate