基礎から解る!PHP入門講座 プログラム入門に最適な言語、PHPを学ぼう

基礎から解る!PHP入門講座

プログラム入門に最適な言語、PHPを学ぼう      

ファイル 13−4 問題画面

<?php
error_reporting(1);
/*--------------------------------------------------クッキーの設定*/
$pass_ask = $_POST['password_ask'];
$name = $_POST['name'];
$name = htmlspecialchars($name, ENT_QUOTES);  /*タグを無効化*/
  if($pass_ask==null or $name == null){
    $pass_ask=$_COOKIE['password_quiz_web'];
    $name=$_COOKIE['name_web'];
  }
setcookie("password_quiz_web", $pass_ask, time()+60*60);
setcookie("name_web", $name, time()+60*60);
$login = $_POST['loginn'];        /*ログオフの設定*/          
  if($login == "LOGOFF") {
    setcookie("password_quiz_web");      //*クッキー"password"をクリア*/
    setcookie("name_web");      /*クッキー"password"をクリア*/
    $pass_ask = "";            /*パスワードデータをクリア*/
    $name = "";            /*パスワードデータをクリア*/
  }
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"><head>
<meta http-equiv="Content-type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" href="./style2.css">
<title>みんなでクイズ</title></head>
<body><div class="file2">
<?php
/*--------------------------------------------------パスワード・名前入力画面*/
if($pass_ask != "pass"){
  echo "<form action='13_04_quiz_ask.php' method='post'>¥n";
  echo " PASSWORD <input type='password' name='password_ask' size='12'>¥n";
  echo " NAME <input type='text' name='name' size='15'>";
  echo " <input type='submit' name ='loginn' value='LOGIN'></form>¥n";
  echo " 1レベル5問出題されます。各レベルは4問以上正解で次のレベルに行けます。問題は各レベル10問からランダムに5問が出題されます。クリアできなければそこで終了です。全3レベルをクリアすると合格です。パスワードは pass 、NAMEはなんでもいいです。";
  echo "<br><br> このクイズはテキトーEXCELクイズなのですが、だれでも問題を書きかえることができます。したがって変な問題が出てくることもありますのでテキトーに楽しんで解答してください。";
  echo "<br><br> 解説に戻る時は必ずログオフしてください。";
  echo "<div style='width:650;margin:30px;padding:20px;font-size:15px'>";
  echo "<a href='../second.php?page_num=513'>解説にもどる</a></div>";
} else if($pass_ask == "pass" and $name != null){
/*--------------------------------------------------チェックファイルからの受け取り*/
  $level_get = $_POST['level'];
  $right_cnt_before = $_POST['point'];
  $updir = "quiz/excel";
  $enter = $_POST['enter'];
  $level = 1;
  $level += $level_get;        /*チェックでクリアできると1レベル上がる*/
/*--------------------------------------------------タイトルとLOGOFF*/
  echo "<form action='13_04_quiz_ask.php' method='post'>¥n";
  echo "<table width='700' border='0'><tr><td valign='middle'>¥n";
  echo "<span class='shadow'>¥n";
  echo "MINNADE QUIZ   LEVEL $level</span></td>¥n";
  echo "<td align='right'><input type='submit' name ='loginn' value='LOGOFF'>¥n";
  echo "</td></tr></table></form>¥n";
/*--------------------------------------------------ここから問題の読みこみと5問の取りだし*/
  if(file_exists("./$updir")){          /*一度すべての行を順に読みこむ*/
    $filepointer=fopen("./$updir", "r");
      while(!feof($filepointer)){        /*読みこんだ各行を配列に格納*/
       $fileline = fgets($filepointer);
          $quest[] = $fileline;
      }
    fclose($filepointer);
  }
  array_pop($quest);      /*最後の改行が空白の配列になるので削除*/
  sort($quest,SORT_NUMERIC);  /*要素でソートする(要素の初めは問題番号になっている)*/
  $start = $level*10-10;              /*レベル番号から開始番号を調べる*/
  $quest = array_slice($quest, $start, 10);     /*開始番号から10問を取り出す*/
  srand((float)microtime() * 1000000);    //乱数を初期化
  shuffle($quest);    //取り出した10問をシャッフル
/*--------------------------------------------------取り出した5問を表示する*/
  echo "<form action='13_04_quiz_check.php' method='post'>¥n";
  $qs_num = count($quest);
  $qs_cnt = 1;
  while($qs_cnt < 6){
    $text = split("&&",$quest[$qs_cnt]);
    $quest_now[] = $text[0];
    echo "<div class='nikki'>¥n";
    echo "<b>$qs_cnt</b>  $text[2] <br>¥n";      
    echo "   <input type='radio' name='ans".$text[0]."' value='YES'>正しい¥n";
    echo "   <input type='radio' name='ans".$text[0]."' value='NO'>間違い</div>¥n";
  $qs_cnt++;
  }
/*--------------------------------------------------チェックファイルにデータを送る*/
  $cont = 0;              /*出題した問題番号、配列のままでは送れないので文字列にする*/
  while($cont < 5){
    $ary_send = $quest_now[$cont];
    $send = $send."&".$ary_send;
  $cont++;
  }

  echo "<input type='hidden' name='right_cnt_before' value='".$right_cnt_before."'>¥n";
  echo "<input type='hidden' name='level_now' value='".$level."'>¥n";
  echo "<input type='hidden' name='quest_now' value='".$send."'>¥n";
  echo "<br>  <input type='submit' name='enter' value='CHECK'></form>¥n";
/*--------------------------------------------------トップ画面で名前を入力しなかった場合*/
} else {
  echo "ブラウザの戻るボタンで戻り NAME を入力してください。";
}
?>


