DBの更新について困っています

このQ&Aのポイント
  • DBを更新するためのコードが分からない
  • 図書リストを更新表示する方法がわからない
  • ログインに失敗した場合のエラーメッセージが表示されない
回答を見る
  • ベストアンサー

DBの更新について困っています

以前 http://oshiete1.goo.ne.jp/qa5494372.html で質問させていただいたものですが、3の『「貸し出し中ではない」本は、「借りる」といるリンクがつく。「借りる」をクリックすると、JavaScriptによるアラートで「本XXXXを借りますか?」と出す。』まで何とかサブルーチンを使って出来たのですが、それ以降の『データベースを更新して云々』が良く分からないのですが、どのようなコードを書けばDBを更新出来て、図書リストを更新表示出来るのでしょうか?よろしくお願いします。 #!/usr/bin/perl #メイン処理 &start; &analysis; if($pass2 eq ''){ &login; }else{ &msg; } #HTMLヘッダー表示サブルーチン sub start{ } #引数解析サブルーチン sub analysis{  #出来ています } #ログインサブルーチン sub login{ print "<center>"; print "<caption><h2>ユーザーログイン</h2></cption>"; print "<form method=\"post\" action=\"./login2.cgi\">"; print "ユーザー名:"; print "<select name=\"user_name\">"; print "<option value=\"1104\">A</option>"; print "<option value=\"1111\">B</option>"; print "</select><br>"; print "パスワード:"; print "<input type=\"password\" name=\"password\"><br>"; print "<input type=\"submit\" name=\"submit\" value=\"ログイン\">"; print "</form>"; print "</center>"; } #図書管理画面を見せるサブルーチン sub display{ use DBI; use strict; my $dbname = "bookmanagement"; my $host = "localhost"; my $user = ""; my $password = ""; my $table = "booktable"; my $conn = DBI->connect("DBI:Pg:dbname=$dbname;host=$host", $user, $password )|| die "DBI connect failed: $DBI::errstr"; my $sql = "select * from $table order by date desc"; my $result = $conn->prepare($sql); my $ref = $result->execute; print <<HEADER; <body> <center> <table border=2> <caption><h2>図書管理システム</h2></caption> <tr bgcolor="#dcdcdc"> <th>ID</th> <th nowrap>本名称</th> <th nowrap>著者</th> <th>説明</th> <th nowrap>登録日</th> <th nowrap>貸出中?</th> <th nowrap>最終貸出日</th> <th nowrap>最終貸出人</th> </tr> HEADER while(my @ref = $result->fetchrow) { print <<ROW; <script type="text/javascript"> <!-- function dialog(msg){ if(confirm(msg)==true){ } } // --> </script> <tr> <td>$ref[0]</td> <td>$ref[1]</td> <td nowrap>$ref[2]</td> <td>$ref[3]</td> <td nowrap>$ref[4]</td> <td nowrap> <a href="#" onClick="dialog('本「$ref[1]」を借りますか?')">$ref[5]</a> </td> <td nowrap>$ref[6]</td> <td><br>$ref[7]</td> </tr> ROW } print <<FOOTER; </table> </center> FOOTER $result->finish; $conn->disconnect; } #パスワード認証ルーチン sub auth{ use DBI; $db_name = "bookmanagement"; $db_host = "localhost"; $db_user = ""; $db_password = ""; $db_table = "usertable"; $ID = $pass1; $password = $pass2; print <<HEADER; <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title></title> </head> <body> HEADER $conn = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_password)||die "DBI connect failed: &DBI::errstr"; $sql = "select userID,pass from usertable where pass='$password'"; $result = $conn->prepare($sql); $ref = $result->execute; ($db_userID,$db_password) = $result -> fetchrow_array(); $result -> finish; if(($db_password eq $password) and ($db_userID eq $ID)){ &display; #DBのパスと入力されたパスが同じなら図書管理画面の表示 } else{ print "ログインに失敗しました。ユーザー名・パスワードを確認してください。"; } $conn -> disconnect; } print <<FOOTER; </body> </html> FOOTER 1;

  • CGI
  • 回答数13
  • ありがとう数17

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

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

