500ポイント差し上げます(いるか賞の方のみ)

解決した場合は必ずいずれかの方へいるか賞を付与致します。
php,CGIのどちらでも構いません。
以下を実現するソースコードを記述して頂きたいです。
内容はシンプルです。

文字数の関係で全て書ききれなかったため
http://tool-7.net/?test95
↑こちら↑のフリーページに記載させて頂きました。

サンプルHTMLも作っておきました。
説明にわかりにくい箇所がありましたらトラックバックに書き込んで頂ければ幸いです。

PHP 5.1.6
perl, v5.8.8
MySQL - 5.0.45

どうぞ、よろしくお願い致します。

回答の条件
  • 1人50回まで
  • 登録:2009/06/06 02:38:29
  • 終了:2009/06/08 22:27:35

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/07 13:12:36

ポイント500pt

面白そうな題材でしたので、一応作成してみました。

細かいところは未調整なので、適宜変更ください。


DB は下記を想定しています。

DATABSE NAME = xptree
DATABSE USER = xptree
DATABSE PSWD = xptree
TABLE NAME   = list
     ※ 生成SQL:CREATE TABLE list ( id integer, want_addr integer, next_addr integer );

下記の4つのファイルを作成し、同じフォルダにおいてください。


  • db.php
<?php
// データベース情報
    define( "DB_SERVER", "localhost" );
    define( "DB_USER", "xptree" );
    define( "DB_PASSWORD", "xptree" );
    define( "DB_NAME", "xptree" );

// データベース接続

function execSQL( $sql ) {
    $conn = mysql_connect( DB_SERVER, DB_USER, DB_PASSWORD ) or die("接続エラー");
    mysql_select_db( DB_NAME ) or die("DB選択エラー");
    $res = mysql_query( $sql, $conn )  or die("クエリ実行エラー");
    mysql_close($conn);
    return $res;
}
?>

  • index.php
<html>
<head>
<title>投票</title>
<?php
require("db.php");
$def_id = "N";
$def_ad = "N";

if ( isset( $_POST["vote"] ) ) {
    vote();
}

function vote() {
global $def_id;
global $def_ad;
    if ( !isset( $_POST['id'] ) || !isset( $_POST['want_addr'] ) ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    if ( $_POST['id'] == "選択" || $_POST['want_addr'] == "選択" ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    execSQL( "UPDATE list SET want_addr=".$_POST['want_addr']." WHERE id=".$_POST['id'].";" );
    $def_id = $_POST['id'];
    $def_ad = $_POST['want_addr'];
    print "登録を完了しました<br>\n";
}

function selectOption( $name, $def) {
    $opt = array( "選択", "1","2","3","4","5","6" );
    print "<SELECT name=\"".$name."\">\n";
    foreach ( $opt as $op ) {
        if ( $op == $def ) {
            print "<OPTION VALUE=\"".$op."\"selected>".$op."</OPTION>\n";
        } else {
            print "<OPTION VALUE=\"".$op."\">".$op."</OPTION>\n";
        }
    }
    print "</SELECT>\n";
}

?>
</head>
<body>
<br>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="vote">
    ■現在の番地<br>
    <?php selectOption("id", $def_id ); ?>
    <br><br>
    ■行きたい番地<br>
    <?php selectOption("want_addr", $def_ad ); ?>
    <br><br>
    <input type="submit" value="送信"><br><br>
</form>

<a href="result.php" style="color:#ff0000;">結果</a><br><br><br>
<a href="admin.php" style="color:#ff0000;">管理</a><br>
</body>
</html>

  • result.php
<html>
<head>
<title>結果</title>
<?php
require("db.php");

function showResult() {
    $res = execSQL( "SELECT COUNT(*) AS cnt FROM list WHERE want_addr=0" );
    if ( mysql_num_rows( $res ) > 0 ){
        $row = mysql_fetch_array($res, MYSQL_ASSOC);
        if ( $row['cnt'] == 0 ) {
            $res = execSQL( "SELECT * FROM list ORDER BY id" );
            print "<table border=\"1\">\n";
            print "<tr><th>現在の番地</th><th>次の番地</th></tr>\n";
            while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) ) {
                print "<tr>";
                print "<td>".$row['id']."</td>";
                print "<td>".$row['next_addr']."</td>";
                print "</tr>\n";
            }
            print "</table>\n";
        return;
        }
    }
    print "まだ全員の投票が完了していません<br>";
}

