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("データ削除エラー");
(後略)
セキュリティ上問題などがあることは置いておくと【???】の部分の基本は以下のようになります。
id = {$_POST['id']}
これでとりあえず想定内のリクエストなら行削除が出来るようになるでしょう。
本来は更に $_POST['id'] によぶんな文字が入れられないようチェックロジックが必要になったり、そもそもプレースホルダを使ってSQLを実行す
るように修正していく必要があります。
危険性を分かってもらうために例として $_POST['id'] に '13 OR 1=1' というデータが送られてくるケースなどが考えられます。
質問にあるコードは、期待通りの動作をしないと思います。
原因は、
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次元配列は後回しにしてた項目なので、
どのように変更すれば望み通りのスクリプトになるのかイメージできません。
向学のために、実際に動くスクリプトをお示しいただけると非常に嬉しいです。
よろしくお願いします。
参考ページは今後も活用させていただきます。
ご回答ありがとうございます。
セキュリティのご指摘ありがとうございました。
まだローカルテスト段階ですので、これからそちら方面も勉強します。