PHPとPostgresqlのデータの受け渡し。

お世話になります。質問させていただきます。質問文のURLは以下です。
http://ryu669.sakura.ne.jp/ques2
以下のようなツリーBBSを設置しようとしています。サーバーで動作確認しましたが、今回は前回入ったid,time(日時)さえデータが入りません。
前回ご指導いただいた案件は解決いたしました。ありがとうございました。今回はtimeさえ入らないので質問させていただきます。
(ソース表示は小さいのでTeraPad等にコピペしてください)
作成PHPはphp4、データベースはPosygresql8.1,php5.3です。文字コードは全てUTFです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/06/11 17:32:23
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント2000pt

まず最初に確認しておきますが、
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";
id:lonly777

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); //領域を開放
?>

2012/06/07 18:57:02
id:windofjuly

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 />';
2012/06/07 19:46:52

その他の回答1件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

前回指摘があったプレースホルダのやり方に沿ってないと思われます。

普通にSQLを記述したあとに 埋め込みようの変数をセットするようにすればいいでしょう。

id:lonly777

takntさん。すみませんでした。500文字以上の質問は質問欄には登録されないのでコメント欄も制限があるものと思っていました。
次に書籍の内容を長々と書くのは著作権の関係で遠慮があります。著者も読者が困っているのであればある程度はおおめにみてくれるでしょうが、URLの内容は削除します。下のコメント欄を読んでいただいたものとおもい、リアクションがなかったのでNOポイントにしました。またよろしくおねがいいたします。

2012/06/12 12:50:12
id:taknt

わかりました。

コメントに気がつかず 失礼しました。

2012/06/12 12:53:45
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント2000pt

まず最初に確認しておきますが、
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";
id:lonly777

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); //領域を開放
?>

2012/06/07 18:57:02
id:windofjuly

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 />';
2012/06/07 19:46:52
  • id:taknt
    質問にあるリンク先の内容を コメントに 貼り付けてもらっていいですか?
  • id:standard_one
    まずは1つ1つ関数化して、チェックしなければいけない部分を減らしていくというのはどうだろうか
    いや、今回のことに限らず
  • id:papa-tomo
    前回せっかく多くの方が、良いアドバイスをしているのに活かしていないのは、見ていて悲しい感じがしました。1000ポイントでアルバイトを雇っているような・・・
  • id:lonly777
    すみません、前回ご指摘いただいた内容は修正して解決しております。
    前回はプレースホルダを使わなくてもtime等コードで入力する部分はデータ入力されました
    のでなぜなのかなと、今回も内容さわらずに提示させていただきました。
    勉強しておりますので、内容はリンク先でご確認いただきますようお願いいたします。
  • id:lonly777
    お世話になります。以下のスクリプトを前回質問のform.html, insert.htmlを使って
    tbbsのtreebbsテーブルに挿入できております。secondid, thirdidはNULL表示。
    したがいまして、今回はtbbs-ins.incがらみで問題がありそうなので、引き続きあれやこれやスクリプトさわりながら試行錯誤続けます。

    $name = $_POST['name'];
    $title = $_POST['title'];
    $comment = $_POST['comment'];
    $email = $_POST['email'];

    $rs = pg_query_params(
    $db_con,
    "insert into treebbs (name, title, comment, w_time, email, display) values ($1, $2, $3, $4, $5, $6)",
    array($_REQUEST['name'], $_REQUEST['title'], $_REQUEST['comment'], date("Y/m/d h:i:s"), $_REQUEST['email'], 1));
  • id:taknt
    >勉強しておりますので、内容はリンク先でご確認いただきますようお願いいたします。

    リンク先は 改行うまくいってないようなので 非常にみづらい状態でした。

    なので コメント欄に貼り付けてくださいとお願いしたんですが 無視されましたね。
  • id:windofjuly
    うぃんど 2012/06/11 23:36:17
    >taknt 2012/06/11 23:03:06
    >リンク先は 改行うまくいってない

    ソースコードを表示すれば特に問題なく読み取れます。
    だから、回答内のコメントのようなフォローが出来ているわけです。

    しかし、
    回答内コメントにも書いたとおり欠落している部分が多々あり、
    あの程度までしかフォローできなかったのは残念な限りです。

    >無視されましたね

    質問者はコメント欄にて一部ですがコードを書いてます。
    つまり、無視していたのは、takntさんのほうです。

    それを質問者の落ち度であるかのような追い討ちを書き込むなど、
    ポイントをもらえなかった腹いせに見えます。

    いえ、腹いせにしか見えません。

    そのような行為は、自分を貶めるだけですから、
    そのような書き込みは以後やめておくことをお勧めしておきます。
  • id:taknt
    他人の質問にコメントしても 私には 通知きませんし、ちゃんとコメント欄で対応してもらいたかったものです。

  • id:windofjuly
    うぃんど 2012/06/12 07:42:18
    どこに何を書けば誰に通知が行くかなんてことは、
    常連回答者なら知ってるって程度で、
    質問者の場合は知らないほうが多いのではないですかねぇ。

    そもそも、掲示板上でのやりとりなんですから、
    掲示板を読むのが当然と思ってても不思議じゃありませんし、
    コメント欄のコードにしても、私の回答へのコメントにしても、
    質問者は返事をする努力をしてるんです。

    質問者の努力に対して、
    ソースコードを軽く見る程度のこともしなければ、
    質問者がコメント欄に書いたことへのコメントもせず、
    無視しただとか、対応してもらいたかったなどというのは被害妄想です。

    これ以上、同様の書き込みはしないでください。
    あなたも知っているとおり、
    質問者にも回答者にも通知がくるのですから・・・
  • id:taknt
    もちろん理解してもらえればいいです。

    まだ解決されてないということは残念に思って、ああいうふうに コメントしただけです。


    あと
    >無視しただとか、対応してもらいたかったなどというのは被害妄想です。

    とか なんか いろいろ 妄想を膨らませてるようですが 迷惑ですよね。
    別に 私は そうんな 妄想で コメントしているわけでは ありません。

    もう少し いろいろあったら 調べようと思ってましたが、メールが きてなくて
    気づかなかったということです。

    当然のことながら 回答側のコメント欄に書いても 表示が まとまってしまうため
    気づきにくいことは 言うまでもありません。



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

トラックバック

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

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

回答リクエストを送信したユーザーはいません