?>
</head>
<body>
<br>
<?php showResult(); ?>
<br>
<div align="left" style="font-size:medium">[<a href="javascript:history.back();">戻る</a>]</div>
</body>
</html>

  • admin.php
<html>
<head>
<title>管理</title>
<?php
require("db.php");

if ( isset( $_POST["reset"] ) ) {
    execSQL("DELETE FROM list");
    for( $i=0 ; $i<6 ; $i++ ) {
        $arI[] = $i+1;
        $arN[] = RAND();
    }
    array_multisort( $arN, SORT_DESC, SORT_NUMERIC, $arI, SORT_DESC, SORT_NUMERIC );
    for( $i=0 ; $i<6 ; $i++ ) {
        execSQL( "INSERT INTO list ( id, want_addr, next_addr ) VALUES ( '".($i+1)."','0' ,'".($arI[$i])."');" );
    }
}

function showList() {

    $res = execSQL( "SELECT * FROM list ORDER BY id" );
    print "<table border=\"1\">\n";
    print "<tr><th>現在の番地</th><th>行きたい番地</th><th>次の番地</th></tr>\n";
    while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) ) {
        print "<tr>";
        print "<td>".$row['id']."</td>";
        print "<td>".$row['want_addr']."</td>";
        print "<td>".$row['next_addr']."</td>";
        print "</tr>\n";
    }
    print "</table>\n";
}

?>
</head>
<body>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="submit" value="リセット" name="reset"><br><br>
</form>
<?php showList(); ?>
<br>
リセットは選択初期化です。 <br>
<div align="left" style="font-size:medium">[<a href="index.php">戻る</a>]</div>
</body>
</html>
id:xptree

回答ありがとうございます。

大変時間が掛かったことと思います。

わざわざありがとうございました。

指定された通り4つのファイルを作成しアップしました。

index.phpにアクセスし、現在の番地と行きたい番地を選択し送信したのですが

「登録を完了しました」と表示されるのですが

送信した情報はデータベースに記録されていないようです。

データベース情報を設定し同じフォルダに4つのファイルをアップし、

データベースにCREATE TABLE list ( id integer, want_addr integer, next_addr integer );を実行しました。

このほかにやることはありましたでしょうか…?

2009/06/08 01:17:07

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/07 13:12:36ここでベストアンサー

ポイント500pt

面白そうな題材でしたので、一応作成してみました。

細かいところは未調整なので、適宜変更ください。


DB は下記を想定しています。

DATABSE NAME = xptree
DATABSE USER = xptree
DATABSE PSWD = xptree
TABLE NAME   = list
     ※ 生成SQL:CREATE TABLE list ( id integer, want_addr integer, next_addr integer );

下記の4つのファイルを作成し、同じフォルダにおいてください。


  • db.php
<?php
// データベース情報
    define( "DB_SERVER", "localhost" );
    define( "DB_USER", "xptree" );
    define( "DB_PASSWORD", "xptree" );
    define( "DB_NAME", "xptree" );

// データベース接続

function execSQL( $sql ) {
    $conn = mysql_connect( DB_SERVER, DB_USER, DB_PASSWORD ) or die("接続エラー");
    mysql_select_db( DB_NAME ) or die("DB選択エラー");
    $res = mysql_query( $sql, $conn )  or die("クエリ実行エラー");
    mysql_close($conn);
    return $res;
}
?>

  • index.php
<html>
<head>
<title>投票</title>
<?php
require("db.php");
$def_id = "N";
$def_ad = "N";

if ( isset( $_POST["vote"] ) ) {
    vote();
}

