PHPでフォーム( セキュリティー関係はまだ手付かずです。 )

変数のスコープ(グローバル、ローカル、スーパーグローバル)

グローバル変数

ローカル変数

それぞれの変数がどこで使えるか

(※スーパーグローバル変数はどこでも使えるようなので今回は割愛させていただきます)。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPのエラーに関して</title>
</head>
<body>
<h1>スコープの確認</h1>
<?php  /* ここの<?php ?>の中で定義した変数はグローバル変数。関数の中では使えない。*/
$a = 10;
$b = 20;
$ans1 = add($a,$b);
print '$ans1='.$ans1."<br>";
?>
<?php
print '$a='.$a."<br>";
print '$b='.$b."<br>";
?>
<?php
function add($x,$y){  /* 関数の中で定義した変数はローカル変数なので、

ここの関数の中でしか使えない。*/
$ans = $x $y;
return $ans;
}
/* ↓下記のように$a,$bと書くと『$a,$bが定義されていません。』というエラーが出ます。これは関数の中の変数なので、上で定義されている$a=10,$b=20とは全く関係ないものとして扱われるため。*/

function add2($a,$b){  /* 関数の中で定義した変数はローカル変数なので、

ここの関数の中でしか使えない。*/
$ans = $a $b;
return $ans;
}
?>

</body>
</html>

PHPで<form>タグのmethodにGETかPOST、actionに送り先のファイルを指定

ここではokuri.phpで入力した情報をuke.phpファイルに送ってます。
action="uke.php"でokuri.phpで入力した情報を受け取って表示してます。

okuri.php( uke.phpに送る情報を入力するページ )

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>春夏秋冬花かっぱ</title>
</head>
<body>
  <h1>入力した季節を表示します。</h1>
  <h2>お名前と調べる月(1~12)を入力してください。</h2>
    <form method="GET" action="uke.php">

<!--formタグのmethodに"GET(他にPOSTなど)"、actionで送信先の指定をする必要があり、今回は"uke.php"ファイルに。-->
    お名前<BR>
    <input name="name" type="text" size="40"><BR>

<!--name属性でどこのinputタグで入力された情報なのかを区別してます。actionで指定したページ(ここでは、uke.phpファイル)で、このname属性が必要になります。-->
    何月ですか?<BR>
    <input name="month" type="text" size="40"><BR><BR>

<!--type属性でinputタグを、一行テキストボックス・チェックボックスラジオボタン・実行ボタン・リセットボタン等に変化させれます。今回はtextです。-->
    <input type="submit" value="送信">

<!--type属性をsubmit、valueの値を"送信"のボタンにしてます。-->
    </form><BR>
</body>
</html>

  ⇩  

uke.php( okuri.phpで入力した情報を受け取るページ )

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
  <h1>月の季節を表示します。</h1>
  <BR>
  <?php
    $m = htmlspecialchars($_GET["month"]);  //ここの"month"がinputタグのname属性でname="month"と指定したもの。

 /* $m = $_GET["month"]が基本の形。htmlspecialchars( )関数をつけることで入力されたHTMLタグなどを機能させなくする。例:<font size="60" color="red">有<BR>田</font>を$m = $_GET["month"]の場合と $m = htmlspecialchars($_GET["month"])の場合の2パターンで入力して試してみましょう。*/
    print $m."月が入力されました<BR>\n\t";

    print htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でnme="name"と指定したもの。
    if(is_numeric($m)){
      switch($m){
      case 3:
      case 4:
      case 5:
      print $m."月は春ですよ";

      break;
      case 6:
      case 7:
      case 8:
      print $m."月は夏ですよ";

      break;
      case 9:
      case 10:
      case 11:
      print $m."月は秋ですよ";

      break;
      case 12:
      case 1:
      case 2:
      print $m."月は冬ですよ";

      break;

      default:
      print $m."月なんて月はありません。";
      break;
      }
    }else{
      print "真面目に入力してください。";
      }

?>

