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

解決した場合は必ずいずれかの方へいるか賞を付与致します。

↓前回の質問↓
http://q.hatena.ne.jp/1244223506
こちらで作って頂いたソースコードに以下の2つの機能を追加してください。

①行きたい番地を第2希望まで追加

■行きたい番地(第一希望)
■行きたい番地(第二希望)
送信
(同じ番地の選択は不可)


②全員からの送信が完了していない状態で結果(result.php)を表示した場合
現状では「まだ全員の投票が完了していません」と表示されるだけですが
あと何人の投票が完了していないのか
誰の投票がまだ完了していないのか番地が表示されるようにしたいです。


まだ2名の方からの投票が完了しておりません。
詳細は以下の通りです。

2番地の方の投票が完了していません。
5番地の方の投票が完了していません。


以上2つが希望する追加機能です。
カスタマイズするファイルは前回の質問の回答2の状態からでお願い致します。
よろしくお願い致します。

PHP 5.1.6
perl, v5.8.8
MySQL - 5.0.45

回答の条件
  • 1人10回まで
  • 登録:2009/06/21 04:07:27
  • 終了:2009/06/28 04:10:02

回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/06/21 19:21:43

ポイント60pt

とりあえず2のみの対応です。

Result.php の中を下記のように修正でできます。

    $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";
        } else {
            print "まだ".$row['cnt']."名の方からの投票が完了しておりません。<br>\n";
            print "詳細は以下の通りです。<br><br>\n";
            $res = execSQL( "SELECT * FROM list WHERE want_addr = 0" );
            while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
                print $row['id']."番地の方の投票が完了していません。<br>\n";
        }
    }

先の質問のコメントで指摘がありましたが、運用上のセキュリティ対策は

全く考慮されていませんので、運用時は必要な対策を講じてください。


LAN内で仲間内でお遊びで使用する範囲では特に不要と思いますが、これによって

生じる損害に関しては自己責任でお願いいたします。


まぁ、データが見られたり壊されて困るような用途ではないと思いますが。

id:xptree

前回に引き続き回答ありがとうございます。

ご指摘の通りファイルを修正したのですが、ページが表示されません。

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

セキュリティに関しては攻撃されても特に損害はありません。

2009/06/22 05:22:11
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912009/06/25 07:25:56

ポイント10pt

時間が取れたのでもう一点も変更しました。


DB を以下に変更します。

     CREATE TABLE list ( id integer, want_addr1 integer, want_addr2 integer, next_addr integer );


下記の 3つのファイルを変更してください。

  • index.php
<html>
<head>
<title>投票</title>
<?php
require("db.php");
$def_id = "N";
$def_ad1 = "N";
$def_ad2 = "N";
if ( isset( $_POST["vote"] ) ) {
    vote();
}

function vote() {
global $def_id;
global $def_ad1;
global $def_ad2;
    if ( !isset( $_POST['id'] ) || !isset( $_POST['want_addr1'] ) || !isset( $_POST['want_addr2']) ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    if ( $_POST['id'] == "選択" || $_POST['want_addr1'] == "選択" || $_POST['want_addr2'] == "選択" ) {
        print "<font color=\"red\">行き先が設定されていません</font><br>\n";
        return;
    }
    if ( $_POST['want_addr1'] == $_POST['want_addr2'] ) {
        print "<font color=\"red\">同じ行先は選択できません</font><br>\n";
        return;
    }
    execSQL( "UPDATE list SET want_addr1=".$_POST['want_addr1'].", want_addr2=".$_POST['want_addr2']." WHERE id=".$_POST['id'].";" );
    $def_id = $_POST['id'];
    $def_ad1 = $_POST['want_addr1'];
    $def_ad2 = $_POST['want_addr2'];
    print "登録を完了しました<br>\n";
}
function selectOption( $name, $def) {
    $res = execSQL( "SELECT COUNT(*) AS cnt FROM list" );
    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 ( $i == $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_addr1", $def_ad1 ); ?>
    <br><br>
    ■行きたい番地(第二希望)<br>
    <?php selectOption("want_addr2", $def_ad2 ); ?>
    <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>

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

function showResult() {
    $res = execSQL( "SELECT COUNT(*) AS cnt FROM list WHERE want_addr1=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";
        } else {
            print "まだ".$row['cnt']."名の方からの投票が完了しておりません。<br>\n";
            print "詳細は以下の通りです。<br><br>\n";
            $res = execSQL( "SELECT * FROM list WHERE want_addr1 = 0" );
            while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
                print $row['id']."番地の方の投票が完了していません。<br>\n";
        }
    }
}

?>
</head>
<body>
<br>
<?php showResult(); ?>
<br>
<div align="left" style="font-size:medium">[<a href="index.php">戻る</a>]</div>
</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_addr1, want_addr2, next_addr ) VALUES ( '".($i+1)."', '0', '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>行きたい番地1</th><th>行きたい番地2</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_addr1'] == 0 ) {
            print "<td class=\"emp\">".$row['want_addr1']."</td>";
            print "<td class=\"emp\">".$row['want_addr2']."</td>";
        } else {
            print "<td>".$row['want_addr1']."</td>";
            print "<td>".$row['want_addr2']."</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:Mook
    上記は全文ではなく、該当部分のみ記載しているのでご注意ください。
  • id:xptree
    function showResult() {
    より下を修正するのかと勘違いしていました。
    これ自体削除したらできました。
    ありがとうございました。
    問題は半分解決致しましたので250ポイントを確定させて頂きます。
  • id:xptree
    すいません汗
    締め切り期間を意識するのを忘れてしまい自動終了してしまいした。
    未読の回答を閲覧したら改めてポイントを送付させて頂きます。
    失礼致しました。
  • id:Mook
    先の変更もファイル全体を再掲載しているので、ご確認ください。
  • id:xptree
    Mookさん、カスタマイズありがとうございました。
    遅れてしまい申し訳ありませんでした。
    本日、時間が取れたので回答をオープンし、500ポイントを送付させて頂きました。
    また何かありましたら宜しくお願い致します。

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

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

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

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