function vote() {
global $def_id;
global $def_ad;
    if ( !isset( $_POST['id'] ) || !isset( $_POST['want_addr'] ) ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    if ( $_POST['id'] == "選択" || $_POST['want_addr'] == "選択" ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    execSQL( "UPDATE list SET want_addr=".$_POST['want_addr']." WHERE id=".$_POST['id'].";" );
    $def_id = $_POST['id'];
    $def_ad = $_POST['want_addr'];
    print "登録を完了しました<br>\n";
}

function selectOption( $name, $def) {
    $opt = array( "選択", "1","2","3","4","5","6" );
    print "<SELECT name=\"".$name."\">\n";
    foreach ( $opt as $op ) {
        if ( $op == $def ) {
            print "<OPTION VALUE=\"".$op."\"selected>".$op."</OPTION>\n";
        } else {
            print "<OPTION VALUE=\"".$op."\">".$op."</OPTION>\n";
        }
    }
    print "</SELECT>\n";
}

?>
</head>
<body>
<br>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="vote">
    ■現在の番地<br>
    <?php selectOption("id", $def_id ); ?>
    <br><br>
    ■行きたい番地<br>
    <?php selectOption("want_addr", $def_ad ); ?>
    <br><br>
    <input type="submit" value="送信"><br><br>
</form>

<a href="result.php" style="color:#ff0000;">結果</a><br><br><br>
<a href="admin.php" style="color:#ff0000;">管理</a><br>
</body>
</html>

  • result.php
<html>
<head>
<title>結果</title>
<?php
require("db.php");

function showResult() {
    $res = execSQL( "SELECT COUNT(*) AS cnt FROM list WHERE want_addr=0" );
    if ( mysql_num_rows( $res ) > 0 ){
        $row = mysql_fetch_array($res, MYSQL_ASSOC);
        if ( $row['cnt'] == 0 ) {
            $res = execSQL( "SELECT * FROM list ORDER BY id" );
            print "<table border=\"1\">\n";
            print "<tr><th>現在の番地</th><th>次の番地</th></tr>\n";
            while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) ) {
                print "<tr>";
                print "<td>".$row['id']."</td>";
                print "<td>".$row['next_addr']."</td>";
                print "</tr>\n";
            }
            print "</table>\n";
        return;
        }
    }
    print "まだ全員の投票が完了していません<br>";
}

?>
</head>
<body>
<br>
<?php showResult(); ?>
<br>
<div align="left" style="font-size:medium">[<a href="javascript:history.back();">戻る</a>]</div>
</body>
</html>

  • admin.php
<html>
<head>
<title>管理</title>
<?php
require("db.php");

if ( isset( $_POST["reset"] ) ) {
    execSQL("DELETE FROM list");
    for( $i=0 ; $i<6 ; $i++ ) {
        $arI[] = $i+1;
        $arN[] = RAND();
    }
    array_multisort( $arN, SORT_DESC, SORT_NUMERIC, $arI, SORT_DESC, SORT_NUMERIC );
    for( $i=0 ; $i<6 ; $i++ ) {
        execSQL( "INSERT INTO list ( id, want_addr, next_addr ) VALUES ( '".($i+1)."','0' ,'".($arI[$i])."');" );
    }
}

function showList() {

    $res = execSQL( "SELECT * FROM list ORDER BY id" );
    print "<table border=\"1\">\n";
    print "<tr><th>現在の番地</th><th>行きたい番地</th><th>次の番地</th></tr>\n";
    while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) ) {
        print "<tr>";
        print "<td>".$row['id']."</td>";
        print "<td>".$row['want_addr']."</td>";
        print "<td>".$row['next_addr']."</td>";
        print "</tr>\n";
    }
    print "</table>\n";
}

?>
</head>
<body>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="submit" value="リセット" name="reset"><br><br>
</form>
<?php showList(); ?>
<br>
リセットは選択初期化です。 <br>
<div align="left" style="font-size:medium">[<a href="index.php">戻る</a>]</div>
</body>
</html>
id:xptree

回答ありがとうございます。

大変時間が掛かったことと思います。

わざわざありがとうございました。

指定された通り4つのファイルを作成しアップしました。

index.phpにアクセスし、現在の番地と行きたい番地を選択し送信したのですが

「登録を完了しました」と表示されるのですが

送信した情報はデータベースに記録されていないようです。

データベース情報を設定し同じフォルダに4つのファイルをアップし、

データベースにCREATE TABLE list ( id integer, want_addr integer, next_addr integer );を実行しました。

このほかにやることはありましたでしょうか…?

2009/06/08 01:17:07
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/06/08 09:02:47

ポイント500pt

仕様に合わせて変更してみました。

下記の二つのファイルを差し換えてください。



  • index.php
<html>
<head>
<title>投票</title>
<?php
require("db.php");
$def_id = "N";
$def_ad = "N";

if ( isset( $_POST["vote"] ) ) {
    vote();
}

function vote() {
global $def_id;
global $def_ad;
    if ( !isset( $_POST['id'] ) || !isset( $_POST['want_addr'] ) ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    if ( $_POST['id'] == "選択" || $_POST['want_addr'] == "選択" ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    execSQL( "UPDATE list SET want_addr=".$_POST['want_addr']." WHERE id=".$_POST['id'].";" );
    $def_id = $_POST['id'];
    $def_ad = $_POST['want_addr'];
    print "登録を完了しました<br>\n";
}

function selectOption( $name, $def) {
    $res = execSQL( "SELECT COUNT(*) AS cnt FROM list WHERE want_addr=0" );
    if ( mysql_num_rows( $res ) > 0 ){
        $row = mysql_fetch_array($res, MYSQL_ASSOC);
        $num= $row["cnt"];
    }   
    print "<SELECT name=\"".$name."\">\n";
    print "<OPTION VALUE=\"選択\">選択</OPTION>\n";
    for ( $i=1 ; $i<=$num ; $i++ ) {
        if ( $op == $def ) {
            print "<OPTION VALUE=\"".$i."\"selected>".$i."</OPTION>\n";
        } else {
            print "<OPTION VALUE=\"".$i."\">".$i."</OPTION>\n";
        }
    }
    print "</SELECT>\n";
}

?>
</head>
<body>
<br>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    ■現在の番地<br>
    <?php selectOption("id", $def_id ); ?>
    <br><br>
    ■行きたい番地<br>
    <?php selectOption("want_addr", $def_ad ); ?>
    <br><br>
    <input type="submit" value="送信" name="vote"><br><br>
</form>

<a href="result.php" style="color:#ff0000;">結果</a><br><br><br>
<a href="admin.php" style="color:#ff0000;">管理</a><br>
</body>
</html>



  • admin.php
<html>
<head>
<style type="text/css">
<!--
th     { background-color: #e0e0ff;}
td     { background-color: #e0ffe0;}
td.emp { background-color: #ffffff;}
input.err { background-color: #ffe0e0;}
-->
</style>
<title>管理</title>
<?php
require("db.php");

if ( isset( $_POST["reset"] ) ) {
    $num = 6;
    if ( isset($_POST["id_size"]) ) {
        if ( preg_match("/^[0-9]+$/", $_POST["id_size"] ) == true ) {
            $num =$_POST["id_size"];
        }
    }
    execSQL("DELETE FROM list");
    for( $i=0 ; $i<$num ; $i++ ) {
        $arI[] = $i+1;
        $arN[] = RAND();
    }
    array_multisort( $arN, SORT_DESC, SORT_NUMERIC, $arI, SORT_DESC, SORT_NUMERIC );
    for( $i=0 ; $i<$num ; $i++ ) {
        execSQL( "INSERT INTO list ( id, want_addr, next_addr ) VALUES ( '".($i+1)."','0' ,'".($arI[$i])."');" );
    }
}

if ( isset( $_POST["update"] ) ) {
    for( $i=1 ; isset( $_POST["next_addr_".$i] ) ; $i++ ){
        execSQL( "UPDATE list SET next_addr = ".$_POST["next_addr_".$i]." WHERE id = ".$i.";" );
    }
}

function showList() {

    $res = execSQL( "SELECT * FROM list ORDER BY id" );
    $cnt = execSQL( "SELECT next_addr, COUNT(*) AS cnt FROM list GROUP BY next_addr" );
    print "<table border=\"1\">\n";
    print "<tr><th>現在の番地</th><th>行きたい番地</th><th>次の番地</th></tr>\n";
    while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) ) {
        $css = "";
        mysql_data_seek( $cnt, 0 );
        while ( $row2 = mysql_fetch_array($cnt, MYSQL_ASSOC) ) {
            if( $row['next_addr'] == $row2['next_addr'] ) {
                if ( ( $row2['cnt'] != "1" ) || ( mysql_num_rows( $res ) < $row2['next_addr'] ) || ( $row2['next_addr'] <= 0 ))
                    $css = "class = \"err\"";
                break;
            }
        }
        print "<tr>";
        print "<td>".$row['id']."</td>";
        if ( $row['want_addr'] == 0 ) {
            print "<td class=\"emp\">".$row['want_addr']."</td>";
        } else {
            print "<td>".$row['want_addr']."</td>";
        }
        print "<td><input ".$css." type=\"text\" name=\"next_addr_".$row['id']."\" value=\"".$row['next_addr']."\" size=\"10\"></td>";
        print "</tr>\n";
    }
    print "</table>\n";
}

?>
</head>
<body>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="submit" value="リセット" name="reset">
    <input type="text" name="id_size"><br>
    リセットは選択初期化です。 <br>
</form>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <?php showList(); ?>
    <input type="submit" value="更新" name="update">
</form>
<br>
<div align="left" style="font-size:medium">[<a href="index.php">戻る</a>]</div>
</body>
</html>
id:xptree

カスタマイズありがとうございました。

人数設定はできるようになったのですが

送信するたびに番地が少なくなってしまいます。

6人の場合だと

一人が送信すると1番から5番までになり

二人が送信すると1番から4番までになり

数字の大きい番地から減ってしまいます。

確認して頂いてもよろしいでしょうか…

2009/06/08 21:02:32
  • id:kn1967
    (1)データ格納先
    MySQLと書いてあるということは「データはMySQLに格納せよ」という事かな?

    (2)構成
    post.html -- 貴殿が作った送信用フォーム
    receiver.php -- 受信して乱数発生&データベース書き込み
    result.php -- 結果表示
    manager.php -- 管理者用結果表示
    といった具合に機能別にファイルを分けたほうが理解しやすいと思うがどうだろう?
    (phpならば、それぞれ10行程度で出来るので、理解しやすいと思う。)

    xxxポイント差し上げますってのにはあまり興味が沸かないので私は回答を控えますが
    以上、参考になれば・・・。
  • id:xptree
    コメントありがとうございます。

    MySQLのバージョンを記載したのは回答者様によってMySQLの方が使いやすかった場合を考えて一応載せてみました。
    使っても使わなくても構いません。

    構成に関してはとても参考になりました。
    ありがとうございました。
    主旨が変わらなければどのような構成でも構いません。
    回答者様にお任せしたいところです。

    >xxxポイント差し上げますってのにはあまり興味が沸かないので私は回答を控えますが
    こちらに関しましては、回答に労力、時間が掛かる事を考慮して
    最低限このくらいのポイントを付与させて頂く事が礼儀と踏まえてのことでした。
    逆に失礼に当たってしまいましたでしょうか…



  • id:kn1967
    失礼にあたるかどうかは個々によりますので判りませんが
    「いるか賞の方のみ」という言葉に含まれる意味を考えてみてください。

    >使っても使わなくても構いません。
    >主旨が変わらなければどのような構成でも構いません。

    いろいろな方法を知りたいという事であれば、当然そうなりますよね。
    しかしながら、その場合、いるか賞だけ500ポイントで、他の方はどうします?

    仮に、良い回答にも実は500ポイント出すとしても
    「こんなのもあるよ」的にいろいろきたらどうされます?

    「仕様」を決めておけば、ある程度以上のスキルを持つ者であれば、誰が書いても
    内容はほぼ同じようなものになりますので、コメントした次第なのです。
    ご検討ください。
  • id:Mook
    説明不足でした。

    index.php を最初に実行する前に、admin.php でリセットを一回実行してください。
  • id:xptree
    リセットしたら正常に動作できました。
    望み通りのものができました。
    ありがとうございました。
    500ポイント付与させて頂きたいと思います。

    さらに500ポイント追加でカスタマイズをお願いすることは可能でしょうか?

    ■ユーザーの人数設定
    現在は6人で固定ですが、これを管理画面から自由に変更できるようにしたいです。

    ■次の番地を管理者が事前操作
    次の番地は乱数により決められましたが、
    今度は管理画面から事前に次の番地を設定できるようにしたいです。
    誰かどこの番地へ行くかを管理者が自由にできる設定です。

    もちろん気が向いたらで構いません。
  • id:Mook
    コピーしたSQLが問題でした。
    index.php の selectOption 関数直後の SQL を

      SELECT COUNT(*) AS cnt FROM list WHERE want_addr=0
    から
      SELECT COUNT(*) AS cnt FROM list
    にしてください。
  • id:xptree
    Mookさん
    色々とありがとうございました。
    望み通りのものが完成しました。
    また何かありましたらよろしくお願いします。
  • id:b-wind
    これそのままで使うの?
    最低限のSQLインジェクション対策すらしてないよね?。
    説明の簡略化のために省いたんだろうけど。
  • id:xptree
    公にはせず、ごくわずかな身内の間でしか使わないので細かいことはどうでもいいです

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません