SSブログ

「PHP」でアンケート一覧表示させてみる。 [PHP]

「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こめたぬはー
となります。これをプリペアードステートメントという書き方だそうです。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。