dポイントプレゼントキャンペーン実施中!

たびたびすみませんが質問させてください。
現在、掲示板に削除機能をつけたいと思いいろいろ調べてやってみてるのですが、
削除されません。具体的にやりたいこととしては、投稿者が投稿後に削除したい場合、
記事内のアイコンをクリックすることで削除出来るようにすることで、

削除するための条件は投稿日時を使ってます。
コードは以下ですが、実際のコードはテーブルとか使ってて長いので、関係あるところだけ書きます。

$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');
}
以上です。何かおかしいところがありましたら教えてください。
よろしくお願いいたします。

質問者からの補足コメント

  • とりあえず途中経過です。

    問題は、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のところでしょうか? ちょっと調べてみて、進展があったらまた補足します。

    No.6の回答に寄せられた補足コメントです。 補足日時:2015/12/03 12:47
  • >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");

    No.7の回答に寄せられた補足コメントです。 補足日時:2015/12/03 14:16
  • 続きです。


    ↑だと出来るのに、上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
    と出てましたが、これの意味するところがわかりません(;´・ω・)

    あ、脱字等のご指摘もありがとうございます!

      補足日時:2015/12/03 14:18
  • さっき調べてたら、
    <input type='hidden' name='del' value='$id'> のvalueのところ、
    <input type='hidden' name='del' value='delete'> と書いてるところがあったので
    それでやってみたらとりあえず出来ました!!

    明日はここから少しずつ先に進んで原因を突き止めたいと思います。
    ほんとにどうもありがとうございました!

    No.8の回答に寄せられた補足コメントです。 補足日時:2015/12/03 16:30
  • HAPPY

    >yambejpさん

    お蔭さまで本日無事に id(ban)の方で出来ました!!
    本当にお世話になりありがとうございました!! 大変感謝です!!
    また、デバッグのやり方も書いてくださりどうもありがとうございました!
    今後何かあったら使わせていただきます。
    No5にお書きいただいたコードを使わせていただきましたのでこちらを
    ベストアンサーにさせていただきます。

    これから一応、投稿日時の方でもやってみようと思います、その際は
    chukenkenkouさんに教えていただいた日時のフォーマットをしてからやってみます!

    お二人とも私の稚拙な質問にご親切にご回答くださりほんとにどうもありがとう
    ございました!
    また何かありましたらどうぞよろしくお願いいたします!

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/12/04 11:45

A 回答 (9件)

ちなみに・・・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());
}
この回答への補足あり
    • good
    • 0
この回答へのお礼

>yambejpさん

コードまで書いていただき感謝です!お手数おかけしてすみません!

で、コピペでやってみたのですが、削除出来ません(;+_+;)
No3のお返事にも書きましたが、記事番号でやっても出来なくて、
どこで引っかかっているのか、ちょっとなんとか調べてみようと思います。

原因がわかったら改めてご報告とお礼をさせていただきます。
どうもありがとうございました。

お礼日時:2015/12/02 14:16

><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."が不明";
}
のような条件分けをしてみるとかでしょうかねぇ
    • good
    • 0
この回答へのお礼

>yambejpさん

あ、すみません、入れ違いで書き込みしていただいたようで、補足の方へ書いたのですが、
value='delete' を入れたら出来ました。valueは必要だということですね。
教えていただきほんとにどうもありがとうございます!

明日は元のコードに戻ってやってみます。またご報告します。
ほんとにどうもありがとうございました!

お礼日時:2015/12/03 16:34

ちょっと微妙になってきていますね・・



>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が渡っているみたいなので
単に転記ミスなのでしょう)
この回答への補足あり
    • good
    • 0
この回答へのお礼

>yambejpさん

いやもうほんとに申し訳ないです!お忙しいのにほんとごめんなさい!
はい、転記ミスです。小分けにしてあっちこっちからコピペしてたので、ごちゃごちゃになって
しまってました(だったら送信する前にしっかりチェックしろよって話ですよね、すみません(;・∀・))
もう一つ転記ミスは3行目が </form>  じゃなくて </form>";  です、すみません。

整理すると、最初に書いたほうは$_GETではなく$_POSTで処理しています。
で、削除ボタンだとうまくいくのに画像だと出来ません。$_GETでもやってみたのですが出来ませんでした。

で、
><input type='hidden' name='del'>に元のように<input type='hidden' name='del' value='$id'>
としないとidは渡っていないように見えますが?
今回の処理の場合、削除条件を ban=21 としているので、idって必要ないと思ってvalueを
つけなかったんですが、必要なんでしょうか?

お礼日時:2015/12/03 15:54

>とりあえず途中経過です。



まず「acton」のつづりが「action」になっているか確認
「value='$id>」のクォーテーションとじてます?「value='$id'>」

そのうえで、一度POSTをやめてgetにしてイメージをクリックしたときに
g_del.php?del=・・・
になるかどうかチェックしてください
まぁイメージでやるとx=・・・・&y=・・・)も付加されると思いますが
xやyを別の定義でパラメータ渡ししていなければ問題ありません。

その際、delで渡される値が、ちゃんと想定した値になっているかも
チェックした方がよいでしょう。
この回答への補足あり
    • good
    • 0

よくよくみたら


>DELETE FROM table2

DELETE FROM table1
じゃない?
datはtabl1.datで出力しているみたいだし・・・
この回答への補足あり
    • good
    • 0
この回答へのお礼

>yambejpさん

ご、ごめんなさい!これについては昨日気がついて自分でやるのは直してやってたんです。
お返事に書こうかどうしようかと迷ったんですけど、まあいっかと思って(;'∀')、
お気を使わせてしまってほんとにすみませんでした!

でも気にしていただいてものすごく嬉しいです!
とりあえず今日はこれから、基本的に一番簡単なやり方で(別ページに簡易の送信
ボタンを作って、その情報を受けてデータベース接続後、
$db->query("DELETE FROM table1 WHERE ban = 1")みたいに具体的な値を
入れてやるところから)やって、どこで詰まってるのかを調べてみたいと思います。

お返事ほんとにどうもありがとうございました。

お礼日時:2015/12/03 11:35

>データ型は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 のような検索条件になりますから、当然、行はヒットしないことになります。
    • good
    • 0
この回答へのお礼

>chukenkenkouさん

小さい子に教えるくらいわかりやすくていねいに教えていただき大変恐縮です。
なるほどです! 日時でやる場合はフォーマットしてからということですね。

今現在ちょっとどうもそれ以前のところで詰まってる感じなので、うまく出来るようになったら
教えていただいたやり方でもやってみたいと思います。

どうもありがとうございました!

お礼日時:2015/12/02 14:11

>>hiddenでなにか渡そうとしていますが、さすがにNGでしょう


>これはセキュリティ的にという意味ですか?ここをどうすれば良いのか?
>調べてもわかりませんでした。投稿日時を記事番号に変えてやってみましたが出来ませんでした。

ん~・・ちょっと私の勘違い

#2をみるかぎりメッセージの日時をidとしているのですね?
あまりお勧めできないですがまぁそういう運用方法もあるのでしょう
そのケースであればhiddenで渡すのもありです。

ただ通常はprimaryまたはuniqueなint型のidを振って、
そのidを指定して削除するのが一般的だと思います
    • good
    • 0
この回答へのお礼

>yambejpさん

>ただ通常はprimaryまたはuniqueなint型のidを振って、
そのidを指定して削除するのが一般的だと思います

一応banというint型(ユニーク、AI)のカラムを作っているのですが、画面に表示しないので、
selectでも取得してなかったので投稿日時を使ってみてました。
で、そのbanでやってみたのですが、削除できませんでした。 う~~~むです。

お返事いただきどうもありがとうございました。

お礼日時:2015/12/02 14:07

列datのデータ型は、何ですか?


DATE型であれば、値は文字形式で'yyyy-mm-dd'や'yyyy/mm/dd'である必要があります。
文字定数でなく、yyyy-mm-ddだと、INT型の減算、yyyy/mm/ddだと除算として扱われます。
プレースフォルダを使って、?パラメタを利用した場合も同じです。
php側で日付を取得しているなら、上述の文字形式に変換してから、検索条件の値として設定する必要があります。

テスト中は、文字列で生成したSQLを、表示するなどして確認する仕組みを入れておくことを薦めます。
    • good
    • 0
この回答へのお礼

>chukenkenkou さん
教えてくださりありがとうございます。

データ型はDATETIMEで、2015-11-29 12:02:59 という風に表示されています。
これではダメということでしょうか?
すみません、今の私の知識では読解力がなくて書いていただいていることが、いまひとつ理解できません。
せっかく教えていただいたのにすみません。

でもどうもありがとうございました!

お礼日時:2015/12/01 16:24

>何かおかしいところがありましたら教えて



>$delete = $db->prepare("DELETE FROM table2 WHERE dat = $del");
>$delete->execute();

まずプレイスホルダーで処理しているのに変数を渡しちゃまずいでしょ
DELETE FROM table2 WHERE dat = ?
的な構文になると思います。

hiddenでなにか渡そうとしていますが、さすがにNGでしょう
投稿日時渡しているように見えるのでそれも的外れのような・・・

また投稿者が削除するなら、セッションに投稿者のユーザーIDを埋め込み
WHERE句にAND 投稿者ID=?としてセッションからユーザーIDを渡す処理が必要かと
    • good
    • 0
この回答へのお礼

>yambejpさん
たびたび教えてくださりありがとうございます。

>まずプレイスホルダーで処理しているのに変数を渡しちゃまずいでしょ
これは前にもご指摘いただきました、きょ、恐縮です(;'∀')
>hiddenでなにか渡そうとしていますが、さすがにNGでしょう
これはセキュリティ的にという意味ですか?ここをどうすれば良いのか?
調べてもわかりませんでした。投稿日時を記事番号に変えてやってみましたが出来ませんでした。

>また投稿者が削除するなら、セッションに投稿者のユーザーIDを埋め込み
これは、元々パスワード認証でログインの形にしているので、全ページにこれを書いています。
>WHERE句にAND 投稿者ID=?としてセッションからユーザーIDを渡す処理が必要かと
言われてみればそうですねえ!今のままなら投稿者じゃなくても削除出来てしまいますもんね。

どうもありがとうございました!

お礼日時:2015/12/01 16:19

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