たびたびすみませんが質問させてください。
現在、掲示板に削除機能をつけたいと思いいろいろ調べてやってみてるのですが、
削除されません。具体的にやりたいこととしては、投稿者が投稿後に削除したい場合、
記事内のアイコンをクリックすることで削除出来るようにすることで、
削除するための条件は投稿日時を使ってます。
コードは以下ですが、実際のコードはテーブルとか使ってて長いので、関係あるところだけ書きます。
$ps = $db->query("SELECT table2.nam,table2.icon,table1.mes,
table1.gaz,table1.dat FROM table2 JOIN table1
ON table2.nam = table1.nam ORDER BY ban DESC");
while($r = $ps->fetch()){
$dat = $r['dat']; //投稿日時
中略
print "<div align='right'><form acton='g_del.php' method='POST'>
<input type='hidden' name='del' value='$dat'>
<input type='image' src='./gz_icon/del.jpg' width='15' height='20' alt='削除'>
</form></div><br>";
}
------------------------------------
g_del.php
------------------------------------
require_once("db_init.php");
if(isset($_POST['del'])) $del=$_POST['del']; else $del="";
if($del != ""){
$delete = $db->prepare("DELETE FROM table2 WHERE dat = $del");
$delete->execute();
header('Location: g.php');
}
以上です。何かおかしいところがありましたら教えてください。
よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
ちなみに・・・prepareで処理するならこんなかんじです
<?php
try{
$user = '...';
$password = '...';
$dsn = 'mysql:host=localhost; dbname=testdb';
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$del=isset($_POST['del'])?$_POST['del']:"";
$data=array($del);
$query="DELETE FROM table2 WHERE dat=?";
$stmt = $pdo->prepare( $query);
$stmt->execute($data);
}catch(PDOException $e){
die($e->getMessage());
}
>yambejpさん
コードまで書いていただき感謝です!お手数おかけしてすみません!
で、コピペでやってみたのですが、削除出来ません(;+_+;)
No3のお返事にも書きましたが、記事番号でやっても出来なくて、
どこで引っかかっているのか、ちょっとなんとか調べてみようと思います。
原因がわかったら改めてご報告とお礼をさせていただきます。
どうもありがとうございました。
No.9
- 回答日時:
><input type='hidden' name='del'>に元のように<input type='hidden' name='del' value='$id'>
>としないとidは渡っていないように見えますが?
>今回の処理の場合、削除条件を ban=21 としているので、idって必要ないと思ってvalueを
>つけなかったんですが、必要なんでしょうか?
<input type='hidden' name='del'>でデータを送ると
当然GETのパラメータでdel=(空)になりますね
$del=isset($_GET['del'])?$_GET['del']:"";
のロジックでは$_GET['del']は「空データ」セットされているので
$delはまさに""になり
if($del != ""){
//この中にははいってきません
}
このさいダミーでよいので
<input type='hidden' name='del' value="99999">
みたいに適当な数値でよいので付けておくのが吉
デバッグ用に
if($del != ""){
$data=array($del);
$query="DELETE FROM table2 WHERE dat = ?";
$stmt = $pdo->prepare( $query);
$stmt->execute($data);
}else{
echo $del."が不明";
}
のような条件分けをしてみるとかでしょうかねぇ
>yambejpさん
あ、すみません、入れ違いで書き込みしていただいたようで、補足の方へ書いたのですが、
value='delete' を入れたら出来ました。valueは必要だということですね。
教えていただきほんとにどうもありがとうございます!
明日は元のコードに戻ってやってみます。またご報告します。
ほんとにどうもありがとうございました!
No.8
- 回答日時:
ちょっと微妙になってきていますね・・
>print "<form action='g_del2.php' method='POST'>
><input type='submit' name='del' value='削除'>
></form>";
>
>require_once("db_init.php");
>$del=isset($_GET['del'])?$_GET['del']:"";
>if($del != ""){
>$db->query("DELETE FROM table1 WHERE ban=21");
むしろこれが動く方が変ですが
GETで処理するなら送り側は
<form action='g_del2.php' method='GET'>
ですよね?
上記例だとGETでdelが渡っていないので
if($del != ""){
$db->query("DELETE FROM table1 WHERE ban=21");
}
が条件として合致しないはずですが・・・
(ban=21がスタティックにbanを渡しているのはテストでしょうから
とりあえずOKとします)
続きの方
>print "<form action='g_del2.php' method='POST'>
><input type='hidden' name='del'>
><input type='image' src='./gz_icon/del.jpg' width='15' height='20' alt='削除'>
></form>
とあって
>URLのところには http://localhost/gz/g_del2.php?del=&x=7&y=12
えーと
<input type='hidden' name='del'>に元のように<input type='hidden' name='del' value='$id'>
としないとidは渡っていないように見えますが?
(これもmethod=POSTとしているのにgetが渡っているみたいなので
単に転記ミスなのでしょう)
>yambejpさん
いやもうほんとに申し訳ないです!お忙しいのにほんとごめんなさい!
はい、転記ミスです。小分けにしてあっちこっちからコピペしてたので、ごちゃごちゃになって
しまってました(だったら送信する前にしっかりチェックしろよって話ですよね、すみません(;・∀・))
もう一つ転記ミスは3行目が </form> じゃなくて </form>"; です、すみません。
整理すると、最初に書いたほうは$_GETではなく$_POSTで処理しています。
で、削除ボタンだとうまくいくのに画像だと出来ません。$_GETでもやってみたのですが出来ませんでした。
で、
><input type='hidden' name='del'>に元のように<input type='hidden' name='del' value='$id'>
としないとidは渡っていないように見えますが?
今回の処理の場合、削除条件を ban=21 としているので、idって必要ないと思ってvalueを
つけなかったんですが、必要なんでしょうか?
No.7
- 回答日時:
>とりあえず途中経過です。
まず「acton」のつづりが「action」になっているか確認
「value='$id>」のクォーテーションとじてます?「value='$id'>」
そのうえで、一度POSTをやめてgetにしてイメージをクリックしたときに
g_del.php?del=・・・
になるかどうかチェックしてください
まぁイメージでやるとx=・・・・&y=・・・)も付加されると思いますが
xやyを別の定義でパラメータ渡ししていなければ問題ありません。
その際、delで渡される値が、ちゃんと想定した値になっているかも
チェックした方がよいでしょう。
>yambejpさん
ご、ごめんなさい!これについては昨日気がついて自分でやるのは直してやってたんです。
お返事に書こうかどうしようかと迷ったんですけど、まあいっかと思って(;'∀')、
お気を使わせてしまってほんとにすみませんでした!
でも気にしていただいてものすごく嬉しいです!
とりあえず今日はこれから、基本的に一番簡単なやり方で(別ページに簡易の送信
ボタンを作って、その情報を受けてデータベース接続後、
$db->query("DELETE FROM table1 WHERE ban = 1")みたいに具体的な値を
入れてやるところから)やって、どこで詰まってるのかを調べてみたいと思います。
お返事ほんとにどうもありがとうございました。
No.4
- 回答日時:
>データ型はDATETIMEで、2015-11-29 12:02:59 という風に表示されています。
>これではダメということでしょうか?
prepareするDELETE文を表示して、
DELETE FROM table2 WHERE dat = '2015-11-29 12:02:59'
というように、日時部分が「'」で囲まれた文字定数になっている必要があります。
そうでなければ日付部分は、2015 - 11 - 29 = 1975 といった整数の減算として扱われます。その後ろに時刻もどきがある場合は、未検証ですが、少なくとも日時の比較にはなりません。
dat = 1975 のような検索条件になりますから、当然、行はヒットしないことになります。
>chukenkenkouさん
小さい子に教えるくらいわかりやすくていねいに教えていただき大変恐縮です。
なるほどです! 日時でやる場合はフォーマットしてからということですね。
今現在ちょっとどうもそれ以前のところで詰まってる感じなので、うまく出来るようになったら
教えていただいたやり方でもやってみたいと思います。
どうもありがとうございました!
No.3
- 回答日時:
>>hiddenでなにか渡そうとしていますが、さすがにNGでしょう
>これはセキュリティ的にという意味ですか?ここをどうすれば良いのか?
>調べてもわかりませんでした。投稿日時を記事番号に変えてやってみましたが出来ませんでした。
ん~・・ちょっと私の勘違い
#2をみるかぎりメッセージの日時をidとしているのですね?
あまりお勧めできないですがまぁそういう運用方法もあるのでしょう
そのケースであればhiddenで渡すのもありです。
ただ通常はprimaryまたはuniqueなint型のidを振って、
そのidを指定して削除するのが一般的だと思います
>yambejpさん
>ただ通常はprimaryまたはuniqueなint型のidを振って、
そのidを指定して削除するのが一般的だと思います
一応banというint型(ユニーク、AI)のカラムを作っているのですが、画面に表示しないので、
selectでも取得してなかったので投稿日時を使ってみてました。
で、そのbanでやってみたのですが、削除できませんでした。 う~~~むです。
お返事いただきどうもありがとうございました。
No.2
- 回答日時:
列datのデータ型は、何ですか?
DATE型であれば、値は文字形式で'yyyy-mm-dd'や'yyyy/mm/dd'である必要があります。
文字定数でなく、yyyy-mm-ddだと、INT型の減算、yyyy/mm/ddだと除算として扱われます。
プレースフォルダを使って、?パラメタを利用した場合も同じです。
php側で日付を取得しているなら、上述の文字形式に変換してから、検索条件の値として設定する必要があります。
テスト中は、文字列で生成したSQLを、表示するなどして確認する仕組みを入れておくことを薦めます。
>chukenkenkou さん
教えてくださりありがとうございます。
データ型はDATETIMEで、2015-11-29 12:02:59 という風に表示されています。
これではダメということでしょうか?
すみません、今の私の知識では読解力がなくて書いていただいていることが、いまひとつ理解できません。
せっかく教えていただいたのにすみません。
でもどうもありがとうございました!
No.1
- 回答日時:
>何かおかしいところがありましたら教えて
>$delete = $db->prepare("DELETE FROM table2 WHERE dat = $del");
>$delete->execute();
まずプレイスホルダーで処理しているのに変数を渡しちゃまずいでしょ
DELETE FROM table2 WHERE dat = ?
的な構文になると思います。
hiddenでなにか渡そうとしていますが、さすがにNGでしょう
投稿日時渡しているように見えるのでそれも的外れのような・・・
また投稿者が削除するなら、セッションに投稿者のユーザーIDを埋め込み
WHERE句にAND 投稿者ID=?としてセッションからユーザーIDを渡す処理が必要かと
>yambejpさん
たびたび教えてくださりありがとうございます。
>まずプレイスホルダーで処理しているのに変数を渡しちゃまずいでしょ
これは前にもご指摘いただきました、きょ、恐縮です(;'∀')
>hiddenでなにか渡そうとしていますが、さすがにNGでしょう
これはセキュリティ的にという意味ですか?ここをどうすれば良いのか?
調べてもわかりませんでした。投稿日時を記事番号に変えてやってみましたが出来ませんでした。
>また投稿者が削除するなら、セッションに投稿者のユーザーIDを埋め込み
これは、元々パスワード認証でログインの形にしているので、全ページにこれを書いています。
>WHERE句にAND 投稿者ID=?としてセッションからユーザーIDを渡す処理が必要かと
言われてみればそうですねえ!今のままなら投稿者じゃなくても削除出来てしまいますもんね。
どうもありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Gmail GmailではメールをDelキーで削除可能でしょうか? 1 2022/08/17 10:43
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<input type="hidden" >で配列...
-
ラジオボタンをsessionで使いたい
-
チェックボックスのvalueを連結...
-
syntax error, unexpected '}' ...
-
フォームボタンを押すたびに数...
-
PHPで画像の渡しが上手く行きま...
-
適性診断テストみたいなものを...
-
入力フォーム→確認画面→送信画...
-
HTMLフォームで複数選択のチェ...
-
フォームへの前回入力値をクリ...
-
チェックボックスの必須項目指定
-
【HTML(PHP?)】複数のフォーム...
-
PHPの関数実行
-
検索時の選択内容を保持する方法
-
チェックボックスを用い、MySQL...
-
PHPでチェックボックスの内容を...
-
フォームでのリセットを使う方法
-
PHP DBの登録情報をラジオボタ...
-
チェックボックスによる検索(...
-
HTMLで前の画面に戻る時、入力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
ラジオボタンをsessionで使いたい
-
パラメーターを隠す
-
PHPで画像の渡しが上手く行きま...
-
フォームへの前回入力値をクリ...
-
フォームボタンを押すたびに数...
-
フォームでのリセットを使う方法
-
syntax error, unexpected '}' ...
-
PHPの関数実行
-
入力した部分を表示させたまま...
-
テキストボックスに初期値を入れる
-
phpで分からないエラーが出てし...
-
入力フォーム→確認画面→送信画...
-
画面が更新されてもチェックボ...
-
Javascript→PHPに...
-
配列をhiddenで
おすすめ情報
とりあえず途中経過です。
問題は、print "<div align='right'><form acton='g_del.php' method='POST'>
<input type='hidden' name='del' value='$id>
<input type='image' src='./gz_icon/del.jpg' width='15' height='20' alt='削除'>
この部分にあるということはわかりました。imageを送信ボタンにしても変わらないので、
結局hiddenのところでしょうか? ちょっと調べてみて、進展があったらまた補足します。
>yambejpさん
たびたびほんとにどうもありがとうございます。
すみません、文字数が少ないので2つに分けて書かせていただきます。
それで現在このような1つのページでやってみてます、
print "<form action='g_del2.php' method='POST'>
<input type='submit' name='del' value='削除'>
</form>";
require_once("db_init.php");
$del=isset($_GET['del'])?$_GET['del']:"";
if($del != ""){
$db->query("DELETE FROM table1 WHERE ban=21");
続きです。
↑だと出来るのに、上3行のみを
print "<form action='g_del2.php' method='POST'>
<input type='hidden' name='del'>
<input type='image' src='./gz_icon/del.jpg' width='15' height='20' alt='削除'>
</form>
これにすると出来なくなります。
で、GETに変えてみましたがやはり出来ませんでした。
ちなみにURLのところには http://localhost/gz/g_del2.php?del=&x=7&y=12
と出てましたが、これの意味するところがわかりません(;´・ω・)
あ、脱字等のご指摘もありがとうございます!
さっき調べてたら、
<input type='hidden' name='del' value='$id'> のvalueのところ、
<input type='hidden' name='del' value='delete'> と書いてるところがあったので
それでやってみたらとりあえず出来ました!!
明日はここから少しずつ先に進んで原因を突き止めたいと思います。
ほんとにどうもありがとうございました!
>yambejpさん
お蔭さまで本日無事に id(ban)の方で出来ました!!
本当にお世話になりありがとうございました!! 大変感謝です!!
また、デバッグのやり方も書いてくださりどうもありがとうございました!
今後何かあったら使わせていただきます。
No5にお書きいただいたコードを使わせていただきましたのでこちらを
ベストアンサーにさせていただきます。
これから一応、投稿日時の方でもやってみようと思います、その際は
chukenkenkouさんに教えていただいた日時のフォーマットをしてからやってみます!
お二人とも私の稚拙な質問にご親切にご回答くださりほんとにどうもありがとう
ございました!
また何かありましたらどうぞよろしくお願いいたします!