<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、# mysql -u root -p
Enter password: **********のこと。*/
$s = mysql_connect'localhost'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' $s )、コマンドプロンプトではmysql>use db1のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトでは、select * from tb*/
$sql = "select * from tb";
/* $rowに$sqlのクエリを発行する関数を実行した結果を代入。*/
$row = mysql_query($sql);
/* $recに$rowの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から) */
while($rec = mysql_fetch_array($row)){  /* 基本形は$rec = mysql_fetch_array($row);でwhile文を使うことで、$recに$rowの1行分のデータを取り出す関数を実行をデータがなくなるまで繰り返す。*/
print $rec['bang']."<br>";  
print $rec['uri']."<br>";
print $rec['tuki']."<br>";

}
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>
</body>
</html>

:2

okuri01.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>春夏秋冬花かっぱ</title>
</head>
<body>
<h1>入力した社員番号のデータを表示します。</h1>
<h2>お名前と調べる社員番号を入力してください。</h2>
<form method="GET" action="uke01.php">
お名前<BR>
<input name="name" type="text" size="40"><BR>
社員番号は?<BR>
<input name="syain" type="text" size="40"><BR><BR>
<input type="submit" value="送信">
</form><BR>
</body>
</html>

データベースの情報を使います。

カラム名bangurituki
データ型varchar(10)intint
値(value) A101 100 3
値(value) A102 200 3
値(value) A103 300 3

MySQLでデータベース名『db1』にカラム『bang』,『uri,『tukiで構成されたテーブル名『tb』を用意。

  ↓ データベースのことについては下記サイトが詳しいです。

データベースの作成 - MySQLの使い方

uke01.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>社員番号の値とデータベースのbangカラムの値を一致させ、そのbangの値の場所の情報を表示します。</h1>
<p>okuri01.phpのinput name="syain" type="text" size="40"に入力された値が、データベースdb1のテーブルtb1のカラムbangの値と一致させ、そのbangの値の場所の情報を表示させます。<BR><BR></p>
<BR>
<?php
$m = htmlspecialchars($_GET["syain"]);  //ここの"syain"がinputタグのname属性でname="syain"と指定したもの。
// $m = $_GET["syain"];
print $m."社員番号が入力されました。<BR>\n\t";  

print htmlspecialchars($_GET["name"])."さん"//ここの"name"がinputタグのname属性でname="name"と指定したもの。
// print $_GET["name"];

?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、 # mysql -u root -p
Enter password: ********** のこと。*/
$s = mysql_connect'localhost' 'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' , $s )、コマンドプロンプトではmysql>use db1のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトではselect * from tb*/
$sql = "select * from tb where bang=' ".$m." ' order by bang,uri";

/* ここは"select * from tb where bang=' "』で1区切り、『.$m.』で1区切り、『" 'order by bang, uri)"』で1区切り。$mがbangの値でデータ型がvarcharのため『' '』で囲む必要があるため、こういう記述の仕方になるんだと思われます。*/
print $sql."の情報を下記表示。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から) */
/* while($row = mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
} */
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

 

 okuri02.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>春夏秋冬花かっぱ</title>
</head>
<body>
<h1>入力した社員番号のデータを表示します。</h1>
<h2>お名前と調べる社員番号を入力してください。</h2>
<form method="GET" action="uke02.php">
お名前<BR>
<input name="name" type="text" size="40"><BR>
社員番号は?<BR>
<input name="syain" type="text" size="40"><BR><BR>
<input type="submit" value="送信">
</form><BR>
</body>
</html>

 htmlspecialcharsが無いと

htmlspecialcharsの本来の目的は”<”、”>”などの特殊文字をHTMLエンティティに変換して、ブラウザにタグでは無く文字としてその記号を表示させる事。

  • 文字セットのデフォルト値がPHPのバージョンによって異なるという大きな変更が過去にあった。
  • 使用頻度が多い割に関数名自体が長い。

といった理由から下記の関数を作ってしまったほうが良いようです。

function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

htmlspecialcharsについて詳しいサイト

uke02.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>okuri02.phpで社員番号を『 xxxx'or'1'='1 』と入力。</h1>
<BR>
<?php
$m = $_GET["syain"];  //ここの"syain"がinputタグのname属性でname="syain"と指定したもの。
// $m = htmlspecialchars($_GET["syain"]);
print $m."社員番号が入力されました。<BR>\n\t";

print htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でname="name"と指定したもの。
// 基本形はprint $_GET["name"];

?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、# mysql -u root -p
Enter password: ********** のこと。*/
$s = mysql_connect'localhost'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' $s )、コマンドプロンプトではmysql>use db1;のこと。*/
mysql_select_db'db1'$s );
/* コマンドプロンプトではselect * from tb*/
$sql = "select * from tb where bang=' ".$m." ' order by bang,uri";

/* ここは"select * from tb where bang=' "』で1区切り、『.$m.』で1区切り、『" ' order by bang, uri"』で1区切り。$mがbangの値でデータ型がvarcharのため『' '』で囲む必要があるため、こういう記述の仕方になるんだと思われます。*/
print $sql."の情報を下記表示。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から) */
while$row = mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
}
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

insert文

okuri03.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>春夏秋冬花かっぱ</title>
</head>
<body>
<h1>DBの練習。</h1>
<h2>データを入力してください。</h2><BR>
<form method="GET" action="uke03.php">
お名前<BR>
<input name="name" type="text" size="40"><BR>
社員番号は?<BR>
<input name="syain" type="text" size="40"><BR>
売上は?<BR>
<input name="uri" type="text" size="40"><BR>
月は?<BR>
<input name="tuki" type="text" size="40"><BR>
<input type="submit" value="送信">
</form><BR>
</body>
</html> 

uke03.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>データベースの練習。insert文</h1>

<BR>
<?php
$m = $_GET["syain"];  //ここの"syain"がinputタグのname属性でname="syain"と指定したもの。
// $m = $_GET["syain"];
print $m."社員番号が入力されました。<BR>\n\t";

$name = htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でname="name"と指定したもの。
// 基本形はprint $_GET["name"];
$uri = htmlspecialchars($_GET["uri"]);  //ここの"uri"がinputタグのname属性でname="uri"と指定したもの。
// 基本形はprint $_GET["uri"];
$tuki = htmlspecialchars($_GET["tuki"]);  //ここの"tuki"がinputタグのname属性でname="tuki"と指定したもの。
// 基本形はprint $_GET["tuki"];

?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、# mysql -u root -p
Enter password: **********のこと。*/
$s = mysql_connect'localhost' 'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' , $s )、コマンドプロンプトではmysql>use db;のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトではselect * from tb; */
$sql = "insert into tb values( ' ".$m" ', $uri, $tuki )";

/* ここは"insert into tb values(' "』で1区切り、『.$m.』で1区切り、『" ', $uri, $tuki )"』で1区切り。$mがbangの値でデータ型がvarcharのため『' '』で囲む必要があるため、こういう記述の仕方になるんだと思われます。*/
print $sql."の情報をテーブルtbに追加。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から) */
/* while($row=mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
} */
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

update文

okuri04.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>データベースの練習。insert文</h1>

<BR>
<?php
$m = $_GET["syain"];  //ここの"syain"がinputタグのname属性でname="syain"と指定したもの。
// $m = $_GET["syain"];
print $m."社員番号が入力されました。<BR>\n\t";

$name = htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でname="name"と指定したもの。
// 基本形はprint $_GET["name"];
$uri = htmlspecialchars($_GET["uri"]);  //ここの"uri"がinputタグのname属性でname="uri"と指定したもの。
// 基本形はprint $_GET["uri"];
$tuki = htmlspecialchars($_GET["tuki"]);  //ここの"tuki"がinputタグのname属性でname="tuki"と指定したもの。
// 基本形はprint $_GET["tuki"];

?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、# mysql -u root -p
Enter password: ********** のこと。*/
$s = mysql_connect'localhost'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数('データベース名',$s)、コマンドプロンプトではmysql>use db;のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトではselect * from tb; */
$sql ="insert into tb values(' ".$m." ', $uri, $tuki )";

/* ここは『"insert into tb values(' "』で1区切り、『.$m.』で1区切り、『" ', $uri, $tuki )"』で1区切り。$mがbangの値でデータ型がvarcharのため『' '』で囲む必要があるため、こういう記述の仕方になるんだと思われます。*/
print $sql."の情報でテーブルtbの中の修正。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から)*/
/* while($row=mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
} */
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

uke04.php


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>データベースの練習。update文</h1>

