人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

PHP 5.1.6
perl, v5.8.8
MySQL - 5.0.45

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

●質問者: xptree
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CGI HTML MySQL Perl PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●500ポイント ベストアンサー

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

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


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つのファイルを作成し、同じフォルダにおいてください。


<?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;
}
?>

<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>

<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>

<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>
◎質問者からの返答

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

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

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

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

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

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

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

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

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

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


2 ● Mook
●500ポイント

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

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



<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>



<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>
◎質問者からの返答

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

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

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

6人の場合だと

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