- 締切済み
値が別窓に渡せない
今故あってPHPの勉強をしているのですが 別窓に値を渡す方法がぜんぜん検討がつかないので質問させてください。 要点=OKボタンが押された時社員ナンバーを左から見て一致部分一致 した社員データを親窓内で表示させその後表示させた社員データを クリックすると別窓で詳細を表示させる。 別窓内で別のSQL文を組んでそれで社員データを表示させる なにぶんこのようなサイトを利用するのは初めてです。 乱筆乱文にて失礼いたします。 親窓ソースは以下の通り <haed> <title>データ詳細</title> </haed> <body BGCOLOR="#55FFFF"> <form action = "no_rist5.php" method = "post"> <?php $str_url = "********"; $str_user = "********"; $str_pass = "********"; $str_db = "********"; $link = mysql_connect($str_url, $str_user, $str_pass); if ($link == false) { die("MySQLの接続に失敗しました。"); } //dbを選択 $sdb = mysql_select_db($str_db, $link)or die("データベース選択に失敗しました。"); print'<p><Meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">'; $n_01_key = $_POST["a_key"];//01 $n_02_key = $_POST["b_key"];//02 $n_03_key = $_POST["c_key"];//03 $n_04_key = $_POST["d_key"];//04 print "社員コード"; print '<input name="a_key" type = "text" style = "ime-mode:disabled" size = "5" MAXlength = "5" value="'.$n_01_key.'">'; print '<input name="b_key" type = "submit" value="OK"><br>'; print '社員コード、社員名'; print '<br>'; if($n_02_key=="OK") { if(empty($n_01_key)) { print '<br><font size=3 color="#FF0000">社員コードが入力されていません。</font>'; } else { if(!preg_match("/^[0-9]*$/",$n_01_key)) { print '<br><font color="#FF0000">社員コードに数字以外の値が入力されました。</font>'; } else { $a_sql = "SELECT number FROM no_rist WHERE number LIKE '$n_01_key%' ORDER BY number"; $b_sql = "SELECT enp_name FROM no_rist WHERE number LIKE '$n_01_key%' ORDER BY number"; $rs1 = mysql_query($a_sql,$link)or die(mysql_error()); $rs2 = mysql_query($b_sql,$link)or die(mysql_error()); if($rs1!=NULL) { while($arr_item1 = mysql_fetch_assoc($rs1) and $arr_item2 = mysql_fetch_assoc($rs2)) { foreach($arr_item1 as $key1 => $n_03_key) { foreach($arr_item2 as $key2 => $n_04_key) { print '<a href="http://localhost/no_rist6.php" target="rist">'; print '<input name="c_key" type = "submit" value="'.$n_03_key.'">'; print '</a>'; print '<font color="#55FFFF">■■</font>'; print $n_04_key; } } print "<br>\n"; } } else { print '<br><font size=3 color="#ff0000">社員データがありません。</font>'; } } } } print "\n"; mysql_close($link); ?> </form> </body> </html>
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- UmJammer
- ベストアンサー率58% (115/196)
submitボタンをaタグで囲っても意味がないので、まずこの部分を変更する必要がありますね。 簡単にするならボタンはやめて文字列にすることです。 どうしてもボタンが使いたいならボタンごとにformタグで括るか、あるいはsubmitはやめてbuttonにしてJavaScriptで処理をする、という風になるかと思います。 値はGET(URLに値を埋め込む)でキーとなる値を渡すだけかと思いますが(submitボタンを使う場合はhiddenにキーとなる値を入れてPOSTで渡すことも可能)。
- yuu_x
- ベストアンサー率52% (106/202)
== database.class.inc == <?php class Database { const SERVER = '*****'; const USER_NAME = '*****'; const PASSWORD = '*****'; const NO_ERR = 0; protected $handle = false; protected $position = false; public function __construct( $database_name ) { $this->handle = mysql_connect( self::SERVER, self::USER_NAME, self::PASSWORD ); strlen( $database_name ) && $this->selectDB( $database_name ); } public function __destruct( ) { is_resource( $this->position ) && mysql_free_result( $this->position ); is_resource( $this->handle ) && mysql_close( $this->handle ); } public function __get( $name ) { switch ( $name ) { case 'errNo' : return mysql_errno( $this->handle ); case 'errMsg' : return mysql_error( $this->handle ); } } public function selectDB( $database_name ) { mysql_select_db( $database_name, $this->handle ); } public function query( $query ){ $this->position = mysql_query( $query, $this->handle ); return $this->position ? mysql_num_rows( $this->position ) : false; } public function next( ) { return mysql_fetch_assoc( $this->position ); } } ?> == emp.php == <?php function check_emp_code( $emp_code, &$err_msg ) { if ( empty( $emp_code ) ) { $err_msg = '社員コードが入力されていません。'; return false; } if ( preg_match( '/[^0-9]/', $emp_code ) ) { $err_msg = '社員コードに数字以外の値が入力されました。'; return false; } return true; } ?> == widget.php == <?php function h( $str ) { echo htmlspecialchars( $str ); } ?> # 全角スペースでインデントが入れてあるので、コピーする場合は半角などに変換してください。
- yuu_x
- ベストアンサー率52% (106/202)
== no_rist5.php == <?php header( 'Content-Type: text/html; charset=Shift_JIS' ); isset( $_POST ) or die( ); require_once 'emp.php'; require_once 'database.class.inc'; require_once 'widget.php'; $err_msg = ''; if ( check_emp_code( $n_01_key, $err_msg ) ) { if ( $emp_ary = fetch_emp( $n_01_key, $err_msg ) ) { if ( count( $emp_ary ) == 0 ) { $err_msg = '社員データがありません。'; } } } function fetch_emp( $key, &$db_error ) { $db = new Database( '*****' ); $emp_ary = array( ); if ( $db->query( "SELECT * FROM `no_rist` WHERE `number`='{$key}' LIMIT 1" ) ) { $emp_ary = $db->next( ); } if ( $db->errNo !== Database::NO_ERR ) { $db_error = $db->errMsg; return false; } return $emp_ary; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <haed> <title>データ詳細</title> </haed> <body style="background-color:#55FFFF;"> <?php if ( strlen( $err_msg ) ) : ?> <p style="color: #FF0000; font-size: smaller;"> <?php h( $err_msg ); ?> </p> <?php elseif ( is_array( $emp_ary ) && count( $emp_ary ) ) : ?> <table> <?php foreach ( $emp_ary as $key=>$value ) : ?> <tr> <td><?php h( $key ); ?></td> <td><?php h( $value ); ?></td> </tr> <?php endforeach; ?> </table> <?php endif; ?> </form> </body> </html>
- yuu_x
- ベストアンサー率52% (106/202)
== main.php == <?php header( 'Content-Type: text/html; charset=Shift_JIS' ); isset( $_POST ) or die( ); require_once 'emp.php'; require_once 'database.class.inc'; require_once 'widget.php'; $err_msg = ''; $n_01_key = $_POST[ 'a_key' ]; $emp_ary = array( ); if ( check_emp_code( $n_01_key, $err_msg ) ) { if ( $emp_ary = fetch_emp( $n_01_key, $err_msg ) ) { if ( count( $emp_ary ) == 0 ) { $err_msg = '社員データがありません。'; } } } function fetch_emp( $key, &$db_error ) { $db = new Database( '*****' ); $emp_ary = array( ); if ( $db->query( "SELECT `number`,`enp_name` FROM `no_rist` WHERE `number` LIKE '{$key}%' ORDER BY `number`" ) ) { while ( $row = $db->next( ) ) { $emp_ary[] = $row; } } if ( $db->errNo !== Database::NO_ERR ) { $db_error = $db->errMsg; return false; } return $emp_ary; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <haed> <title>親窓</title> </haed> <body style="background-color:#55FFFF;"> <form action="<?php echo $_SERVER[ 'PHP_SELF' ]; ?>" method="post"> <p> <input type="text" name="a_key" style="ime-mode:inactive" size="5" maxlength="5" value="<?php echo $n_01_key; ?>"> <input type="submit" value="OK"> </p> </form> <?php if ( strlen( $err_msg ) ) : ?> <p style="color: #FF0000; font-size: smaller;"> <?php h( $err_msg ); ?> </p> <?php elseif ( is_array( $emp_ary ) && count( $emp_ary ) ) : ?> <form action="no_rist5.php" method="post" target="rist"> <table> <thead> <th>社員コード</th><th>社員名</th><th></th> </thead> <tbody> <?php foreach ( $emp_ary as $emp ) : ?> <tr> <td><?php h( $emp[ 'number' ] ); ?></td> <td><?php h( $emp[ 'enp_name' ] ); ?></td> <td><button type="submit" name="c_key" value="<?php h( $emp[ 'number' ] ); ?>">詳細</button></td> </tr> <?php endforeach; ?> </tbody> </table> </form> <?php endif; ?> </form> </body> </html>
- yuu_x
- ベストアンサー率52% (106/202)
POST で値は渡せるので考え方はそれでいいと思いますが、それぞれが混在しているため、コーディングがしにくいのではないでしょうか? PHP の話というよりはプログラミングに関する話のように思います。 ひとまず、列挙する部分と、詳細を表示する部分は完全に別ファイルに分離させたほうがよいと思います。 その他、データを受け取る部分、データベースに関する部分、出力に関する部分、エラーに関する部分など、まとめられそうな部分は ファイル、関数、クラスなどに、状況にあわせて選択するとよいと思います。
お礼
なるほど、列挙させて表示させる部分と詳細を表示させる部分を 完全に別々の関数で処理すれば良いって事ですね? なるほど、そこは自分1人では思いつきませんでした。 色々に参考にします。 ありがとうございました。
補足
少々言葉足らずな部分有ったので補足します 親窓(メイン表示部分)=no_rist5.php 小窓(値を渡したい窓部分)=no_rist6.php つまり親窓(no_rist5.php)でデータの概要を列挙させて その中で列挙させたデータの中から1個を選択して それのDB上のプライマリキー部分(この場合のカラム名はnumber) の値を1つだけを独立した子窓(no_rist6.php)に渡して 詳細を表示させたいと言う意味だったのですが・・・ 言葉足らずで申し訳ありませんでした。