お世話になります。質問させていただきます。質問文のURLは以下です。
http://ryu669.sakura.ne.jp/ques2
以下のようなツリーBBSを設置しようとしています。サーバーで動作確認しましたが、今回は前回入ったid,time(日時)さえデータが入りません。
前回ご指導いただいた案件は解決いたしました。ありがとうございました。今回はtimeさえ入らないので質問させていただきます。
(ソース表示は小さいのでTeraPad等にコピペしてください)
作成PHPはphp4、データベースはPosygresql8.1,php5.3です。文字コードは全てUTFです。
まず最初に確認しておきますが、
pg-query-paramsはphp5.1.0以降にしかありませんのでphp4では動きません。
http://jp2.php.net/manual/ja/function.pg-query-params.php
php4、5のどちらでも動くコードを書きたいならば、
PEARのMDB2を使うことなどで対応することになりますが、
過去のバージョンに囚われて遅くなる方法を選択するのは賢くはありませんので、
開発環境にもphp5を用意しましょう(本題とは外れるので詳細は書きませんが、
1つのパソコン上でphp4と5を並行利用することは可能です)
http://pear.php.net/manual/ja/package.database.mdb2.php
>サーバーで動作確認しましたが・・・
あなたがサーバーにアップしたというソースコードがしめされていないので、
あくまでも想像の域を出るものではありませんが、
$_REQUESTで得られるはずの値が期待通りではないのだと思われます。
以前行っていたように、送信された内容を確認したものを$nameや$titleなどに入れるようにして、
それらすべてがOKならばpg_query_paramsで$nameなどをPostgreSQLに登録するという流れにしたほうが良いでしょう。
セキュリティの観点からも、$_REQUESTの値をそのまま使うのは良くありません。
pg_query_paramsで対処するのはPostgreSQLへの攻撃であって、
その中に例えばHTMLタグやjavascriptなどを埋め込まれると、
ブラウザ側でトラブルとなる間接攻撃になるからです。
$rs = pg_query_params( $db_con, "insert into treebbs (name, title, comment, w_time, email, display) values ($1, $2, $3, $4, $5, $6)", array($name, $title, $comment, date("Y/m/d h:i:s"), $email, 1)) or die(pg_last_error());
ログを見ろといわれてもちょっと難しいかもしれませんので、
エラー出力or die(pg_last_error())も付けておくと良いでしょう。
雑談:
printは関数ではないので(かっこ)は不要です。
(かっこ)は少しでも少ないほうが見やすくて、見やすいコードはデバッグもしやすいです。
1.動くけれども推奨できない書き方 print("<font color='#ff11ff'><tt><b>RE</b>:</tt></font>\n"); 2.print構文としては正解だけどHTMLの構文がおかしい書き方 print "<font color='#ff11ff'><tt><b>RE</b>:</tt></font>\n"; 3.古いHTMLの書き方 print '<font color="#ff11ff"><tt><b>RE</b>:</tt></font>' . "\n"; 4.現代風の書き方(FONTタグは非推奨) print '<tt style="color:#ff11ff"><b>RE</b>:</tt>' . "\n";
前回指摘があったプレースホルダのやり方に沿ってないと思われます。
普通にSQLを記述したあとに 埋め込みようの変数をセットするようにすればいいでしょう。
takntさん。すみませんでした。500文字以上の質問は質問欄には登録されないのでコメント欄も制限があるものと思っていました。
次に書籍の内容を長々と書くのは著作権の関係で遠慮があります。著者も読者が困っているのであればある程度はおおめにみてくれるでしょうが、URLの内容は削除します。下のコメント欄を読んでいただいたものとおもい、リアクションがなかったのでNOポイントにしました。またよろしくおねがいいたします。
わかりました。
コメントに気がつかず 失礼しました。
まず最初に確認しておきますが、
pg-query-paramsはphp5.1.0以降にしかありませんのでphp4では動きません。
http://jp2.php.net/manual/ja/function.pg-query-params.php
php4、5のどちらでも動くコードを書きたいならば、
PEARのMDB2を使うことなどで対応することになりますが、
過去のバージョンに囚われて遅くなる方法を選択するのは賢くはありませんので、
開発環境にもphp5を用意しましょう(本題とは外れるので詳細は書きませんが、
1つのパソコン上でphp4と5を並行利用することは可能です)
http://pear.php.net/manual/ja/package.database.mdb2.php
>サーバーで動作確認しましたが・・・
あなたがサーバーにアップしたというソースコードがしめされていないので、
あくまでも想像の域を出るものではありませんが、
$_REQUESTで得られるはずの値が期待通りではないのだと思われます。
以前行っていたように、送信された内容を確認したものを$nameや$titleなどに入れるようにして、
それらすべてがOKならばpg_query_paramsで$nameなどをPostgreSQLに登録するという流れにしたほうが良いでしょう。
セキュリティの観点からも、$_REQUESTの値をそのまま使うのは良くありません。
pg_query_paramsで対処するのはPostgreSQLへの攻撃であって、
その中に例えばHTMLタグやjavascriptなどを埋め込まれると、
ブラウザ側でトラブルとなる間接攻撃になるからです。
$rs = pg_query_params( $db_con, "insert into treebbs (name, title, comment, w_time, email, display) values ($1, $2, $3, $4, $5, $6)", array($name, $title, $comment, date("Y/m/d h:i:s"), $email, 1)) or die(pg_last_error());
ログを見ろといわれてもちょっと難しいかもしれませんので、
エラー出力or die(pg_last_error())も付けておくと良いでしょう。
雑談:
printは関数ではないので(かっこ)は不要です。
(かっこ)は少しでも少ないほうが見やすくて、見やすいコードはデバッグもしやすいです。
1.動くけれども推奨できない書き方 print("<font color='#ff11ff'><tt><b>RE</b>:</tt></font>\n"); 2.print構文としては正解だけどHTMLの構文がおかしい書き方 print "<font color='#ff11ff'><tt><b>RE</b>:</tt></font>\n"; 3.古いHTMLの書き方 print '<font color="#ff11ff"><tt><b>RE</b>:</tt></font>' . "\n"; 4.現代風の書き方(FONTタグは非推奨) print '<tt style="color:#ff11ff"><b>RE</b>:</tt>' . "\n";
windofjuly様。ご指導ありがとうございます。
パソコンでは動作確認せず、サーバーにアップして確認しています。
下記が本日テストUPしたいくつかのファイルの1つtbbs-ins.incです。
他のファイルとのからみでバグがないことを祈っております。
送信された内容の確認とは、以下のようにすることでしょうか。phpファイルでの保存になりますね。
$second_in ="";
if(empty($second_in)){ print "空の値です";
}else{ print "空の値ではありません";}
ただ、名前等を空欄でsubmitしたときに、記入漏れのチェックの「○○が記入されていません」というメッセージが表示されません。
//---------------------記入漏れのチェック------------------------
コメント欄にうまく表示されないのでURL記載のhtmlファイルのソースでご覧ください。
//------------------------書き込みを追加-------------------------
$name = $_POST['name'];
$title = $_POST['title'];
$comment = $_POST['comment'];
$email = $_POST['email'];
switch($swi) {
case 0:
$rs = pg_query_params(
$db_con,
"insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)",
array($secondid_in, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1));
break;
case 1:
$rs = pg_query_params(
$db_con,
"insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)",
array($id, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1));
break;
if ($rs == false){
print("実行に失敗しました。"); //sql文を実行できないときの表示
exit; //終了
}
pg_freeresult($rs); //領域を開放
?>
break;
} ←これが抜けてますが、それ以外にも意図的に消している部分がありそうですね。
if ($rs == false){
抜けている(抜いている)部分はさておいたとしても、
他の部分をどのように改造しているのかがまったくもって不明のため、
引き続き、自力解決してもらうヒントしか出せません(解決するのかな?)
ひとまず、自力解決するための第一歩として、
例えば下記のような具合に、どの部分を通過しているかを示す出力と、
その時点で変数がどのような中身になっているかを示す出力を行うようにします。
<?php echo 'データ受取を開始します<br />'; /* 入力値のチェック 長くなるので、とりあえずHTMLタグのエスケープだけで済ませてますが、 実際にはemailアドレスとして正しいかどうかを正規表現で確認したり、 名前やタイトル、コメントなどが空白文字だけだったりしないかの確認をすべきところです。 */ $err = ''; //エラー情報 if (isset($_POST['name'])) { $name = htmlspecialchars($_POST['name']); } else { $err .= '名前が記入されていません。<br />'; }; if (isset($_POST['title'])) { $name = htmlspecialchars($_POST['title']); } else { $err .= 'タイトルが記入されていません。<br />'; }; if (isset($_POST['comment'])) { $name = htmlspecialchars($_POST['comment']); } else { $err .= 'コメントが記入されていません。<br />'; }; if (isset($_POST['email'])) { $name = htmlspecialchars($_POST['email']); } else { $err .= 'メールが記入されていません。<br />'; }; if ($err != '') { echo $err; exit; // ここで終了 } echo<<<EOT 下記条件でデータ書き込みを開始します。<br /> swi=$swi<br /> id=$id<br /> secondid_in=$secondid_in<br /> thirdid_in=$thirdid_in<br /> name=$name<br /> title=$title<br /> email=$email<br /> comment=$comment<br /> EOT; switch($swi) { case 0: $rs = pg_query_params ( $db_con, "insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)", array($secondid_in, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1) ); break; case 1: $rs = pg_query_params ( $db_con, "insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)", array($id, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1) ); break; default: echo '$swiの値が0でも1でもありませんでした。'; } if (!$rs) { print("実行に失敗しました。"); //sql文を実行できないときの表示 exit; //終了 } pg_freeresult($rs); //領域を開放 echo '登録から書き込みまで終了しました。<br />';
windofjuly様。ご指導ありがとうございます。
2012/06/07 18:57:02パソコンでは動作確認せず、サーバーにアップして確認しています。
下記が本日テストUPしたいくつかのファイルの1つtbbs-ins.incです。
他のファイルとのからみでバグがないことを祈っております。
送信された内容の確認とは、以下のようにすることでしょうか。phpファイルでの保存になりますね。
$second_in ="";
if(empty($second_in)){ print "空の値です";
}else{ print "空の値ではありません";}
ただ、名前等を空欄でsubmitしたときに、記入漏れのチェックの「○○が記入されていません」というメッセージが表示されません。
//---------------------記入漏れのチェック------------------------
コメント欄にうまく表示されないのでURL記載のhtmlファイルのソースでご覧ください。
//------------------------書き込みを追加-------------------------
$name = $_POST['name'];
$title = $_POST['title'];
$comment = $_POST['comment'];
$email = $_POST['email'];
switch($swi) {
case 0:
$rs = pg_query_params(
$db_con,
"insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)",
array($secondid_in, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1));
break;
case 1:
$rs = pg_query_params(
$db_con,
"insert into treebbs (secondid, thirdid, name, title, email, comment, w_time, display) valuse ($1, $2, $3, $4, $5, $6, $7, $8)",
array($id, $thirdid_in, $name, $title, $email, $comment, date("Y/m/d h:i:s"), 1));
break;
if ($rs == false){
print("実行に失敗しました。"); //sql文を実行できないときの表示
exit; //終了
}
pg_freeresult($rs); //領域を開放
?>
break;
2012/06/07 19:46:52} ←これが抜けてますが、それ以外にも意図的に消している部分がありそうですね。
if ($rs == false){
抜けている(抜いている)部分はさておいたとしても、
他の部分をどのように改造しているのかがまったくもって不明のため、
引き続き、自力解決してもらうヒントしか出せません(解決するのかな?)
ひとまず、自力解決するための第一歩として、
例えば下記のような具合に、どの部分を通過しているかを示す出力と、
その時点で変数がどのような中身になっているかを示す出力を行うようにします。