<BR>
<?php
$m = $_GET["syain"];  //ここの"syain"がinputタグのname属性でname="syain"と指定したもの。
// $m = $_GET["syain"];
print $m."社員番号が入力されました。<BR>\n\t";

$name = htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でname="name"と指定したもの。
// 基本形は$name = $_GET["name"];
$uri = htmlspecialchars($_GET["uri"]);  //ここの"uri"がinputタグのname属性でname="uri"と指定したもの。
// 基本形は$uri = $_GET["uri"];
$tuki = htmlspecialchars($_GET["tuki"]);  //ここの"tuki"がinputタグのname属性でname="tuki"と指定したもの。
// 基本形は$tuki = $_GET["tuki"];
?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは、# mysql -u root -p
Enter password: ********** のこと。*/
$s = mysql_connect'localhost'root' 'root' or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' , $s )、コマンドプロンプトではmysql>use db1;のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトではselect * from tb; */
$sql ="update tb set bang=' ".$m." ' ,uri = $uri ,tuki = $tuki where bang =' ".$m." ' or tuki = $tuki ";

/* ここは"update tb set bang=' "』で1区切り、『.$m.』で1区切り、『" ',uri = $uri, tuki = $tuki where bang = ' "』で1区切り、『.$m.』で1区切り、『" ' or tuki = $tuki "』で1区切り。$mがbangの値でデータ型がvarcharのため『' '』で囲む必要があるため、こういう記述の仕方になるんだと思われます。*/
print $sql."の情報でテーブルtbの中のbangが$mのものを修正する。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から)*/
/* while($row=mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
}*/
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

delete文

okuri05.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>春夏秋冬花かっぱ</title>
</head>
<body>
<h1>DBの練習。</h1>
<h2>データを入力してください。</h2><BR>
<form method="GET" action="uke04.php">
お名前<BR>
<input name="name" type="text" size="40"><BR>
社員番号は?<BR>
<input name="syain" type="text" size="40"><BR>
売上は?<BR>
<input name="uri" type="text" size="40"><BR>
月は?<BR>
<input name="tuki" type="text" size="40"><BR>
<input type="submit" value="送信">
</form><BR>
</body>
</html>

uke05.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受取ページ</title>
</head>
<body>
<h1>データベースの練習。delete文</h1>

<BR>
<?php
$m = $_GET["syain"];
// $m = $_GET["syain"];
print $m."社員番号が入力されました。<BR>\n\t";

$name = htmlspecialchars($_GET["name"])."さん";  //ここの"name"がinputタグのname属性でname="name"と指定したもの。
// 基本形は$name = $_GET["name"];
$uri = htmlspecialchars($_GET["uri"]);  //ここの"uri"がinputタグのname属性でname="uri"と指定したもの。
// 基本形は$uri = $_GET["uri"];
$tuki = htmlspecialchars($_GET["tuki"]);  //ここの"tuki"がinputタグのname属性でname="tuki"と指定したもの。
// 基本形は$tuki = $_GET["tuki"];
?>
<BR>
<?php
/* データベースに接続する関数( 'ホスト名' , 'ユーザー名' , 'パスワード' )、コマンドプロンプトでは# mysql -u root -p
Enter password: **********のこと。*/
$s = mysql_connect'localhost'root' 'root' ) or die'失敗' );
echo '接続成功<BR>';
/* 使うデータベースを選択する関数( 'データベース名' $s )、コマンドプロンプトではmysql>use db1;のこと。*/
mysql_select_db'db1' $s );
/* コマンドプロンプトではselect * from tb; */
$sql "delete from tb where bang=' ".$m." ' or tuki=$tuki ";
print $sql."の情報をテーブルtbに追加。"."<br>";
/* $dataに$sqlのクエリを発行する関数を実行した結果を代入。*/
$data = mysql_query($sql);
/* $rowに$dataの1行分のデータを取り出す関数を実行した結果を代入。(カラム名がキーになった連想配列から) */
/* while($row=mysql_fetch_array($data)){
print $row['bang']." ";
print $row['uri']." ";
print $row['tuki']."<br>";
} */
/* データベースの接続を閉じる関数 */
mysql_close($s);

?>

</body>
</html>

広告を非表示にする