投票コメント機能製作メモ23

 既にテストページに公開している確認ページです。input type="submit"でボタンを2つ用意したらどうなるか?と思っていたのですが、クリックされたボタンの名前だけが変数にセットされてクリックされなかったボタンの名前は変数にセットされないのが分かりました。なので画像ボタンの時と同様に
if (isset($_POST["hakusyu"])) $tflg="1";
とすれば良く、ソースの変更も最小限で済みました。

kakunin.php
<?php
$pflg = "0";   //POSTされたら"1" そうでなければ"0"
$tflg = "0";   //投票のフラグ "1"投票有り "0"投票無し
$kflg = "1";   //コメントのフラグ "1"コメント有り "0"コメント無し
$kakunin ="1"; //確認ページなら"1"

require "settei.php";  //設定ファイルの挿入
require "countcom.php"; //コメントを数える関数挿入

//POSTされた
if ($_SERVER["REQUEST_METHOD"]=="POST") {
$pflg = "1";
//変数へ代入
$id = $_POST["id"];    //タイトル番号
$namae = $_POST["namae"];        //名前
$komento = $_POST["komento"];    //コメント
if ($komento =="") $kflg = "0";
if (isset($_POST["hakusyu"])) $tflg="1";  //拍手ボタンクリック
}
switch ($tflg) {   //得票テーブルに追加
  case "1":
    $ipadr = getenv("REMOTE_ADDR"); //IPアドレス取得
    $ipnum = floor(ip2long($ipadr)/256);  //IPアドレスを整数値に変換
    $tokuhyou_res = mysql_query("SELECT tcode , tipadr FROM ".HYOU." WHERE tcode = '$id' AND tipadr = '$ipnum'",$my_con);
    if (!$tokuhyou_res) break;  //id番号違い
    if(!mysql_fetch_array($tokuhyou_res)) {  //同じIPの投票が無かった
      $touhyou_res = mysql_query("INSERT INTO ".HYOU." (tcode,tdate,tipadr) VALUES ('$id',CURDATE(),'$ipnum')",$my_con);
    }
  mysql_free_result($tokuhyou_res);  //リソースの開放
}
require "comcheck.php";
session_start();
?>

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>確認</title></head><body><p> </p>
<div align="center">  <center>
  <table border="1" width="700" bgcolor="#FFFFFF">
    <tr>      <td width="100%">
      </center>
      <p class="MsoNormal" style="text-indent: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size:10.5pt;line-height: 115%; margin-top: 0; margin-bottom: 0" align="left">

<?php
//次のページに行くかどうか
if ($nflg == "0") {
  echo $msg," ブラウザの戻るボタンで前のページへ戻って下さい<br>";
} else {
  $_SESSION['execute'] = false;
  $namae = htmlspecialchars($namae,ENT_QUOTES);
  $komento = htmlspecialchars($komento,ENT_QUOTES);
  echo $msg,"<hr> これでよろしければ【送信する】ボタンをクリックして下さい<br><br>";
  echo " やり直したければブラウザの戻るボタンで前のページへ戻って下さい";
  echo "<form action=¥"comment.php¥" method=¥"POST¥">";
  echo "<input type=¥"hidden¥" name=¥"id¥" value=¥"$id¥">";  //タイトル番号の送信
  echo "<input type=¥"hidden¥" name=¥"kflg¥" value=¥"$kflg¥">";        //コメントの有無の送信
  echo "<input type=¥"hidden¥" name=¥"namae¥" value=¥"$namae¥">";      //名前の送信
  echo "<input type=¥"hidden¥" name=¥"komento¥" value=¥"$komento¥">";  //コメントの送信
  echo "   <input type=¥"submit¥" name=¥"submit¥" value=¥" 送信する ¥">"; //送信ボタン
  echo "</form>";
}
?>
</td></tr></table></div></body></html>

 名前の変数名をnamaeにしたせいでnameとよく間違えるというのは置いといて、前半部分は主に拍手ボタンがクリックされた時の処理です。ここで投票用のテーブルにデータを追加しています。データにはipアドレスを32ビットの数値にしたものを256で割って記録しています。これで同じ人が複数回投票するのを防いでいます。ただ重複投票防止策としては大雑把に過ぎるような気もしていて改善の余地有りです。
 前半部分の最後、htmlタグの前の部分にsession_start();という行が有りますが、これはページをまたいで使える変数を使う宣言ですね。コメント表示ページに登録機能を付けたらリロードする度に同じ内容が追加されるようになったので、対策としてそういった変数を使うことにしました。後半部分で使っている $_SESSION['execute'] = false;というのです。コメント登録部分でこの値をtrueにして、登録するかどうかを判定します。
 コメントの中身が適切かどうか判定する部分は登録用のスクリプトで再び使うので別ファイルに書いてrequire "comcheck.php";として読み込ませています。

comcheck.php
<?php
require "trip.php";  //トリップ関数挿入
$nflg = "1";    //次ページへのフラグ "1"なら次へ"0"なら戻らせる
$youbi = array("日","月","火","水","木","金","土");
switch ($pflg) {
  case 0:  //ポストされてない
    $msg = "直接見ても何もないよ<br>";
    $nflg = "0";
    break;
  case 1:  //ポストされた
    //タイトル番号チェック
    if (!is_numeric($id)) {
      $msg = "タイトル番号の記述を間違えましたorz<br>";
      $nflg = "0";
      break;
    }
    $my_title = mysql_query("SELECT tcode , tname , turl ,tokuhyou FROM ".TITLE. " WHERE tcode = '$id'",$my_con);
    if (!$my_title) {
      $msg = "データベースのアクセスに失敗しましたorz<br>";
      $nflg = "0";
      break;
    }
    $tnamae = mysql_fetch_array($my_title);
    if (!$tnamae) {
      $msg = "このタイトルは登録されていませんorz<br>";
      $nflg = "0";
      break;
    }
    //データベースに話が登録されていた
    $taitoru = $tnamae["tname"];
    $turl = $tnamae["turl"];
    $tokuhyou = $tnamae["tokuhyou"];
    mysql_free_result($my_title);  //リソースの開放
    if ($kakunin == "1") {  //確認ページに挿入された
      if ($kflg == "0") {  //コメント無し
        if (countcom($id) =="0") {       //登録済みコメント無し
          header( "location: ../$turl" );        //体験談ページへ移動
          exit;
          }  else {
          header( "location: comment.php?id=$id" );
          exit;
        }
      }
    }
    if ($kflg =="0") break;
    $msg = "<b>".$taitoru."</b><br>";  //話のタイトル
     require "kinshi.php";  //アク禁NGワードチェックファイルの挿入
    if ($akflg == "1") {
      $msg = $msg . "<b><font color='Red'> あなたからの書き込みは拒否されました<br>";
      $kflg = "0";
      $komento = "";
      $nflg = "0";
      break;
    }
    if ($ngflg == "1") {
      $msg = $msg . "<b><font color='Red'> 不適切な書き込みはご遠慮ください<br>";
      $kflg = "0";
      $komento = "";
      $nflg = "0";
      break;
    }
    //名前チェック
    if (strlen($namae) > N_NAGASA) {
      $msg = $msg . "<b><font color='Red'> 名前の文字が長すぎます<br>";
      $msg = $msg . " 全角で". (N_NAGASA / 2) ."文字以内でお願いします。</font></b><br>";
      $nflg = "0";
      break;
    }
    //コメント内容チェック
    if ($kflg==1) {
      $msg = $msg . "<br> コメント内容<br>";
      $msg = $msg .  "<p class=¥"MsoNormal¥" style=¥"text-indent: -30pt;";
      $msg = $msg .  "margin-left: 35pt;line-height: 115%; margin-top: 0; margin-bottom: 10.5pt¥">";
      $msg = $msg .  "xxxx 名前:<b><font color='Green'>";
      if ($namae == "") $namae = NANASHI;
      $msg = $msg .htmlspecialchars(trip($namae));
      $msg = $msg . "</font></b> 投稿日:";
      $ktime = time();
      $msg = $msg .  date("Y/m/d(",$ktime).$youbi[date("w",$ktime)].date(") H:i:s", $ktime)."<br>";
      if (strlen($komento) <= K_NAGASA) {
        $msg = $msg .  nl2br(htmlspecialchars($komento))."<br></p>";
      } else {
        $msg = $msg .  "<b><font color='Red'>コメント内容が長すぎます<br>";
        $msg = $msg .  "全角で".( K_NAGASA/2) ."文字以内でお願いします</font></b></p>";
        $nflg = "0";
        break;
      }
    }
}
?>

 確認ページには不要な変数をセットしたりしていますが、コメント登録ページにも使うのでまっいっかという事にしています。関数化しないファイルを挿入するのはプログラムの流れが読みにくくなるので余りするべきではありませんが・・・・まっいっか。メッセージは後でまとめて表示する必要から一旦$msgという変数に格納しています。
 NGワードやアク禁の処理は今の所たいした事はしていません。これも関数化せずに$akflgと$ngflgが"1"ならコメントをはじくようにしています。

kinshi.php
<?php
$ipadr = getenv("REMOTE_ADDR");
$host = getenv("REMOTE_HOST");
if ($host == null || $host == $ipadr) $host = gethostbyaddr($ipadr);
$akflg = "0";
$ngflg = "0";
if (strpos($komento,"XXXXX") !== false) $ngflg="1";
?>

 ホスト名とipアドレスを取得していますが、アク禁処理は今の所何もしていません。具体的なNGワードはXXXXXの所に記述し、増える度に同様の行を増やして行く予定です。いずれはNGワードやアク禁情報はデータベースに記録し、管理者専用ページから設定できるようにするべきだと思っています。


コメント
コメントする








   
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< July 2018 >>

テスト

笑える霊体験まとめサイト
の表紙作成に使ったソフト

Poser 10

新品価格
¥14,316から
(2014/4/9 14:19時点)

広告だったり

オリジナル電子書籍

selected entries

categories

archives

recent comment

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM