PHP・MySQL使用で、年齢制限をかける場合の処理について

このQ&Aのポイント
  • PHP4.3.8、MySQL4.0.16を使用しております。アンケートフォームなどで、次のページに遷移するときにDBの年齢の値を参照して制限をかけるというものを作成しているが、なかなかうまくいかない。男性の10代・20代・30代・40代・50代以上、女性についても同様で、それぞれ100人を越えると制限がかかりアンケート終了となるようにしたい。現在の状況では、17歳と入力した場合に17歳が100カウントされるため、「10代以下」という括りでの制限がどうしてもかけられない。処理方法を教えてほしい。
  • htmlでは下記のコードをincludeして、$limit_overが「1」ならば終了ページに遷移するようにしている。
  • PHP4.3.8、MySQL4.0.16を使用しており、アンケートフォームなどで次のページへの遷移時にDBの年齢の値を参照して制限をかける方法を作成している。男性と女性それぞれの10代、20代、30代、40代、50代以上について100人を超える場合は制限をかける仕組みを実現したい。しかし、現在の状況では17歳と入力した場合に17歳が100カウントされてしまい、「10代以下」の制限がかけられない。どのような処理方法が適切か教えてほしい。
回答を見る
  • ベストアンサー

PHP・MySQL使用で、年齢制限をかける場合の処理について

どなたかお手すきでしたら、稚拙な質問にお付き合いお願い致します。 PHP4.3.8、MySQL4.0.16を使用しております。 アンケートフォームなどで、次のページに遷移するときにDBの年齢の値を 参照して制限をかけるというものを作成しているのですが、なかなかうまくいきません。 それぞれ男性の10代・20代・30代・40代・50代以上、女性についても前記同様で、 それぞれ100人を越えると制限がかかりアンケート終了となるようにしたいのです。 現在の状況ですと、17歳と入力したならば17歳が100カウントされると 制限がかかるようになってしまっており、「10代以下」という括りでの 制限がどうしてもかけられません。 どのように処理をしたらうまくいくのでしょうか? よろしくお願いいたします。 htmlでは下記のコードをincludeして、$limit_overが「1」ならば終了ページに遷移するようにしています。 /**********************/ PHP /**********************/ <?php //----- DB接続 -----// include("./inc_php/db_connect.php"); //アクセスデータリミッター集計 //SQL文を作成 $sql = ""; $sql = "SELECT f1, f2, end_flag, count(log_id) AS log_id_cnt FROM table_test GROUP BY f1, f2, end_flag HAVING (((f1) = ".$f1.") AND ((f2) = ".$f2.") AND ((end_flag) = 1))"; //SQL文を実行する $rs = @mysql_db_query($db,$sql); //行を取得する $row = @mysql_fetch_array($rs); $log_id_cnt = 0; if($row["log_id_cnt"] == NULL){ $log_id_cnt = 0; }else{ $log_id_cnt = (int)$row["log_id_cnt"]; } //リミッター人数オーバーチェック if ( $f1 == 1 && $f2 <= 19 && $log_id_cnt >= 100 || //男性・10代 $f1 == 1 && $f2 >= 20 && $f2 <= 29 && $log_id_cnt >= 100 || //男性・20代 $f1 == 1 && $f2 >= 30 && $f2 <= 39 && $log_id_cnt >= 100 || //男性・30代 $f1 == 1 && $f2 >= 40 && $f2 <= 49 && $log_id_cnt >= 100 || //男性・40代 $f1 == 1 && $f2 >= 50 && $log_id_cnt >= 100 || //男性・50代以上 $f1 == 2 && $f2 <= 19 && $log_id_cnt >= 100 || //女性・10代 $f1 == 2 && $f2 >= 20 && $f2 <= 29 && $log_id_cnt >= 100 || //女性・20代 $f1 == 2 && $f2 >= 30 && $f2 <= 39 && $log_id_cnt >= 100 || //女性・30代 $f1 == 2 && $f2 >= 40 && $f2 <= 49 && $log_id_cnt >= 100 || //女性・40代 $f1 == 2 && $f2 >= 50 && $log_id_cnt >= 100 ){ //女性・50代以上 //リミッター人数オーバー画面出力 //データ追加 //---- 日付け取得 ---- $day_date_01 = ""; $day_date_01 = date("Y/n/j G:i:s"); $lim_over = 1; /* ----- データを更新 ----- */ $sql_w = ""; $sql_w = "UPDATE table_test SET f1 = '".$f1."',f2 = '".$f2."',day_date_01 = '".$day_date_01."',end_flag = 1,lim_over = '".$lim_over."' WHERE (k)='".$k."'"; //SQL文を実行する $rs_w = ""; $rs_w = mysql_db_query($db,$sql_w); } //DBへの接続を切断 @mysql_close($dbHandle); } ?>

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

