プロが教える店舗&オフィスのセキュリティ対策術

以前、こちらでDBの内容をプルダウンメニューで表示させる処理を教えて頂き
下記のコードで実装する事が出来たのですが
<SELECT NAME="DAY">
<?php
$sql = "SELECT day FROM date_tbl ORDER BY day;";
$col = pg_query($con, $sql);
while($data = pg_fetch_array($col)){
?>
<OPTION VALUE="<?php $data['day'] ?>"><?php echo $data['day'] ?></OPTION>
<?php } ?>
</SELECT>

これを応用し、プルダウンメニューでDBの値を選択し
削除ボタンを押せば、選択した項目をDBから削除しようとしています。
しかし実行しても何も起きず自力での解決が出来なくなってしまったので
再度のご教授願えますでしょうか?

以下は自分が考えた処理です。

$del_day = mb_convert_kana($_POST['DAY_DELETE'], "n", "EUC-JP");
if($del_day){
pg_query($con, "DELETE FROM date_tbl WHERE day = '$del_day'");
}

ちなみにDBの構造は下記の通りです。
----------------------
名前 | 日付 | 登録日 |
----------------------
SELECT name,TO_CHAR(day, 'yyyy年mm月dd日') AS day,TO_CHAR(record_date, 'yyyy年mm月dd日') AS record_date
FROM date_tbl ORDER BY day, record_date;");

※DBには名前・日付・登録日があり、日付はTO_CHARで
『2007-04-01』⇒『2007年04月01日』という形に整形しています。

よろしくお願いします。

A 回答 (2件)

こんにちわ。



一つずつ確認していきましょう。

var_dump($_POST['DAY']);←POST値がきちんと送られているか
$del_day = pg_escape_string($_POST['DAY']);
var_dump($del_day);←escapeされているか
$del_day = mb_convert_kana($del_day, "n", "EUC-JP");
var_dump($del_day);←encodingされているか
echo $del_day;

適度にdie()で止めてもOKです。

あと、mb_convert_kanaでencodingしているのは、プログラムとDBで文字コードが違うからですかね?
    • good
    • 0
この回答へのお礼

こんにちは、la_pure様

ご返答が遅れ申し訳ございません。
皆様のご教授のおかげで望んでいた処理が出来ました。

感謝しております。ありがとうございました。

お礼日時:2007/04/12 20:14

データベースのテーブルには基本的にプライマリーキーという一意の値があると便利です。



postgreであれば、date_tbl_id serial のようなカラムがあると、削除する時などに WHERE date_tbl_id = 1 のようにして削除することが出来ます。

----------------------
名前 | 日付 | 登録日 |
----------------------
というデータの場合、登録日が一意であれば

where record_date = 'yyyy-mm-dd' という形式でいいのではないかと思います。

この場合、HTML上では

  <option value="yyyy年mm月dd日">yyyy年mm月dd日
と掲載するのではなく
  <option value="yyyy-mm-dd">yyyy年mm月dd日
になるようにすればいいのではないかと思います。

検索するときに

WHERE to_char(record_date,'YYYY年mm月dd日') = '2007年04月01日'

のようにしても動きますが、上の場合に比べて検索に時間がかかるかと思います。

それと、入力データーをSQL文字列の中に含める場合は、必ずpg_escape_string関数などを使用して、文字をエスケープすることをお勧めします。

 $del_day = mb_convert_kana($_POST['DAY_DELETE'], "n", "EUC-JP");
 if($del_day){
 pg_query($con, "DELETE FROM date_tbl WHERE day = '$del_day'");
 }

と書くのではなく
 $del_day = pg_escape_string($_POST['DAY_DELETE']);
 $del_day = mb_convert_kana($del_day, "n", "EUC-JP");
 if($del_day){
 pg_query($con, "DELETE FROM date_tbl WHERE day = '$del_day'");
 }
のように書くといいのではないかと思います。

この回答への補足

mizuno3様、ご返答ありがとうございます。

再度の質問となってしまいますが、プルダウンメニューでDBの値を選択し
削除ボタンを押してもPOSTで値の取得が出来ないのです。
mizuno3様が教えて頂いた個所以前の問題だと思います…

※例
<SELECT NAME="DAY">⇒これをPOSTで受け取る名前に指定する
<?php
$sql = "SELECT day FROM date_tbl ORDER BY day;";
$col = pg_query($con, $sql);
while($data = pg_fetch_array($col)){
?>
<OPTION VALUE="<?php $data['day'] ?>"><?php echo $data['day'] ?></OPTION>
<?php } ?>
</SELECT>

$del_day = pg_escape_string($_POST['DAY']);
$del_day = mb_convert_kana($del_day, "n", "EUC-JP");
echo $del_day;

としても何も表示されません。
という事はプルダウンで選択した値が取れていないと言う事でしょうか?

ちなみにpg_escape_string関数は使用するとエラーがログに吐き出されて
しまいました。
再度のご教授願えますでしょうか?

補足日時:2007/04/11 12:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!