PHP Scrapbook
webcreators 2005年4月号
PHPスクラップブック:記事中スクリプト
誌面ダウンロードデータはこちら ※インストール方法は、同梱のreadme.txtを参照ください
リスト1 an.php(関数のみ)
function an() {
 include_once( 'Smarty.class.php' );

$qfile = "data/questions.txt";
$datafile = "data/vote.dat";
$title = "no title";

 // アンケートを読み出す
$questions = array();

$fn = fopen( $qfile, "rw" );
if( $fn === FALSE )
 exit( "質問ファイルが読み出せません" );

// 質問ファイルを読み出す
while( ! feof($fn) ) {
  $str = trim(fgets( $fn ));
  if( strlen($str) == 0 )
   break;

  if( substr($str,0,2) == "t:" ) {
   list($dumm, $title) = split(":", $str);
   continue;
  }

  array_push($questions, $str);
 }
 fclose( $fn );

 $smarty = new Smarty();
 $smarty->assign('title', $title );
 $smarty->assign('questions', $questions );

 return $smarty->fetch('an.html');
}
リスト2 an.html
<FORM action="vote.php" method="POST">
<TABLE border="0" cellspacing="0" cellpadding="2"width="100%">
 <tr bgcolor="#FFCC00">
   <TD nowrap height="16">{$title}</TD>
  </tr>
 <!-- {section name=q loop=$questions} -->
 <tr><td><INPUT type="radio" name="quest" value='{$questions[q]}'>{$questions[q]}</td></tr>
 <!-- {/section} -->
</TABLE>
 <input type="submit" value="投票">
</FORM>
リスト3 vote.php
<?php
 $mainpage = "index.php";

$msg = vote();
 echo "<html>";
 echo "<head>";
 echo "<meta http-equiv='Content-Type' content='text/html; charset=EUC-JP'>";
 echo "<meta http-equiv='Refresh' content='5;URL=$mainpage'>";
 echo "</head>";
 echo "<body>";
 echo $msg."<br><br>";
 echo "5秒たつと元もページに戻ります....";
 echo "</body>";
 echo "</html>";
 exit();

 function vote() {
  $qfile = "data/questions.txt";
  $datafile = "data/vote.dat";
 $cookiename = "VOTE";

  if( isset($_COOKIE[$cookiename]) ) {
   return "二重投票はご遠慮ください";
  }
  // クッキーのセット
  setcookie($cookiename, "1");

  if( isset( $_POST['quest']) ) {
   //
   $vote = trim($_POST['quest']);

   // 質問ファイルを読み出す
   $n_vote = 0;
   $n_q = 0;
   $fn = fopen( $qfile, "r" );
   if( $fn === FALSE )
   return "質問ファイルが読み出せません";

  while( !feof($fn) ) {
    $str = trim(fgets( $fn ));
    // タイトルは読み飛ばす
    if( substr($str,0,2) == "t:" ) {
     continue;
    }
    if(strlen($str) == 0 )
     continue;

    if( strcmp($vote, $str) == 0 ) {
     $n_vote = $n_q;
    }
    $n_q++;
   }
   fclose( $fn );

   // データファイルを読み出す
   $fr = @fopen( $datafile, "r" );
   $fw = @fopen( $datafile.".tmp", "w" );

   if( $fw === FALSE )
    return "データファイルが読み出せません";
   for( $i = 0; $i < $n_q; $i++ ) {
    if( $fr !== FALSE ) {
     $str = trim( fgets($fr) );
     $count = intval( $str );
    }
    else
     $count = 0;

    if( $i == $n_vote ) {
     $count++;
    }
    fputs( $fw, $count."\n" );
   }
   @fclose( $fr );
   @fclose( $fw );

   @unlink($datafile);
   @rename( $datafile.".tmp", $datafile );

   return "投票ありがとうございました";
  }
  return "投票されていません";
 }
?>
リスト4 an.php(関数のみ)
function vote_total() {
 include_once('Smarty.class.php');
 $qfile = "data/questions.txt";
 $datafile = "data/vote.dat";

 $fq = @fopen( $qfile, "r" );
 $fd = @fopen( $datafile, "r" );
 $questions = array();
 $n_q = 0;
 $subtotal = 0;
 $title = "no title";
 while( ! feof( $fq ) ) {
  $str = trim( fgets($fq) );
  // 空やタイトルは読み飛ばす
  if( strlen( $str ) == 0 )
   continue;
  if( substr($str,0,2) == "t:" ) {
   list($dumm, $title) = split(":", $str);
   continue;
  }
  $questions[$n_q]['str'] = $str;
  $count = 0;
  if( $fd !== FALSE )
   $count = intval( trim(fgets($fd)) );
  $questions[$n_q]['votes'] = $count;

  $subtotal += $count;
  $n_q++;
 }
 @fclose( $fd );
 @fclose( $fq );

 for($i = 0; $i < $n_q ; $i++ ) {
  $questions[$i]['per'] = number_format( $questions[$i]['votes'] * 100 / $subtotal, 2, '.', '') . "%";
 }

 $smarty = new Smarty();

 $smarty->assign( 'title', $title );
 $smarty->assign( 'questions', $questions );

 return $smarty->fetch('total.html');
}
リスト5 集計用テンプレート(total.html)
<TABLE border="0" cellspacing="0" cellpadding="2"width="100%">
 <tr bgcolor="#FFCC00">
   <TD nowrap height="16">{$title}</TD>
   <TD nowrap height="16">得票数</TD>
   <TD nowrap height="16">割合</TD>
  </tr>
 <!-- {section name=q loop=$questions} -->
 <tr>
  <td>{$questions[q].str}</td>
  <td>{$questions[q].votes}</td>
  <td>{$questions[q].per}</td>
 </tr>
 <!-- {/section} -->
</TABLE>
◆ PHP役立ちリンク「PHP.NET」
www.php.net/
◆ PHP役立ちリンク「日本PHPユーザ会」
www.php.gr.jp/

←BACK

Copyright (c) 2005 MdN Corporation  All rights reserved.