「PHP」でアンケート一覧表示させてみる。
■アンケート一覧表示確認。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>アンケート一覧表示。</title>
</head>
<body>
<?php ←「PHP」プログラムの開始。
$dsn = 'mysql:dbname=phpbasic;host=localhost'; ←ローカルホストの「phpbasic」に。
$user = 'root'; ←「root」権限で。
$password = 'XXXXX;
$dbh = new PDO($dsn,$user,$password); ←データベースに接続。
$dbh->query('SET NAMES utf8'); ←命令内容記述。query('命令実行するSQL文');
$sql = 'SELECT * FROM enquete WHERE 1'; ←「enquete」から全部。
$stmt = $dbh->prepare($sql); ←「SQL文」で命令を出す準備。
$stmt->execute(); ←データベースに「SQL文」を送信。「$stmt」に結果が返る。
while(1) ←無限ループ。
{
$rec = $stmt->fetch(PDO::FETCH_ASSOC); ←1レコード取り出し。
if($rec==false) ←取り出すレコードが「無くなったら」、
{
break; ←このループから脱出。
}
print $rec['code']; ←1レコード文の表示。
print $rec['nickname']; ←1レコード文の表示。
print $rec['email']; ←1レコード文の表示。
print $rec['goiken']; ←1レコード文の表示。
print '<br/>';
}
$dbh = null; ←データベース切断。
?> ←「PHP」終了。
</body>
</html>
|
|
26日、27日の記事と連動しています。
「ichiran.php」として「/var/www/htm/php」に保存。
「while(1)」(これより以前↑のプログラムの説明は先日分に) ループをするのですが(1)を付けることで無限ループになります。
「$rec = $stmt->fetch(PDO::FETCH_ASSOC);」で「$stmt」からデータを取り出します。「fetch」が順番に1レコードずつ取り出す命令。
「$stmt」に収まっているデータを「FETCH」により一つずつデータを取り出し、「$rec」に代入します。
1レコードは「code」「nickname」「email」「goiken」となります。
(詳細:
http://www.phpbook.jp/tutorial/pdo/index7.html)
「if($rec==false)」はIF文で「もし~なら~する」ということですが、「==」は「同様なら」と言う意味で、「false」つまり「無」ならループから抜け出すという意味です。それまではループし、再び「$stmt」からデータを取り出し「$rec」を上書きします。
ループから脱却する前に取り出したデータをフィールド名毎に「print」で表示させています。そしてループの初めに戻ります。
「$dbh = null;」によりデータベース切断します。
http://192.168.0.66/php/ichiran.php にアクセスすると下記のように表示されます。
1bibo-rokubibo-roku@yahoo.co.jpなななもはー
2magellanmagellan@yahoo.co.jpねむねむはー
3mekamochimekamochi@yahoo.co.jpこめたぬはー
■データ検索のページを作成してみる。(search.html)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>データ検索</title>
</head>
<body>
<form method="post" action="search.php">
ご意見コードを入力してください。<br>
<input name="code" type="text" style="width:100px"><br>
<br>
<input type="submit" value="送信">
</form>
</body>
</html>
|
|
■データ検索のページを作成してみる。(search.php)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP基礎</title>
</head>
<body>
<?php
$code=$_POST['code'];
$dsn = 'mysql:dbname=phpbasic;host=localhost';
$user = 'root';
$password = 'XXXXX;
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
$sql = 'SELECT * FROM enquete WHERE code='.$code;
$stmt = $dbh->prepare($sql);
$stmt->execute();
while(1)
{
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false)
{
break;
}
print $rec['code'];
print $rec['nickname'];
print $rec['email'];
print $rec['goiken'];
print '<br/>';
}
$dbh = null;
?>
</body>
</html>
|
|
http://192.168.0.66/php/search.html
2[送信]にて下記表示されました。
2magellanmagellan@yahoo.co.jpねむねむはー
しかし
3 or 1[送信]にすると……
1bibo-rokubibo-roku@yahoo.co.jpなななもはー
2magellanmagellan@yahoo.co.jpねむねむはー
3mekamochimekamochi@yahoo.co.jpこめたぬはー
全部表示されてしまいました。これを「SQLインジェクション」と呼ぶ悪い行為だそうです。
これを禁止しましょう。
今回の場合「3 or 1」が「3 かもしくは全部のデータを出しなさい」という意味になります。「or 1」が「もしくは全部」になります。
■「SQLインジェクション」を阻止する。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP基礎</title>
</head>
<body>
<?php
$code=$_POST['code'];
$dsn = 'mysql:dbname=phpbasic;host=localhost';
$user = 'root';
$password = 'maria';
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
$sql = 'SELECT * FROM enquete WHERE code=?'; ←変数の連結を止める。
$stmt = $dbh->prepare($sql);
$data[]=$code; ←新たな変数を使う。
$stmt->execute($data); ←データを格納した変数を指定。
while(1)
{
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false)
{
break;
}
print $rec['code'];
print $rec['nickname'];
print $rec['email'];
print $rec['goiken'];
print '<br/>';
}
$dbh = null;
?>
</body>
</html>
|
|
「$sql = 'SELECT * FROM enquete WHERE code='.$code;」を、変数の連結をやめて、データを入れたい部分を「?」で表現します。
「$sql = 'SELECT * FROM enquete WHERE code=?';」とします。
「$data[]=$code;」新たに変数を作りそこにデータを格納します。
「$stmt->execute($data);」SQL文で命令を出すときに、データを格納した変数を指定します。
http://192.168.0.66/php/search.php
3 or 1[送信]とすると
3mekamochimekamochi@yahoo.co.jpこめたぬはー
となります。これをプリペアードステートメントという書き方だそうです。