こんばんわ^^ 問題点(1): こちらは下記の部分を修正しましょう。 if($ref[5]) eq "貸出中"){ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を返しますか?')\">" . $ref[5] . "</a>"; } else{ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を借りますか?')\">" . $ref[5] . "</a>"; } 修正後 if($ref[5]) eq "貸出中"){ if($ref[7]) eq $ユーザーID){ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を返しますか?')\">" . $ref[5] . "</a>"; } else{ print "<a href=\"#\" onClick=\"javascript:alert('貸出中です')\">" . $ref[5] . "</a>"; } } else{ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を借りますか?')\">" . $ref[5] . "</a>"; } 問題点(2): こちらはヒントを出しますので自力でやってみてください。 サブミット前の画面でセッション変数【reload_flug】= "off" を代入しておきます。 サブミット後のDB更新の際に reload_flugがoffだったらreload_flugをonにしてDB更新、onだったら更新しない。 頑張ってみてください♪

nardobrea
質問者

お礼

いわゆるボタンの2度押し、これはよくやりがちです。 CGIが全く同じパラメータで連続して呼ばれるわけですから、 CGI側で前どんな処理をしたかを覚えておけば、 2度目以降をはじくことはできるはずです。 と上司の方から言われましたが、まだまだ空っぽの脳ではどうすることも…

nardobrea
質問者

補足

こんにちは 実は(1)も自力でやってみたのですが、asteroid-bさんが投稿される少し前に完成したのですが、着眼点が同じだったので似たような結果に なっていました。 しかし(2)の方ですが、少し考えてみたのですが、教えて頂いた方法をjavascript文の所を以下のように書き換えて「F5」ないし「↑↓」を押てみてもダメでした… もう少しヒントを><; <script type="text/javascript"> <!--      var reload_flug=false; function dialog(msg,bookid){ if(reload_flug==false){ reload_flug = true; if(confirm(msg)==true){ document.form1.bookid.value=bookid; document.form1.submit(); } } else{ reload_flug = true; } }     // --> </script>

その他の回答 (12)

回答No.13

おそらく2つ前の行 tie(%session_data, 'Walrus::Session::Lite', $session_dir); が上手くいっていないと思われます・・・・が すみません、Walrus::Session::Liteについて知識がないので 別スレを立ててWalrus::Session::Lite 経験者様からアドバイスを頂いた方が早いと思われます。 別のサイト(参考URL)をみると書き方が前回の参考URLと違うので こちらを参考にしてみるのもありかと思います。 的確な回答ができなくてすみません。

参考URL:
http://digit.que.ne.jp/work/index.cgi?Perl%e3%83%a2%e3%82%b8%e3%83%a5%e3%83%bc%e3%83%ab%2fWalrus%3a%3aSession%3a%3aLite
nardobrea
質問者

お礼

何やら http://d.hatena.ne.jp/PinkSweets/20081110/1226332215 を見てif文で問題の15行目をサイトと同じようにくくってみたら とりあえず通りました。 でもそこで言っている人のように何故かはよく分かりませんが いいのでしょうかねぇ?

nardobrea
質問者

補足

おはようございます。 教えて頂いたURLで試しましたがやっぱり同じエラーを吐き出して しまいました。 一応別スレで求めてみたいと思いますので、何かお分かりになりましたらそちらにご一報頂けたらと(失礼ですかね)。 asteroid-bさんには感謝しきれない程お世話になりました。 誠にありがとうございました。

回答No.12

むむむぅ 私にも未知の領域に入ってきましたね(笑 session フォルダのパーミッションの確認、777でやってみてください。

nardobrea
質問者

補足

どうも sessionフォルダ777でもダメでした><;

回答No.11

こんにちわ お疲れ様です Lite.pmとMD5.pmのパーミッションの確認 session フォルダのパーミッションの確認 どうでしょう?

nardobrea
質問者

補足

お疲れ様です。失礼いたしました。Sessionフォルダとか必要だったんですね…Sessionフォルダ等々入れたら6行目はクリアできました。 ただ単にextlibフォルダにLite.pmとMD5.pmを入れるだけじゃダメなんですね。 今度は15行目のmy @ID = tied(%session_data)->list_session_id; で引っかかりました。 エラー内容はCan't call method "list_session_id" on an undefined value at test.cgi line 15, <DATA> line 64. ということらしいですが、何やら定義がされていないからダメみたいな事を言っているみたいですね

回答No.10

おはようございます。 手ごわいですね^^; #!/usr/local/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); use lib qw(../extlib); 上記のプログラムだけを1行づつ増やして動作確認してください。 エラーが出た行に問題があります。 おそらくuse lib qw(../extlib);かと思いますが エラー個所を確定させるためにやってみてください。 でuse lib qw(../extlib);でエラーだとすると extlibの設置系にミスがあると思われます。 1:スペルの再確認 2:../extlib を ./に変えディレクトリも新規作成し試す。 3:OSがLinuxならばパーミッションの確認。 やってみてください。

nardobrea
質問者

補足

おはようございます。かなり手ごわいです。 6行目のuse Walrus::Session::Lite; で引っかかってしまいました。 >>3:OSがLinuxならばパーミッションの確認。 ということですが、こちらはFreeBSDを使用していてtest.cgiを755に変えてもダメでした。

回答No.9

お疲れ様です^^ とりあえずセッション変数がちゃんと使えるかを確認しましょう。 参考URLのページを参照し まったく別の簡単なプログラムが動くかどうか?やってみてください。

参考URL:
http://d.hatena.ne.jp/d4-1977/20050706
nardobrea
質問者

補足

ありがとうございます。参考URLと同じものをそれぞれtest.cgi、test2.cgiとし、やってみましたが Software error: Can't locate Walrus/Session/Lite.pm in @INC (@INC contains: ../extlib ~~~~~ と出て何かダメっぽいです。ちゃんとLite.pmとMD5.pmをtest.cgiの入っているフォルダの1個前のフォルダextlibに入れといたんですけどねぇ…

回答No.8

こんにちは^^ 前述の問題2ですが、よく考えたらヘビーでした、すみません^^; まず、セッション変数とはPerlで管理する変数の種類です。 貴方がやろうとしたのはjavascriptの普通の変数に格納しようとしています。 上司の方がおっしゃっているように「覚えておく」を実現するのがセッション変数になります。 しかし、こちらも知らなかったのですが Perlでセッション変数を利用する場合モジュールをインストールする必要があるようです。(参考URL) もしインストールできないなら クッキーを利用する方法しか思いつきません。 セッション変数でもクッキーでもプログラミングは同じ流れになります。 作り方ですが 現在は以下のフローになっています。(2重送信の部分のみ) 1:リスト画面表示 ↓ 2:DB更新 ↓ 3:リスト画面表示 これをユーザー送信&受信単位で見ると 1:リスト画面表示 ↓ 2:DB更新&リスト画面表示 になっているので 2をリロードする度に DB更新もセットになります。 これにセッション変数を使用すると 1:リスト画面表示 セッション変数Aに1を設定 ↓ 2:セッション変数Aを受け取り 1なら 0にしてDB更新、1以外なら何もしない。&リスト画面表示。 これで 2を何度リロードしてもDB更新はされません・・・・が! さらにここに落とし穴がw(上の仕様で作ってしまうと時間の無駄になるので言ってしまいます) 3の後に続けて借りる処理・返す処理があった場合に今度は更新されなくなります。 つまり2重送信をブロックするためには最終的に ユーザー送信&受信単位で 1:リスト画面表示 ↓(サブミット) 2:DB更新&画面表示(完了画面表示しクリック等でリスト画面へ移行) ↓(ページ移動) 3:リスト画面表示 ↓ ・・・ に変える必要があります。 この状態で2重送信対象は2になります。 1(3)でセッション変数を代入 2でセッション変数を受け取り条件分岐 です。 頑張ってください。

参考URL:
http://cepheid.blog17.fc2.com/blog-entry-43.html
nardobrea
質問者

お礼

お手上げです。 この連休中に考えてみましたが、頭がパンクしてしまいました

nardobrea
質問者

補足

こんにちは Walrus::Session::Liteを手に入れる事には成功しましたが、 そのあと以降は頭の中で?が散乱しています。似たようなコードも見つける事も出来ず かなりの強敵ですね。終わるのだろうか…

回答No.6

こんにちは、前の問題は自力で解決できたようですね♪ 本を返す部分に入りましょうか。 表示部分の処理は <a href="#" onClick="dialog('本「$ref[1]」を借りますか?')">$ref[5]</a> の部分を修正します。 ROW #ヒアドキュメントの終了 if($ref[5]) eq "貸出中"){ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を返しますか?')\">" . $ref[5] . "</a>"; } else{ print "<a href=\"#\" onClick=\"dialog('本「" . $ref[1] . "」を借りますか?')\">" . $ref[5] . "</a>"; } print <<ROW; これで表示されるダイアログおよびJavaScriptの切り分けが出来ました。 次に更新処理です(DB) $sql = "update books SET lending='貸出中',finallending='2010/01/07',lendinguserid='001' where bookid = 'book01'"; の文が入っているところです。 上記の処理の前に判定をしましょう。 $sql = "select * from books where bookid='" . $book01 . "'"; $result = $conn->prepare($sql); $ref = $result->execute; $lending= $ref[5]; if($lending eq "貸出中"){ #返却処理 新規作成してください。貸出処理を参考にすればOK。 } else{ #貸出処理 ここはすでに出来ていますね。 } ではでは

nardobrea
質問者

補足

こんちはいつもありがとうございます。 教えて頂いたソースを色々修正しながら、何とか貸出処理と返却処理は出来たのですが、 またしても問題点が… 問題点(1):Aさんが借りていた本をBさんがログインしてきて誤って「返却する」リンクを押してしまって「OK」ボタンを      押してしまったら返却処理が出来てしまう。       ↓      最終貸出人に記載されたユーザー人しかできないもしくはそれに似た方法はあるでしょうか? 問題点(2):ちゃんと本Xを返して「借りる」の状態になっているが、F5などの更新関係のボタンを押して「情報を再送信しますか?」と聞かれ、誤って「再試行」を押してしまった時、本Xを貸出処理してしまうという2重送信が行われてしまう。

回答No.5

<<この一行を加えた事によりログイン画面に戻る事はないのですが「ログインに失敗してしまいました」と出てしまいます。 ここらへんは頑張れば自力で解決できると思います。 問題のポイントは下記の条件分岐で否の方に流れているからですね。 if(($db_password eq $password) and ($db_userID eq $ID)){ &display; #DBのパスと入力されたパスが同じなら図書管理画面の表示 } else{ print "ログインに失敗しました。ユーザー名・パスワードを確認してください。"; } 今回は正に流したいのになぜ否にいくのか? 少し頑張ってみてください。自力で解決すればその分経験値があがります。 本日はもう回答できないです。また後日^^

nardobrea
質問者

補足

おはようございます。質問主です。 あちこちの変数をいじっていたら何とか更新画面までとりつくことが 出来ましたが、次のような問題が 問題点:<a href="#" onClick="dialog('本「$ref[1]」を借りますか?','$ref[0]')">$ref[5]</a> としておくと更新された画面で、「貸出中」をクリックすると返却用メッセージが『本「XXXX」を借りますか?』 となってしまいます。本来なら#2の補足に書かしていただいたように返却用なら『本「XXXX」を返却しますか?』 と表示したいのですが恐らく、<a href="#" onClick="dialog('本「$ref[1]」を借りますか?','$ref[0]')">$ref[5]</a> と毎回「借りますか?」と固定しているからダメなんだろうなという予想は付くのですが…、そのあとがどうしても…

回答No.4

そうですね。 メイン処理の部分をみると if($pass2 eq ''){ &login; } とあります。これは$pass2が空の場合ログイン画面を表示するルーチンを呼び出しています。 $pass2とは 引数解析ルーチンで $pass2 = $FORM{'password'}; となっているので HTMLのフォーム内にpasswordという名称の変数を置いてあげることにより解決します。 <form name="form1" action="./※※.cgi" method="post"> <input type="hidden" name="bookid" value=""> <input type="hidden" name="userid" value="$ユーザーID変数"> <input type="hidden" name="password" value="$pass2"> </form> おまけ 本来ならばメイン処理のログインの判定はパスワードでなくユーザーIDで処理するべきです。(でもかまわず先に進みましょう) さらに、もっと複雑なサイトになる場合はユーザーIDをセッション変数に格納します。(そうしないと上のhiddenをすべてのformに組み込まなくてはならなくなります)

nardobrea
質問者

補足

<<本来ならばメイン処理のログインの判定はパスワードでなくユーザーIDで処理するべきです。 そうなんですか…、今回はプルダウンメニュー式にしたのでユーザーIDが空になる事は無いと踏んでパスワードでやってみたんですけどね^^ 確かに <input type="hidden" name="password" value="$pass2"> この一行を加えた事によりログイン画面に戻る事はないのですが「ログインに失敗してしまいました」と出てしまいます。

回答No.3

<<後にそのまま挿入してしまってよいのでしょうか? ダメです^^; 1:更新処理用のサブルーチンを作りましょう。 2:さらにメイン処理の前にデータ受け取りを行う必要があります。 #2で渡される bookid usrid を受け取る方法をマスターしましょう。 参考URLを記載します。 3:1をメイン処理に追加しましょう。 順番は1番最初でいいでしょう。 その際に、「更新処理の必要があるか?」のIF文を利用します。 #メイン処理 if($bookid ne ""){ &update; #1のサブルーチン } &start; &analysis; if($pass2 eq ''){ &login; }else{ &msg; }

参考URL:
http://www.futomi.com/lecture/form/index.html
nardobrea
質問者

お礼

お礼の所で申し訳ありませんが、 図書管理画面を見せるサブルーチンの <th nowrap>最終貸出日</th> <th nowrap>最終貸出人</th> </tr> の後に#2の2:で教えていただいたソースを記入してみたのですが、再度パスワードを入力させる画面に切り替わってしまい自動で再ログインして更新画面を表示してくれません。**.cgiの所はログインサブルーチンの所にも書た./login2.cgiに変更してみたのですが、どのようにしたらよいものでしょうか?

nardobrea
質問者

補足

こんなド素人の為にわざわざありがとうございます。 2:については今回文字数の制限で書けませんでしたが、引数解析サブルーチン用に書いたソースと似たものを書けばよさそうですね。 ちなみに引数解析サブルーチンの中身は if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r//g; $FORM{$name} = $value; } $pass1 = $FORM{'user_name'}; $pass2 = $FORM{'password'}; return; 感じになっています。今日はありがとうございました。もうちょっと頑張ってみようと思います。わからなければ明日もお聞きしたいと思いますのでよろしくお願いします。

関連するQ&A

  • ページング処理ついて困っています

    #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html><head>"; print "<meta http-equiv=\"Content-Type\" content=\"text/javascript; charset=UTF-8\">\n"; print "<title>図書管理システム</title>\n</head>"; print "<body>"; use DBI; $dbname = "bookmanagement"; $host = "localhost"; $user = ""; $password = ""; $table = "booktable"; $conn = DBI-> connect("DBI:Pg:dbname=$dbname;host=$host", $user, $password )|| die "DBI connect failed: $DBI::errstr"; $sql = "select * from $table order by id"; $result = $conn->prepare($sql); $ref = $result->execute; print <<HEADER; <body> <div align="right"><a href="./rental.cgi">ログアウト</a></div> <center> <caption><h2>図書管理システム </h2></caption> <table border=2> <tr bgcolor="#dcdcdc"> <th>ID</th> <th nowrap>本名称</th> <th nowrap>著者</th> <th>説明</th> <th nowrap>登録日</th> <th nowrap>状態</th> <th nowrap>貸出日</th> <th nowrap>貸出人</th> </tr> HEADER while(my @ref = $result->fetchrow) { print <<ROW; <tr> <td>$ref[0]</td> <td>$ref[1]</td> <td nowrap>$ref[2]</td> <td>$ref[3]</td> <td nowrap>$ref[4]</td> <td nowrap>$ref[5]</td> <td nowrap>$ref[6]</td> <td> ROW if($ref[7] eq ""){ print "<br>"; } else{ print "$ref[7]"; } print <<ROW; </tr> ROW } print <<FOOTER; </table> </center> FOOTER $result->finish; $conn->disconnect; 上のコードで今DBの中身が見れるようになっているのですが、一度に全部表示するようになってしまっていて データ数(?)が多すぎてスクロールするのが面倒なので、データを15件ずつに分けて<前へ 次へ>みたいなのを 作りたいと思っているのですが、どのようにしたら分りません。おわかりになる方がいましたら実装する為の コードを教えて頂けないでしょうか?よろしくお願い致します。

    • ベストアンサー
    • Perl
  • セレクトボックスについて

    ログイン画面を作っていまして、セレクトボックスでCさんを選択し、パスワードを間違えて入力(valueの値がパスだと思って頂いて結構です)したらログイン失敗メッセージを出して、リンクからログイン画面に戻れるように下記のコードになっているのですが、 セレクトボックスの値がAさんにリセットされてしまいます。この時、Aさんではなくて最初にセットしたCさんにセットする方法はどのようにするのでしょうか? #ログイン画面用サブルーチン print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; &analysis; &auth; sub analysis{ if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r//g; $FORM{$name} = $value; } $pass2 = $FORM{'password'}; return; sub login{ print <<HEADER; <center> <caption> <h1>ログイン</h1> </cption> <table border="5" bgcolor="cfcfcf" width="300" height="150"> <tr> <td align="center" valign="center"> <form name="form" method="post" action="./rental.cgi"> ユーザー名: <select name="user_name"> <option value="1" $check1>A</option> <option value="2" $check2>B</option> <option value="3" $check3>C</option> </select> <br> <br> パスワード: <input type="password" name="password"> <br> <center> <input type="submit" name="submit" value="ログイン"> </center> </form> </td> </tr> </table> </center> HEADER } #ユーザー認証サブルーチン sub auth{ use DBI; $db_name = "bookmanagement"; $db_host = "localhost"; $db_user = ""; $db_password = ""; $db_table = "usertable"; $ID = $pass1; $password = $pass2; $conn = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_password)||die "DBI connect failed: &DBI::errstr"; $sql = "select userID,pass from usertable where pass='$password'"; $result = $conn->prepare($sql); $ref = $result->execute; print <<HEADER; <script type="text/javascript"> function henkyaku(id){ document.form.user_name.value=id; document.form.submit(); } // --> </script> HEADER ($db_userID,$db_password) = $result -> fetchrow_array(); $result -> finish; if($pass2 eq ''){ &login; } elsif(($db_password eq $password) and ($db_userID eq $ID)){ &display; } else{ print "<center>"; print "ログインに失敗しました。<br>ユーザー名・パスワードを確認してもう一度ログインしてください。<br><br>"; print "<a href=\"./rental.cgi\" onClick=\"henkyaku('$pass1')\">" ."ログインページへ戻る"."</a>"; print "</center>"; } $conn -> disconnect; } print <<FOOTER; </body> </html> FOOTER 1;

    • ベストアンサー
    • CGI
  • ODBCを使用したSQLの使い方を教えてほしいです

    タイトルの内容を調べているのですが、上手くヒットせず、 同じように記述してもエラーになってしまいます。 よくわかりませんので、教えてほしいです。 odbc_connectは通っているようなので、接続はできている と思います。 $rs=odbc_exec($conn,$sql);にてエラーになるようです。 Warning: odbc_exec():が出ます。 よろしくお願いします。 print ("<html>"); print ("<body>"); $conn=odbc_connect('m_db','',''); if (!$conn) { exit("Connection Failed: " . $conn); } $sql = "SELECT * FROM test_table"; $rs=odbc_exec($conn,$sql); if (!$rs) { exit("Error in SQL"); } echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>"; while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; print ("</body>"); print ("</html>");

    • ベストアンサー
    • PHP
  • mysql 最大値 取得 

    mysqlのデータベースから、列の最大値を取り出したいのですが、 以下のように書いているのですが、取得される値が1しか返ってこないです。 間違っているところはあるでしょうか? perlで書いています。 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("SELECT MAX(列名) FROM テーブル名"); my $rv = $sth->execute(); print "$rv";

    • ベストアンサー
    • MySQL
  • 下記バグ("SQL:\"$sql\"の実行に失敗しました。")が表示されます

    ※以下プラグラムが走りません。どこに問題があるか教えて下さい。 <?php /*==   ユーザ履歴確認  dis_career.php ==*/ session_start(); print <<<EOD <HTML> <HEAD> <TITLE>ユーザ履歴の表示</TITLE> EOD; //データベースに接続する $con = mysql_connect("","",""); $selectdb = mysql_select_db("",$con); if ($con == false) { print("データベースに接続できませんでした。"); exit; } $sql = "select * from tbl_user order by uid'"; $result = mysql_query($sql,$con); if ($result == false) { printf("SQL:\"$sql\"の実行に失敗しました。"); exit; } $rows = mysql_num_rows($result); //行数を取得 printf("<CENTER><H2><ユーザ履歴確認></H2></CENTER>"); print("<table border=\"1\" align=\"center\" >\n"); print("<TR><TH><ユーザID></TH><TH>名前</TH><TH>コース名</TH><TH>履歴表示</TH></TR>\n"); if ($rows > 0){ for ($j = 0;$j < $rows;$j++) { print("<FORM ACTION=\"career.php\" METHOD=\"post\" TARGET=\"right\">"); $data=mysql_fetch_object($result); $uid=$data->uid; $name=$data->name; $course=$data->course; print("<TR>"); print("<TD>$uid</TD>"); print("<TD>$name</TD>"); print("<TD>$course</TD>"); print("<INPUT TYPE = \"hidden\" NAME = \"uid\ VALUE=\"$uid\">"); print("<TD><INPUT TYPE = \"submit\" NAME = \"career\ VALUE = \"履歴表示\"></TD>"); print("</TR>"); print("</FORM>"); } } ?> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • FLASHとの連携について

    FLASHに値を渡すためPHPを書いていますが行き詰ってしましました。 下の文面の  $messeid = ?; echo "&res1=".$messeid."&"; の$messeidに<?=$rs['id']?>の値を代入したいのですが出来ません。 ブラウザで確認するとテーブルに値がちゃんと入って表示されますし   $messeid = 1; とするとFLASH側で1と表示されますのでデータベース、FLASHともに通信は出来ているようです。 (xx)/~何卒ご指導お願いいたします。 <?php require_once("DB.php"); $dbUser = "Youser"; // ユーザー名 $dbPass = "Pass"; // パスワード $dbHost = "localhost"; // ホスト名 $dbName = "Database"; // データベース名 $dbType = "mysql"; // データベースの種類 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; // データベースに接続 $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)){ die($conn->getMessage()); } // POSTされたデータを受け取り、エスケープします。 $s_designid = addslashes($_POST['search_designid']); $s_newpass = addslashes($_POST['search_newpass']); $sql = <<<EOS SELECT * FROM passkanri where back_pass = '$s_designid' and new_pass = '$s_newpass'; EOS; //この$messeidにデータベースから得た値を代入したい $messeid = <?=$rs['id']?>; echo "&res1=".$messeid."&"; // SQL文を発行 $result = $conn->query($sql); if (DB::isError($result)) { die ($result->getMessage()); } // 検索件数の表示 $count = $result->numRows(); print "検索結果は" . $count . "件です。<BR>"; if($count > 0){ ?> <TABLE width="450" border="1" cellspacing="0" cellpadding="8"> <TBODY> <TR><TH>ID</TH><TH>DESIGN_ID</TH><TH>BACK_PASS</TH><TH>NEW_PASS</TH></TR> <?php while ($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)) { mysql_query("set names utf8"); ?> <TR> <TD align="center"><?=$rs['id']?></TD> <TD align="center"><?=$rs['design_id']?></TD> <TD align="center"><?=$rs['back_pass']?></TD> <TD align="center"><?=$rs['new_pass']?></TD> <?php } ?> </TBODY></TABLE> <?php } $result->free(); $conn->disconne ?>

    • 締切済み
    • PHP
  • Mysqlから取り出した名簿データの名前をクリックして詳細を表示したい。

    はじめまして。PHP・mysql共に初心者の者です。どなたかお知恵をお貸しください。以下に環境を記します。 Windows2000/sp5 Apache/2.0.55 PHP/5.0.5 MySQL 5.0 簡単な名簿のデータ(ID・名前・年齢・生年月日・住所・電話番号)をMysqlから取り出してブラウザで表示させるだけなんですが、全て表示させるまでは成功しました。 この表示をID・名前・年齢だけにして、名前をクリックすると、その人だけのID・名前・年齢・住所・電話番号が表示されるようにしたいのです。 まったく勉強不足で申し訳ないのですが、行き詰ってしまいました。 どなたか具体的なソースをご教授ください。よろしくお願いします。 以下に、全てのデータ表示のためのソースをさらします。 <?php $dbserver = "localhost"; $dbuser = "root"; $dbpassword = ""; $dbname = "meibo"; $con = mysql_connect($dbserver,$dbuser,$dbpassword); mysql_query("set names sjis"); $selectdb = mysql_select_db($dbname); $sql = "select id, name, age, bday, address, tel, curdate(), (year(curdate())-year(bday)) - (right(curdate(),5)<right(bday,5)) as age from meibo_1"; $rst = mysql_query($sql); $body = mysql_num_rows($rst) . "件のデータがあります。. <br><br>"; $body .= "<table border='1'> <tr> <th NOWRAP>ID</th> <th NOWRAP>氏名</th> <th NOWRAP>年齢</th> <th NOWRAP>生年月日</th> <th NOWRAP>住所</th> <th NOWRAP>電話番号</th>  </tr>"; while ($col = mysql_fetch_array($rst)) { $body .= "<nobr><tr>" . "<td NOWRAP>$col[id]</td>" . "<td NOWRAP>$col[name]</td>" . "<td NOWRAP>$col[age]</td>" . "<td NOWRAP>$col[bday]</td>" . "<td NOWRAP>$col[address]</td>" . "<td NOWRAP>$col[tel]</td>" . "</tr></nobr>"; } $body .= "</table>"; mysql_free_result($rst); $con = mysql_close($con); ?> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> </head> <body> <?=$body?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP+MySQLでの検索結果の横並び表示について

    PHP+MySQLでデータベース作成をはじめた初心者です。 検索結果を横並びにしたかったので他ページを参考にやってみました。 横に並べられるようにはなったのですが、検索結果を横並びで、かつ、4こならべると次の行にうつる方法はどうすればいいのでしょうか? データひとつを■とすると ■■■<改行> ■■■<改行> ■■■<改行> といった感じです。 よろしくお願いいたします。 <?php $host = "localhost"; if (!$conn = mysql_connect($host, "ユーザー", "パス")){ die("MySQL接続エラー.<br />"); } mysql_select_db("データベース名", $conn); $sql = "SELECT * FROM 01_table WHERE on ='1'"; $res = mysql_query($sql,$conn); print("<tr>"); while($row = mysql_fetch_array($res)) { print("<td>".$row["■"]); print("</td>"); } mysql_free_result($res); ?> print("</tr>");

    • ベストアンサー
    • PHP
  • DBの検索

    #!C:\Perl\bin\perl use DBI; $shouhinmei="手袋"; $db=DBI->connect("DBI:mysql:example_DB:localhost","user","password",{RaiseError => 0,PrintError => 1}); if(!$db){ print "接続は失敗です\n"; exit; } $sql="select * from shouhin_tbl"; $sql.="where shouhinmei='" . $shouhinmei . "'"; $sth=$db->prepare($sql); if(!$sth->execute){ print "SQLの失敗です\n"; exit; } *********************************** *********************************** $sth->finish; $db->disconnect; この***で囲まれた部分に、次のような処理を行いたいのですが、どのように書いたらいいのでしょうか。 『selectのSQLが成功したとき、DBのshouhinmeiフィールドに「手袋」がすでにあるならば、そのshouhinmei_idをブラウザに表示させ、』 shouhinmeiフィールドに「手袋」がなければ、 $sql="insert into shouhin_tbl(shouhinmei)"; $sql.="values('" . $shouhinmei . "')"; として追加させたいのですが、『』はどう書いたらいいか教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • mysqlから取り出した検索結果にチェックボックスを付けたい。

    こんばんは。PHP・mysql共に初心者の者です。どなたかお知恵をお貸しください。以下に環境を記します。 Windows2000/sp5 Apache/2.0.55 PHP/5.0.5 MySQL 5.0 簡単な名簿のデータ(ID・名前・年齢・生年月日・住所・電話番号)をMysqlから取り出してブラウザで表示させるだけなんですが、全て表示させるまでは成功しました。 この表示をID・名前・年齢だけにして、各レコードの左端にチェックボックスを配置し、1件または複数件チェックを入れて「詳細を表示」ボタンをおすと、チェックを入れた人のID・名前・年齢・生年月日・住所・電話番号が表示されるようにしたいのです。 while文の中にチェックボックスを組み込んだり、色々と試行錯誤しましたがダメでした。 まったく勉強不足で申し訳ないのですが、どなたか具体的なソースをご教授ください。よろしくお願いします。 以下に、全てのデータ表示のためのソースをさらします。 <?php $dbserver = "localhost"; $dbuser = "root"; $dbpassword = ""; $dbname = "meibo"; $con = mysql_connect($dbserver,$dbuser,$dbpassword); mysql_query("set names sjis"); $selectdb = mysql_select_db($dbname); $sql = "select id, name, age, bday, address, tel, curdate(), (year(curdate())-year(bday)) - (right(curdate(),5)<right(bday,5)) as age from meibo_1"; $rst = mysql_query($sql); $body = mysql_num_rows($rst) . "件のデータがあります。. <br><br>"; $body .= "<table border='1'> <tr> <th NOWRAP>ID</th> <th NOWRAP>氏名</th> <th NOWRAP>年齢</th> <th NOWRAP>生年月日</th> <th NOWRAP>住所</th> <th NOWRAP>電話番号</th>  </tr>"; while ($col = mysql_fetch_array($rst)) { $body .= "<nobr><tr>" . "<td NOWRAP>$col[id]</td>" . "<td NOWRAP>$col[name]</td>" . "<td NOWRAP>$col[age]</td>" . "<td NOWRAP>$col[bday]</td>" . "<td NOWRAP>$col[address]</td>" . "<td NOWRAP>$col[tel]</td>" . "</tr></nobr>"; } $body .= "</table>"; mysql_free_result($rst); $con = mysql_close($con); ?> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> </head> <body> <?=$body?> </body> </html>

    • 締切済み
    • PHP

専門家に質問してみよう