まだ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("データ削除エラー");

(後略)

回答の条件
  • 1人2回まで
  • 登録:2008/04/03 22:27:37
  • 終了:2008/04/04 05:04:16

回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1419ベストアンサー獲得回数2252008/04/03 22:59:26

ポイント35pt

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

id = {$_POST['id']}

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


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

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

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

id:taroemon

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

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

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

2008/04/04 05:03:18
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/04/03 23:11:45

ポイント35pt

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

原因は、

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';

でいいでしょう。

id:taroemon

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

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

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

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

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

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

よろしくお願いします。

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

2008/04/03 23:58:16
  • id:pahoo
    #2の回答の補足です。
    IE以外のブラウザで期待通りの動作をしない可能性があるということです。
    セキュリティ面については、最近、SQLインジェクション攻撃が増えていますので、#1の方のアドバイスを参考にしてください。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません