WebプログラミングU PHP

 目次へ 前へ 次へ

2015/6/23 久米

 

 

3 PHP応用

3.2 データベースとフォーム投稿

3.2.1 基本手順(プリペアドステートメント)

PHP手順
SELECT文
発行例
INSERT, UPDATE, DELETE文
発行例
1. MySQLに接続する。 $con=mysqli_connect("localhost", "web2", "771", "web2");
2. SQL文を組み立てる。
 後から代入箇所を?とする
$sql="SELECT title, artist, point FROM ranking
WHERE artist=? AND point>=?
ORDER BY point DESC"
;
3.ステートメント(指示文)を用意。 $stmt=mysqli_prepare($con, $sql);
4.ステートメントに変数をバインド。
 ?の箇所に順番に
 sは文字列、iは整数の意味
mysqli_stmt_bind_param($stmt, 'si', $artist, $point);
$artist=なにか指定;
$point=なにか指定;
5.ステートメントを実行する。 $rst=mysqli_stmt_execute($stmt);
6.selectの場合、結果セットを取得し
7.結果を連想配列に変換し処理する。
メモリ開放(早く開放できる)
$rst=mysqli_stmt_get_result($stmt);
while ($row=mysqli_fetch_array($rst)) {
//
}
mysqli_free_result($rst);
//5の戻り値を if($rst) でチェック
8.ステートメントを閉じる mysqli_stmt_close($stmt);
9. MySQLとの接続を閉じる
(自動切断するので省略可能)
mysqli_close($con);

 

 

3.2.1 SELECT

  1. select.html:フォーム投稿にてartist、pointの値を送信し、
  2. select.php:phpページで受けて、プリペアドステートメントにバインドする。
検索フォーム
select.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>select</title>
</head>
<body>
<h1>ランキング検索</h1>
<form method="post" action="select.php">
アーティスト前方一致:<input type="text" name="artist"><br>
ポイント以上:<input type="text" name="point">以上<br>
<input type="submit" name="sub" value="検索">
</form>
</body>
</html>
select.php
<?php
if(!isset($_POST['sub'])) exit("Access Error.");

$artist=$_POST['artist']."%";
$point=$_POST['point'];
if($point=="")$point=0;

$con=mysqli_connect("localhost", "web2", "771", "web2");
$sql="SELECT title, artist, point FROM ranking WHERE artist LIKE ? AND point>=? ORDER BY point DESC";
$stmt=mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'si', $artist, $point);
mysqli_stmt_execute($stmt);
$rst=mysqli_stmt_get_result($stmt);

$m="<table border='1' cellspacing='0' cellpadding='2'>";
$m.="<tr bgcolor='#CCCCCC'><td>順位</td><td>タイトル</td><td>アーティスト</td><td>ポイント</td></tr>";
$juni=0;
while ($row=mysqli_fetch_array($rst)) {
    $juni=$juni+1;
    $m.="<tr><td>".$juni."</td>";
    $m.="<td>".$row["title"]."</td>";
    $m.="<td>".$row["artist"]."</td>";
    $m.="<td>".$row["point"]."</td></tr>";
}
$m.="</table>";

mysqli_free_result($rst);
mysqli_stmt_close($stmt);
mysqli_close($con);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>select</title>
</head>
<body>
<h1>ランキング検索</h1>
<?php print $m; ?>
</body>
</html>

3.2.2.INSERT

  1. insert.html:フォーム投稿にてtilte、artist、pointの値を送信し、
  2. insert.php:phpページで受けて、プリペアドステートメントにバインドする。
データ挿入
フォーム
insert.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>insert</title>
</head>
<body>
<h1>ランキング登録</h1>
<form method="post" action="insert.php">
タイトル:<input type="text" name="title"><br>
アーティスト:<input type="text" name="artist"><br>
ポイント:<input type="text" name="point"><br>
<input type="submit" name="sub" value="登録">
</form>
</body>
</html>
insert.php
<?php
if(!isset($_POST['sub'])) exit("Access Error.");

$title=$_POST['title'];
$artist=$_POST['artist'];
$point=$_POST['point'];
if($point=="")$point=0;

$con=mysqli_connect("localhost", "web2", "771", "web2");
$sql="INSERT INTO ranking (title, artist, point) VALUES (?, ?, ?)";
$stmt=mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'ssi', $title, $artist, $point);
$rst=mysqli_stmt_execute($stmt);

$m="";
if($rst) $m="成功しました";
else $m="失敗";

mysqli_stmt_close($stmt);
mysqli_close($con);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>insert</title>
</head>
<body>
<h1>ランキング登録</h1>
<p><?php print $m; ?></p>
</body>
</html>

3.2.3 UPDATE

  1. update2.php:SELECT文で一覧した文書にリンクを付ける。リンクを付けるとき、?id= を付けることが急所。
  2. update3.php:phpページで、?id= の値を$_GETで読み取り、そのidの行を読むSELECT文発行する。
    読んだ値を、フォームのテキスト枠の値とする。
    変更した値を、フォーム投稿する。
  3. update4.php:UPDATE文を実行する。
update1.htnl 検索フォーム select.htmlと同じもの
select.php
を改良して
更新リンク追加
update2.php
select.phpの下記個所(赤)を加える
while($row=mysqli_fetch_array($rst)){
    $juni=$juni+1;
    $m.="<tr><td>".$juni."</td>";
    $m.="<td><a href='update.php?id=".$row["id"]."'>".$row["title"]."</a></td>";
    $m.="<td>".$row["artist"]."</td>";
    $m.="<td>".$row["point"]."</td></tr>";
}
update3.php
更新フォーム
<?php
if(!isset($_GET['id'])) exit("Access Error.");

$id=$_GET['id'];

$con=mysqli_connect("localhost", "web2", "771", "web2");
$sql="SELECT * FROM ranking WHERE id=? ORDER BY point DESC";
$stmt=mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'i', $id);
mysqli_stmt_execute($stmt);
$rst=mysqli_stmt_get_result($stmt);

$row=mysqli_fetch_array($rst);
$id=$row["id"];
$title=$row["title"];
$artist=$row["artist"];
$point=$row["point"];

mysqli_free_result($rst);
mysqli_stmt_close($stmt);
mysqli_close($con);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>update</title>
</head>
<body>
<h1>ランキング編集</h1>
<form method="post" action="update4.php">
<input type="hidden" name="id" value="<?php print $id; ?>">
タイトル:<input type="text" name="title" value="<?php print $title; ?>"><br>
アーティスト:<input type="text" name="artist" value="<?php print $artist; ?>"><br>
ポイント:<input type="text" name="point" value="<?php print $point; ?>"><br>
<input type="submit" name="sub" value="編集">
</form>
</body>
</html>
update4.php
<?php
if(!isset($_POST['sub'])) exit("Access Error.");

$id=$_POST['id'];
$title=$_POST['title'];
$artist=$_POST['artist'];
$point=$_POST['point'];

$con=mysqli_connect("localhost", "web2", "771", "web2");
$sql="UPDATE ranking SET title=?, artist=?, point=? WHERE id=?";
$stmt=mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'ssii', $title, $artist, $point, $id);
$rst=mysqli_stmt_execute($stmt);

$m="";
if($rst) $m="成功しました";
else $m="失敗";

mysqli_stmt_close($stmt);
mysqli_close($con);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>update</title>
</head>
<body>
<h1>ランキング編集</h1>
<p><?php print $m; ?></p>
</body>
</html>

3.2.4 DELETEはUPDATEの要領で

delete1.htnl 検索フォーム select.htmlと同じもの
select.php
を改良して
更新リンク追加
delete2.php
select.phpの下記個所(赤)を加える
$m="<table border='1' cellspacing='0' cellpadding='2'>";
$m.="<tr bgcolor='#CCCCCC'><td>順位</td><td>タイトル</td><td>アーティスト</td><td>ポイント</td><td> </td></tr>";
$juni=0;
while($row=mysqli_fetch_array($rst)){
    $juni=$juni+1;
    $m.="<tr><td>".$juni."</td>";
    $m.="<td><a href='updateform.php?id=".$row["id"]."'>".$row["title"]."</a></td>";
    $m.="<td>".$row["artist"]."</td>";
    $m.="<td>".$row["point"]."</td>";
    $m.="<td><a href='delete.php?id=".$row["id"]."'>削除</a></td></tr>";
}
$m.="</table>";
delete3.php
削除フォーム
<?php
if(!isset($_GET['id'])) exit("Access Error.");

$id=$_GET['id'];

$con=mysqli_connect("localhost", "web2", "771", "web2");
$sql="DELETE FROM ranking WHERE id=?";
$stmt=mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, 'i', $id);
$rst=mysqli_stmt_execute($stmt);

$m="";
if($rst) $m="成功しました";
else $m="失敗";

mysqli_stmt_close($stmt);
mysqli_close($con);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>delete</title>
</head>
<body>
<h1>ランキング削除</h1>
<p><?php print $m; ?></p>
</body>
</html>

 

演習 ○○検索サイトを作ってみよ。

例 DSゲーム検索サイト(タイトル、メーカー、円)、 お酒検索サイト(銘柄、種類、円)、
クラッシック音楽検索サイト(曲名、作曲家、種類)、就活検索サイト(社名、募集職種、初任給)

  1. テーブルを作成
  2. 検索phpを作成
  3. 登録phpを作成

 

コラム header関数でリダイレクト♪

  1. header関数はhtmlタグを出力するよりも先に置かなければならない。
  2. header("Location: リダイレクトしたいURLアドレス");の書式である。
    例 header("Location: http://www.google.com/");

 

コラム インクルードファイルを使うと便利

  • インクルードファイルdb_value.php
  • C:\xampp\htdocs\web2\commonの中に保存ください。
db_value.php
<?php
$DBSERVER="localhost";
$DBUSER="web2";
$DBPASSWORD="771";
$DBNAME="web2";
?>
        

注)

上記インクルードファイルを読み取るためには、下記のように指定してください。
require_once($_SERVER['DOCUMENT_ROOT']."/web2/common/db_value.php");