</body>
</html>

ファイル 13−4 問題チェック画面

<?php
error_reporting(1);
/*--------------------------------------------------クッキーの設定*/
$pass_ask = $_POST['password_ask'];
$name = $_POST['name'];
$name = htmlspecialchars($name, ENT_QUOTES);  //タグを無効化

  if($pass_ask==null){
    $pass_ask=$_COOKIE['password_quiz_web'];
    $name=$_COOKIE['name_web'];
  }
setcookie("password_quiz_web", $pass_ask, time()+60*60);
setcookie("name_web", $name, time()+60*60);

$login = $_POST['loginn'];        /*ログオフの設定*/
  if($login == "LOGOFF") {
    setcookie("password_quiz_web");      /*クッキー"password_quiz_ask_web"をクリア*/
    setcookie("name_web");      /*クッキー"name_web"をクリア*/
    $pass_ask = "";            /*パスワードデータをクリア*/
    $name = "";            /*nameデータをクリア*/
  }
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"><head>
<meta http-equiv="Content-type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" href="./style2.css">
<title>みんなでクイズ</title></head>
<body><div class="file2">
<?php
/*--------------------------------------------------パスワード・名前入力画面*/
if($pass_ask != "pass"){
  echo "<form action='13_04_quiz_ask.php' method='post'>¥n";
  echo " PASSWORD <input type='password' name='password_ask' size='12'>¥n";
  echo " NAME <input type='text' name='name' size='15'>¥n";
  echo " <input type='submit' name ='loginn' value='LOGIN'></form>¥n";
  echo "1レベル5問出題されます。各レベルは4問以上正解で次のレベルに行けます。問題は各レベル10問からランダムに5問が出題されます。クリアできなければそこで終了です。全3レベルをクリアすると合格です。<br>解説に戻る時はログオフしてください。¥n";
  echo "<div style='width:650;margin:30px;padding:20px;font-size:15px'>";
  echo "<a href='../second.php?page_num=513'>解説にもどる</a></div>";
} else if($pass_ask == "pass" and $name != null){
/*--------------------------------------------------データの受け取り*/
  $quest_now = $_POST['quest_now'];      /*実施された問題番号*/
  $level_now = $_POST['level_now'];
  $right_cnt_before = $_POST['right_cnt_before'];
  $updir = "quiz/excel";
  $quest_num = split("&",$quest_now);    /*問題番号を再び配列へ*/
  $ans[1] = $_POST["ans$quest_num[1]"];    /*解答の受け取り、上の問題番号が form の name になっている*/
  $ans[2] = $_POST["ans$quest_num[2]"];
  $ans[3] = $_POST["ans$quest_num[3]"];
  $ans[4] = $_POST["ans$quest_num[4]"];
  $ans[5] = $_POST["ans$quest_num[5]"];
/*--------------------------------------------------LOGOFFの設定*/
  echo "<form action='13_04_quiz_ask.php' method='post'>¥n";
  echo "<table width='700' border='0'><tr><td valign='middle'>¥n";
  echo "<span class='shadow'>¥n";
  echo "MINNADE QUIZ   LEVEL $level_now </span></td>¥n";
  echo "<td align='right'>¥n";
  echo "</td></tr></table></form>¥n";
/*--------------------------------------------------問題と解答の読みこみ*/
  if(file_exists("./$updir")){
    $filepointer=fopen("./$updir", "r");
      while(!feof($filepointer)){          /*一度すべての問題を順に読みこむ*/
       $fileline = fgets($filepointer);
        $text = split("&&",$fileline);  /*読み込んだデータから問題番号を取り出す$text[0]が番号*/
          for($a = 1;$a < 6;$a++){      /*問題番号を実施した問題の番号と照合*/
            if($text[0] == $quest_num[$a]){    /*同じ番号が見つかったら配列に入れる*/
              $quest_ans[] = $a."&&".$fileline;
            }
          }
      }
    fclose($filepointer);
  }
/*--------------------------------------------------ここから表示部分*/
  sort($quest_ans,SORT_NUMERIC);
  $right_cnt = 0;
  $qs_cnt = 0;
  while($qs_cnt < 5){
    $text = split("&&",$quest_ans[$qs_cnt]);
    $quest_ans[] = $text[0];
    $qs_cnt ++;
      if($text[2] == $ans[$qs_cnt]){
        $check = "○";
        $right_cnt ++ ;
      } else {
        $check = "×";
      }
      if($text[2] == "YES"){
        $answer = "正しい";
      } else {
        $answer = "間違い";
      }
    echo "<div class='nikki2'><b>$text[0]</b>¥n  <font color='red'><b>$check</b></font>";
    echo "  $answer <br>¥n問題 $text[3]<br><font color='blue'>解説 $text[4] </font></div>¥n";
  }
/*--------------------------------------------------採点結果による表示*/
  if($right_cnt < 4){              /*4問以上の正解がなかった場合*/
    $right_cnt += $right_cnt_before;
    $point = (int)($right_cnt/15*100);
    $level = $level_now -1;

  switch ($level){                /*switch を使った条件分岐*/
    case $level = 0 ;
      $mess = "がんばれ〜";
      break;
    case $level = 1 ;
      $mess = "まだまだですね";
      break;
    case $level = 2 ;
      $mess = "おしいっ!もうちょっと!";
      break;
  }
/*--------------------------------------------------点数データの書きこみ*/
  $time_ptn = date("Y/m/d H:i:s");
  $filepointer=fopen("./quiz/name/$name", "a+");    //ここから書きこみ
    flock($filepointer, LOCK_EX);
      fputs($filepointer,$time_ptn."--Level-".$level." -- Point-".$point."¥n");
    flock($filepointer, LOCK_UN);
  fclose($filepointer);
/*--------------------------------------------------レベル3まで行かなかった場合の表示*/
  echo "<div style='font-size:16px;font-weight:bold;margin:15px'>終了!クリアレベル $level ¥n";
  echo "  $point 点です。".$name."さん、$mess </div>¥n";
  echo " <a href='13_04_quiz_ask.php'>もう一度やる</a>¥n";
/*--------------------------------------------------レベル3が終了した場合*/
  } else {  
    if($level_now == 3){
      $right_cnt += $right_cnt_before;
      $point = (int)($right_cnt/15*100);
      $level = $level_now -1;
      echo "<div style='font-size:16px;margin:15px;font-weight:bold;'>¥n";  
      echo "最終レベルをクリアしました。合格です!$right_cnt 問正解、$point 点です。¥n";
      echo "<a href='13_04_quiz_ask.php'>もう一度</a></div>¥n";
      $time_ptn = date("Y/m/d H:i:s");
      $filepointer=fopen("./quiz/name/$name", "a+");    /*ここから書きこみ*/
        flock($filepointer, LOCK_EX);
          fputs($filepointer,$time_ptn."--Level-".$level." -- Point-".$point."¥n");
        flock($filepointer, LOCK_UN);
      fclose($filepointer);
/*--------------------------------------------------レベルクリア、レベル2までの処理*/
    } else {
      echo " $right_cnt 問正解です。";
      $right_cnt += $right_cnt_before;
      echo "<form action='13_04_quiz_ask.php' method='post'>¥n";
      echo "<input type='hidden' name='level' value='".$level_now."'>¥n";
      echo "<input type='hidden' name='point' value='".$right_cnt."'>¥n";
      echo " <input type='submit' name ='enter' value='次のレベル'>¥n";
    }
  }
/*--------------------------------------------------採点結果表示*/
} /*パスワード*/
?>


</body>
</html>

ファイル 13−4 問題作成画面

<?php
error_reporting(1);
/*--------------------------------------------------パスワード”の設定*/
$pass_w = $_POST['password_w'];
$name = $_POST['name'];
  if($pass_w == null){
    $pass_w = $_COOKIE['password_quiz_web'];
    $name = $_COOKIE['name_web'];
  }
setcookie("password_quiz_web", $pass_w, time()+60*60);
setcookie("name_web", $name, time()+60*60);

$login = $_POST['loginn'];        /*ログオフの設定*/
  if($login == "LOGOFF") {
    setcookie("password_quiz_web");      /*クッキー"password"をクリア*/
    setcookie("name_web");      /*クッキー"name_web"をクリア*/
    $pass_w = "";            /*パスワードデータをクリア*/
    $name = "";            /*nameデータをクリア*/
  }
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"><head>
<meta http-equiv="Content-type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" href="./style2.css">
<style type="text/css">
<!--
.nikki {
font-size:12px;
line-height:15px;
text-align:left;
width:660px;
padding:7px;
margin:0px;
border-style:solid;
border-width:1px;
background-color:#ffffff;
border-color:#abcdef;
}
//-->
</style>

<title>みんなでクイズ</title></head>
<body><div class="file2">
<?php
if($pass_w != "pass"){
  echo "<form action='13_04_quiz_write.php' method='post'>¥n";
  echo " PASSWORD <input type='password' name='password_w' size='12'>¥n";
  echo " NAME <input type='text' name='name' size='15'>¥n";
  echo " <input type='submit' name ='loginn' value='LOGIN'>¥n";
  echo "</form>";
  echo "パスワードを入れてね。pass です。NAMAEはなんでもいいです。";
  echo "<div style='width:650;margin:30px;padding:20px;font-size:15px'>";
  echo "<a href='../second.php?page_num=513'>解説にもどる</a></div>";
} else if($pass_w == "pass"){
/*--------------------------------------------------LOGOFFの設定*/
  echo "<form action='13_04_quiz_write.php' method='post'>";
  echo "<table width='650' border='0'><tr><td valign='middle'>";
  echo "<div style='margin:10px;font-size:15px'>クイズ入力 : ";
  echo date("Y/m/d") . "  <a href='13_04_quiz_ask.php'>問題</a></div></td>¥n";
  echo "<td align='right'><input type='submit' name ='loginn' value='LOGOFF'></td>";
  echo "<tr><td colspan='2'><div style='margin:5px;font-size:12px;line-height:18px'>";
  echo "問題は削除・書き換えができます。表示されているEXCEL問題もテキトーなので、どんどん書き換えてください。";
  echo "<br>先ず、番号を選んで削除、次に空いた番号を選んで問題の入力です。</div></td></tr></table>";
/*--------------------------------------------------*/
  echo "<table border='0' width='660'><tr>";
  echo "<td>番号 <select name='number'>";
  echo "<option>"." " ."</option>";
  $cnt = 1;
  while ($cnt < 31){
    echo "<option value='$cnt'>".$cnt."</option>";
  $cnt++;
  }
  echo "</select> 正解 <select name='answer'>";
  echo "<option value='YES'>正しい</option>";
  echo "<option value='NO'>間違い</option>";
  echo "</select></td></tr>";
  echo "<tr><td>問題 <textarea name='quiz' cols='90' rows='2'></textarea></td></tr>";
  echo "<tr><td>解説 <textarea name='expln' cols='90' rows='2'></textarea></td></tr>";
  echo "<tr><td><input type='submit' name='enter' value='書込/表示'> ";
  echo "<input type='submit' name='enter' value='消す!'></td></tr></table></form>";
/*--------------------------------------------------データの受け取りと設定*/
  $number = $_POST['number'];
  $quiz = $_POST['quiz'];
  $answer = $_POST['answer'];
  $expln = $_POST['expln'];
  $enter = $_POST['enter'];
  $quiz = htmlspecialchars($quiz, ENT_QUOTES);  /*タグを無効化 */
  $expln = htmlspecialchars($expln, ENT_QUOTES);  /*タグを無効化 */
  $updir = "quiz/excel";          //保存するファイルの名前
  $data = $number."&&".$answer."&&".$quiz."&&".$expln."¥n";    /*入力データを&&でくっつける*/
/*--------------------------------------------------ここから削除*/
  if ($enter == "消す!"){  
    $filepointer=fopen("./$updir", "r");    /*いったん読み出し*/
      while(!feof($filepointer)){    
       $fileline = fgets($filepointer);    /*問題はキーの番号と実際の問題番号が違うこと*/
          $ary_num = split("&&",$fileline);    /*要素を配列に入れる、ary_num[0]が問題番号になる*/
          $quest_del[$ary_num[0]] = $fileline;   /*問題番号をキーとして配列に入れ直す*/
      }
    fclose($filepointer);
    $qs_num = count($quest_del);
    $qs_cnt = 1;
      while($qs_cnt < 31){          /*入力番号と同じ配列キーを削除*/
          if($number == $qs_cnt){;
            $quest_del[$qs_cnt] = "";
            break;
          }
      $qs_cnt++;
      }
  sort($quest_del);
    $filepointer=fopen("./$updir", "w+");      /*もう一度書きこみ*/
      flock($filepointer, LOCK_EX);
        $qs_cnt = 0;
        while($qs_cnt <= $qs_num){    
          fputs($filepointer, $quest_del[$qs_cnt]);
        $qs_cnt++;
        }
      flock($filepointer, LOCK_UN);
    fclose($filepointer);
/*--------------------------------------------------ここから書き込み部分*/
  } else if($enter == "書込/表示" and $data != null){
    $filepointer=fopen("./$updir", "a+");    /*追記でファイルを開く*/
      while(!feof($filepointer)){    
       $fileline = fgets($filepointer);    /*一度ファイルを全部読む*/
          $text = split("&&",$fileline);    /*要素を配列にいれる*/
            if($number == $text[0]){    /*入力した番号が既にあれば*/
              $select = "no";  
              break;            /*中止*/
            }
      }      
    If($select != "no"){          /*入力しようとする問題番号が存在しない場合に書き込み*/
      flock($filepointer, LOCK_EX);
        fputs($filepointer, $data);
      flock($filepointer, LOCK_UN);
      fclose($filepointer);
    } else {
      echo "その番号はすでにあります";
    }
  }
/*--------------------------------------------------ここから表示部分*/
  if(file_exists("./$updir")){
    $filepointer=fopen("./$updir", "r");      /*一度すべて読みこむ*/
      while(!feof($filepointer)){  
       $fileline = fgets($filepointer);
          $quest[] = $fileline;         /*配列にいれる*/
      }
    fclose($filepointer);
  }
/*-------------入力時に修正があるので、問題はキー番号順に並んでいるわけではない。*/
  sort($quest,SORT_NUMERIC);      /*要素で並べ替え、要素の先頭は問題番号である*/
  $qs_num = count($quest);      /*配列を数える*/
  $qs_cnt = $qs_num-1;        /*問題を最終番号から表示させるため、繰返しは29から順に減らす*/
  while($qs_cnt > 0){
    $text = split("&&",$quest[$qs_cnt]);
    echo "<div class='nikki'>";
    echo "<b>$text[0]</b> $text[1] $text[2]<br> <font color=blue>$text[3] </font></div><br>";
  $qs_cnt--;
  }
}
?>


</div>
</body>
</html>
2023/9
SUN MON TUE WED THU FRI SAT
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


 フォクすけ©2006 Mozilla Japan



制作:基礎から解るPHP入門講座 代表:FREEZE

Copyright © 2005/2/28 flzPHP.All Rights Riserved