ホームに戻る
 PHPとMySQLでWebサービスを作る

0、はじめに

PHPとMySQLでWebサービスを作ります。

サーバーは Linux を使用します。
HTTPプロトコルでPHPからMySQLにアクセスします。
動作させるWebサービスの内容はというと、
「Perl」、「PHP」、「Python」、「Ruby」の投票を行います。
JavaScriptでエンターでのサブミットを禁止しています。
また、セッションを使って2重投票を防止しています。

JavaScriptとセッションは誤投票の防止用です。
意図的な同一人物による多重投票を予防する方法は無いと思われます。

このサイトは php の使用の許可さえされていないので、
動作しているサンプルはこのページにはありません。
各自サーバーを用意してテストしてください。

1、Linuxでの準備

yum -y install httpd
yum -y install php
yum -y install php-mysql
yum -y install mysql
yum -y install mysql-server

service httpd start
service mysqld start

2、ApacheでPHPを使うための設定

httpd.conf に以下を追加

AddType application/x-httpd-php .php
AddType application/x-httpd-php .html
AddType application/x-httpd-php-source .phps

3、セキュリティの問題

セキュリティについては詳しくありませんが、わかっていることだけ書いておきます。
初期状態で root のパスワードが設定されていないので必ず設定します。
ユーザーの登録でアクセスできるデータベースを制限します。
ユーザーが使える SQL 命令も制限しておくと良さそうです。
PHPからは root で無くユーザーでアクセスしたほうが安全な気がします。
ポートについては 3306 を空ける必要はありません。
また、PHP のコードは Linux 上で実行されて結果の HTML を送信するので、
PHP のコード内にユーザー名やパスワードを直接書いてもよさそうです。

4、PHPのみのサンプル

<?php session_start(); ?>

<html>
<head>
<title>PHPのテスト</title>
</head>
<body>

<?php

  define("PI", 3.14);

  if(!isset($_SESSION["count"])){
    $_SESSION["count"] = 1;
    $kon = "ようこそ!PHPのテストです。";
  }
  else{
    $kon = "こんにちはPHPのテストです。";
  }

  print "{$kon}<br><br>\n";

  $data1 = array("ABC"=>10, "DEF"=>20, "GHI"=>30);

  $data1["JKL"] = 25;

  unset($data1["ABC"]);

  if(isset($_POST["str"])){
    if(strlen($_POST["str"]) > 0){
      $data1[$_POST["str"]] = 35;
    }
  }

  asort($data1);

  $data2 = array("MNO"=>40, "PQR"=>60);

  $data = array_merge($data1, $data2);
?>

<table border = 2>
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>名前</th>
<th>数</th>
</tr>

<?php

  $i = 0;

  while(list($key, $num) = each($data)){
    $index = $i + 1;
    if($i > 0 && $i < count($data) - 1){
      if(preg_match("/^GH/i", $key)){
        print "<tr bgcolor=\"#CCCCCC\"><td>{$index}</td><td>{$key}</td><td>{$num}</td></tr>\n";
      }
      else{
        print "<tr><td>{$index}</td><td>{$key}</td><td>{$num}</td></tr>\n";
      }
    }
    $i++;
  }

?>

</table>

<form actio="./index.php" method="post">
<input type="text" name="str" size="10" maxlength="3"/>
<input type="submit" value=" add "/>
</form>

</body>
</html>

5、PHPとMySQLのサンプル(Webサービス)

// 外部にユーザー名やパスワードを書いた db.php を置いています
// MySQL には pg というテーブル作って初期状態を作っておきます
// 例:(ID, NAME, NUM) = (0, 'Perl', 0), (1, 'PHP', 0), (2, 'Python', 0), (3, 'Ruby', 0)

<?php session_start(); ?>

<html>
<head>
<title>PHPのテスト2</title>
</head>
<body>

<script type="text/javascript">
<!--
function submitStop(e){
  if(!e)var e = window.event;

  if(e.keyCode == 13){
    return false;
  }
}
// -->
</script>

PHPとMySQLのテスト<br><br>

<?php
  require_once('db.php');
  $link = mysql_connect($db['host'], $db['user'], $db['pass']);
  $sdb = mysql_select_db($db['dbname'], $link);

  if(isset($_POST["str"])){
    if(strlen($_POST["str"]) > 0){
      if(preg_match("/^(perl|php|python|ruby)$/i", $_POST["str"])){
        if($_SESSION["count"] == 1){
          $sql = "SELECT NUM FROM pg WHERE NAME = '".$_POST["str"]. "'";
          $qry = mysql_query($sql, $link);
          $row = mysql_fetch_array($qry);
          $row[0]++;
          $sql = "UPDATE pg SET NUM = ". $row[0]. " where NAME = '".$_POST["str"]. "'";
          $qry = mysql_query($sql, $link);
          $_SESSION["count"] = 2;
        }
      }
    }
  }

  $sql = "SELECT * FROM pg";
  $qry = mysql_query($sql, $link);
?>

<table border = 2>
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>名前</th>
<th>数</th>
</tr>

<?php

  $r = mysql_num_rows($qry);

  while($row = mysql_fetch_array($qry)) {
    print "<tr><td>{$row[0]}</td><td>{$row[1]}</td><td>{$row[2]}</td></tr>\n";
  }

  mysql_close($link);

  if(!isset($_SESSION["count"])){
    $_SESSION["count"] = 1;
  }

?>

</table>

<form actio="./index.php" method="post">
<input type="text" name="str" size="10" maxlength="6"
  onKeyPress="return submitStop(event);"/>
<input type="submit" value=" 投票 "/>
</form>

</body>
</html>

6、db.php

// 実際には pass などといったパスワードは絶対に使用しないこと

<?php
  $db['host'] = "host";
  $db['user'] = "user";
  $db['pass'] = "pass";
  $db['dbname'] = "db";
?>

inserted by FC2 system