人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

まだPHPの勉強を初めて間がない初心者です。

HTMLのテーブル内にあるボタンを押すと、
そのボタンを含む1行全体が削除されるというスクリプトが作りたいです。
そこで下記のスクリプトを作成しましたがうまくいきません。
【???】の部分をどう書けば良いのでしょうか?
スクリプトではユーザ定義関数を使ってるので、
グローバル変数なども使わなければならないと思うのですが、
それについてもご回答ください。

(前略)

showAllMySQLData(NULL);

function showAllMySQLData($result){
if ($result == NULL){
$result = mysql_query("SELECT * FROM hoge") or exit;
}
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$id = $row['id'];
$title = $row['title'];

//データを表示する
echo "<tr>";
echo "<td>" . $id . "</td>";

//削除用ボタン
echo "<form method=\"POST\" action=\"".$_SERVER["PHP_SELF"]."\">";
echo "<td><input type=\"submit\" value=\"削除\" name=\"sub1\"></td>";
echo "<input type=\"hidden\" value=\"".$row["id"]."\" name=\"del\">";

echo "<td>" . $title . "</td>";
echo "</tr>";
}
}

// データを削除する
$sql = "DELETE FROM hoge WHERE 【???】";
mysql_query($sql, $conn) or die("データ削除エラー");

(後略)

●質問者: taroemon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:DELETE echo EXIT hoge HTML
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●35ポイント

セキュリティ上問題などがあることは置いておくと【???】の部分の基本は以下のようになります。

id = {$_POST['id']}

これでとりあえず想定内のリクエストなら行削除が出来るようになるでしょう。


本来は更に $_POST['id'] によぶんな文字が入れられないようチェックロジックが必要になったり、そもそもプレースホルダを使ってSQLを実行す

るように修正していく必要があります。

危険性を分かってもらうために例として $_POST['id'] に '13 OR 1=1' というデータが送られてくるケースなどが考えられます。

◎質問者からの返答

ご回答ありがとうございます。

セキュリティのご指摘ありがとうございました。

まだローカルテスト段階ですので、これからそちら方面も勉強します。


2 ● pahoo
●35ポイント

質問にあるコードは、期待通りの動作をしないと思います。

原因は、

echo "<form method=\"POST\" action=\"".$_SERVER["PHP_SELF"]."\">";
echo "<td><input type=\"submit\" value=\"削除\" name=\"sub1\"></td>";
echo "<input type=\"hidden\" value=\"".$row["id"]."\" name=\"del\">";

この form が while ループで繰り返し表示されるためです。[削除]ボタンに対応する $id を $_SERVER["PHP_SELF"] に渡すのが目的ですが、そうなっていません。

そこで、form タグは while ループの外側に記述し、

echo "<td><input type=\"submit\" value=\"削除\" name=\"sub[" . $id . "]\"></td>";

とします。これで、$_POST['sub'][] の2次元配列の2時限目の添え字に $id が渡されます。foreach で取り出せばいいでしょう。質問にあるような hidden で $id を記述する必要はありません。

このあたりのロジックは「PHPでチェックボックスを配列のように扱う」を参照ください。


ここまでできていれば、SQL文は

DELETE FROM hoge WHERE id='$id';

でいいでしょう。

◎質問者からの返答

ご回答ありがとうございます。

いただいたご回答を読み返して、調べてみたりしたのですが、

私が理解して活用するにはちょっと難しいようです。

特に2次元配列は後回しにしてた項目なので、

どのように変更すれば望み通りのスクリプトになるのかイメージできません。

向学のために、実際に動くスクリプトをお示しいただけると非常に嬉しいです。

よろしくお願いします。

参考ページは今後も活用させていただきます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