SQLの部分で10代、20代・・・となるようにすればいいのではないでしょうか? 1.((f2) = ".$f2.")をbetweenにする $f2が17なら (f2 between 10 AND 17) (f2 >= 10 AND f2 < 20)でも良い。 2.GROUP BY FLOOR(f2 / 10)とかにしちゃう。 10代、20代・・の区切りにするのであれば、こんな集計にしてしまっても良いかも。 ただ、実際にはWHEREを使っているので、 $sql = "SELECT count(*) FROM table_test WHERE f1 = '{$f1}' AND f2 between 10 AND 20;"; これだけで事足りるんじゃないかと思います。 if文は単純に$log_id_cnt >= 100だけになりますね。

animack
質問者

お礼

書き込みありがとうございます! 四苦八苦してなんとか思ったとおりの処理が出来るようになりました。 SQL部分で年齢を括るという言葉がとてもヒントになりました!

関連するQ&A

  • !助けて!ZAMPP使用のPHP/MySQLエラー

    ZAMPPを使用しPHP/MYSQLの勉強をし始めた者です。以下のエラーが出て先に進めません。どこが悪いのか教えてください。 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\todo.php on line 33 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\todo.php on line 33 問題のプログラムです。 <?php //---------------------------------------------------------------------- //TODO管理プログラム //---------------------------------------------------------------------- $db_dns = "mysql:host=localhost;dbname=phptest;"; $user = "root"; $pass = ""; //-------SQL $create_query = <<<______ CREATE TABLE items( todo_id INTEGER PRIMARY KEY AUTO_INCREMENT, memo TEXT, flag TEXT, ctime INTEGER); ______; //----------------------------------------------------------------------- //データベースの初期化 $db = new PDO($db_dns,$user,$pass); //データベースが利用できるか確認 $select_stmt = $db->query("SELECT*FROM items LIMIT1"); if(!$select_stmt){//テーブが作成されていない場合 $db->exec($create_query); $now = time(); $db->exec("INSERT INTO items(memo,flag,ctime)". "VALUES('データの初期化','done',$now)"); } //------------------------------------------------------------------------ //TODOを追加する if(isset($_GET['newitem']) && $_GET['newitem'] != ""){ $memo = mysql_real_escape_string($_GET['newitem']); $now = time(); $db->exec("INSERT INTO items(memo,flag,ctime)". "VALUES('$memo','new',$now)"); } //TODOを消化する $to_id = intval($_GET['done']); if ($todo_id > 0){ $db->exec("UPDATE items SET flag='done'". "WHERE todo_id=$todo_id"); } //----------------------------------------------------------------------------- //現在のTODOを表示するHTML $list = ""; //未消化のTODOを抽出 $sql="SELECT*FROM items WHERE flag='new'ORDER BY ctime DESC"; $r = $db->query($sql); foreach ($r->fetchALL() as $row){ $todo_id = $row["todo_id"]; $memo = htmlspecialchars($row["memo"]); $ctime = date("Y-m-d",$row["ctime"]); $btn = "[<a href = '?done=$todo_id'>x</a>]"; $list .= "<li>$btn $memo ($ctime)</li>"; } //消化済みTODOを最大5件抽出 $sql = "SELECT * FROM items WHERE flag = 'done'". "ORDER BY ctime DESC LIMIT 5"; $r = $db->query($sql); foreach ($r->fetchALL() as $row){ $memo = htmlspecialchars($row["memo"]); $ctime = date("Y-m-d",$row["ctime"]); $list .= "<li><s>$memo ($ctime)</s></li>"; } //------------------------------------------------------------------------------- //以下でHTMLを表示 ?><html><body> <h1>TODO</h1> <?php echo $list ?> <form> <h3>新しいTODO</h3> <input type = "text" name= "newitem"/> <input type ="submit" value="追加"/> </form> </body></html> 本当に困り果てています。賢者の方、知恵をお貸しください。

    • ベストアンサー
    • PHP
  • PHP+MySQL 内部結合(INNER_JOIN)がうまく行きません。

    以下の文で「client_master」テーブルと「jobmaster0717」テーブルを内部結合させようとしているのですが、うまく行きません。どこがおかしいのでしょうか? <?php  // データベースサーバへの接続・データベースの選択  $db = mysql_connect('localhost','test','password');  $db_name = 'test';  mysql_select_db($db_name,$db);  // 処理対象テーブル  $tbl_name1 = "client_master";  $tbl_name2 = "jobmaster0717";    // 内部結合(INNER JOIN句)  $str_sql1 = "SELECT * FROM {$tbl_name1}"       . " INNER JOIN {$tbl_name2}"       . " ON {$tbl_name1}.company_ID"       . "  = {$tbl_name2}.client_ID;";  $rs1 = mysql_query($str_sql1,$db);  print "\"{$str_sql1}\"<br>\n";  // 結果セットの表示  show_rs($rs1,$db);  print "<br>\n";  // 結果セット(結果ID)の開放  mysql_free_result($rs1);    // データベースサーバの切断  mysql_close($db); ?>

  • PHPでのMYSQL接続のデータ表示

    PHPのバージョンは4.2.3です。 index.php という一覧表示画面から 一意なKey文字列を受け取りそのデータに合致する データの詳細を表示する画面です。 実データ部分が表示されず困っています。 実行時のPHPのエラーも出力されないので いまいちどこが悪いのかわかりません アドバイスよろしくお願いします。 <?php require_once( "common.php" ); require_once( "const.php" ); if(! $conn = mysql_connect( 'ホスト名','ユーザー名','PASS')){ die( 'MYSQL接続失敗'); } $sql = ""; $sql .= "select * from LIVE "; $sql .= "ORDER BY Date DESC "; $sql .= "WHERE ID=".$_REQUEST[ "KEY" ]; echo $sql; mysql_select_db("DB名",$conn); $rs = mysql_query($sql, $conn); $DATE=$rs['DATE']; $TITLE=$rs['TITLE']; $PLACE=$rs['PLACE']; $ARTIST=$rs['ARTIST']; echo $DATE; echo $TITLE; echo $PLACE; echo $ARTIST; //$rec = mysql_fetch_array( $rs, MYSQL_ASSOC ); ?> <HTML> <HEAD><TITLE>ライブ予定</TITLE></HEAD> <BODY><H1 ALIGN="CENTER">ライブ予定詳細</H1> <A HREF="./">戻る</A> <TABLE BORDER="1" ALIGN="CENTER" WIDTH="100%"> <TR><TD BGCOLOR="#FFFFCC">日付</TD> <TD><?php HESC($rec['DATE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">タイトル</TD> <TD><?php HESC($rec['TITLE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">場所</TD> <TD><?php HESC($rec['PLACE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">アーティスト</TD> <TD><?php HESC($rec['ARTIST']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">本文</TD> <TD></TD></TR> </TABLE> </BODY></HTML>

    • ベストアンサー
    • PHP
  • PHPでMySQLのデータを検索したい

    お世話になります。 PHPでMySQLのデータを検索したいと思い、 以下のようにしてみたのですがうまく表示されません。 -- $name = $_POST["name"]; $link = mysql_connect('localhost', '', ''); $db_selected = mysql_select_db('', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM search WHERE". $name; $result = mysql_query($sql); while($row = mysql_fetch_array($name)) { print $row['name']; } $close_flag = mysql_close($link); -- どう改善すればいいのでしょうか? 初心者の為、少々お見苦しい点があるかと思いますが どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLでもPHPでも出来る処理はどっちでやる?

    「MySQL」「PHP」、何れでも出来るような処理はどちらでやる方が良いのでしょうか? ■例1 … 取得データを正規表現で加工して利用したい場合 ・SQL重視 … 正規表現等を駆使したSQLで、後々利用しやすい形で取得 ・PHP重視 … 普通に取得して、PHPで正規表現を利用して加工 ■例2 … データ取得がヤヤコシイ場合 ・SQL重視 … (例えそれがどんなに長くなっても)SQL文をキチンと組み立て、一度にデータ取得 ・PHP重視 … 簡単なSQL文で一旦データ取得後、PHPのループ文内等処理で、再度DBアクセスしデータ取得 ・ちょっと例えが微妙かもしれないのですが、そもそもデータ取得する際、どのように考えるのが正しいのでしょうか? 1.なるべく利用予定に近い形でデータを取得 2.後で色々加工するかもしれないので、取得時点ではあまり加工せず、そのまま取得 ※要は、頻繁にDBへアクセスしてデータ取得するより、「DBへアクセスするのは極力避け、取得したデータはなるべく使い回す」方が良いのでしょうか? ・それとも、ここら辺はケースbyケースなので、一概には言えないのでしょうか? ・あるいは、別にどっちでもいい? あまり、気にしなくても良い?

    • ベストアンサー
    • MySQL
  • PHP+MySQLでの排他処理とDBクローズ

    <環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPからMySQLのデータベースが作成できない

    PHP:4.4.4 MySQL:4.1.21 です。 PHPからデータベースを作りたいのですがうまくいきません。 以下のように記述しています。 $sql = "CREATE DATABASE ".$DBNAME; $rst = mysql_query($sql,$con); $DBNAMEには作りたいデータベースの名前が入っています。また、$conにはIDが入っており接続はできているようです。しかしこの後で$rstをechoするとTRUEでもFALSEでもなく、何も入っていない状態です。 これはどうすればデータベースをcreateできるのでしょうか? 非推奨のようですがmysql_create_dbを使ってたところ画面が真っ白になってしまいました。

    • 締切済み
    • PHP
  • MySQL 文字化けについて(PHP)

    いつもお世話になっております。 PHPを使用してMySQLからデータを出し入れする際に文字化けが発生し原因がわからず、大変困っております。 MySQL 4.1.18(クライアント 4.1.21) MySQL文字セット UTF-8 Unicode (utf8) 様々なHPを検索して、下記のような一文を入れれば大丈夫と思ったのですが、それでも文字化けは改善されませんでした。 mysql_query("SET NAMES ujis"); 上記文はmysql_connectの直後に記述しております。 INSERT文、SELECT文どちらに不備があるのかわかりません。 ご教授お願い致します。 記述プログラム:(INSERT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "insert into T_YOYAKU values ('1','A','1','あいうえお')"; mysql_query($sql) 省略・・・ 記述プログラム:(SELECT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "select * from T_YOYAKU"; if ( $rs = mysql_query($sql) ) {

    • ベストアンサー
    • MySQL
  • PHP MySQLでエラーがでてしまいます。

    PHP MySQLからデータを取得したいのですが、以下のエラーが出てしまい原因が分かりません。 詳しい方お願い致します。 <b>Warning</b>: json_encode() expects exactly 1 parameter, 2 given in <b>/home/users/2/***.**-********/web/****************/php/seupPharmacyData.php</b> on line <b>21</b><br /> エラーが出るコードは以下になります。 <?php include "db.php"; $sql = "SELECT * FROM user_data"; $query = mysql_query($sql, $db) or die("クエリの送信に失敗しました。<br />SQL:".$sql); $result= array(); while ($row = mysql_fetch_object($query)) { $result[] = array( 'name1' => $row->name1, 'name2' => $row->name2, 'name3' => $row->name3, 'id' => $row->id, ); } //jsonとして出力 header('Content-type:application/json; charset=UTF-8'); echo json_encode($result,JSON_UNESCAPED_UNICODE); ?>

    • ベストアンサー
    • PHP
  • PHPでMySQLへの接続

    お世話になります。 phpを用いてMySQLへ接続したのですが、データが空で戻ってきました。lowは件数表示されましたし、行数もその分返ってきています。何か原因は考えられるでしょうか? <html> <head> <title>PHP TEST</title> </head> <body> <?php $link = mysql_connect('localhost', 'XXXX', 'XXXX'); if (!$link) { die('接続失敗です。'.mysql_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysql_select_db('XXXX', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); //mysql_set_charset('utf-8'); $result = mysql_query('SELECT * FROM sample'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('<p>'); print('id='.$row['str']); print(',name='.$row['etc']); print('</p>'); } $close_flag = mysql_close($link); if ($close_flag){ print('<p>切断に成功しました。</p>'); } ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう