PHPについて質問です。


現在データベースへ入っている数に数を足したり、引いたりするプログラムを作成しております。

ページですが以下になります。

ページ:http://oskuni7.sakura.ne.jp/point.php
コード:http://oskuni7.sakura.ne.jp/point.phps

今回お聞きしたいのは、データを引く場合です。

データを引く場合ですが、削除ボタンを押すと削除ボタンを押した行が消えて、その行に書かれてある、ポイントの数をデータベースから引くようになっております。

削除ボタンを押してもデータが削除されず、且つ数が引かれていない状況になっております。

何回か方法を変えてやってみたのですが解決策が見当たらず困っております。

mysql_fetch_array関数でMYSQLから出したデータの削除ボタンの設定がちょっと間違っているのではないかとも考えているのですが・・。

大変お手数をおかけしますがコードを見ていただき、改変できそうな所があれば、教えていただけないでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2009/04/03 00:44:55
  • 終了:2009/04/10 00:45:02

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/04/03 07:29:28

ポイント35pt

DB処理のソースがないので推測ですが、データ削除処理の

if(isset($_POST["".$row["NUMBER"].""]))

に正しい値が設定されていないのではないでしょうか。

データ表示から渡されるのは $_POST['1'], $_POST['2']‥‥なので、上記 if 文の外側で、すべての NUMBER の値を処理するように while ループを回す必要があります。


しかし、それは非常に無駄なループ処理です。

受け取った $_POST の値を、ポイント減算/削除の SQL 文に where NUMBER= として適用するといいでしょう。


なお、$_POST で渡された値を基準に DB を変更するのは非常に危険なことです。インターネットには公開しないようにしてください。

他サイトから $_POST に値をセットして point.php を呼び出せば、自由にDBのポイント値を変更できてしまうからです。

$_POST ではなくセッションを張るか、cookie で処理するようにしましょう。

id:aiomock

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

現在プログラムを実行してみたのですが、

if(isset($_POST["".$row["NUMBER"].""]))

文の条件に当てはまらずその下のプログラムが実行できないようになっています。

whileループをする以外にこのif文の条件をクリアしてプログラムを実行するにはどのようなやり方があるのでしょうか。

削除ボタンのSUBMITのname属性を変化させてやはり再設定をした方がいいのでしょうか。

お手数をおかけし申し訳ありませんがわかるかたおりましたらよろしくお願いいたします。

2009/04/04 00:44:34

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/04/03 07:29:28ここでベストアンサー

ポイント35pt

DB処理のソースがないので推測ですが、データ削除処理の

if(isset($_POST["".$row["NUMBER"].""]))

に正しい値が設定されていないのではないでしょうか。

データ表示から渡されるのは $_POST['1'], $_POST['2']‥‥なので、上記 if 文の外側で、すべての NUMBER の値を処理するように while ループを回す必要があります。


しかし、それは非常に無駄なループ処理です。

受け取った $_POST の値を、ポイント減算/削除の SQL 文に where NUMBER= として適用するといいでしょう。


なお、$_POST で渡された値を基準に DB を変更するのは非常に危険なことです。インターネットには公開しないようにしてください。

他サイトから $_POST に値をセットして point.php を呼び出せば、自由にDBのポイント値を変更できてしまうからです。

$_POST ではなくセッションを張るか、cookie で処理するようにしましょう。

id:aiomock

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

現在プログラムを実行してみたのですが、

if(isset($_POST["".$row["NUMBER"].""]))

文の条件に当てはまらずその下のプログラムが実行できないようになっています。

whileループをする以外にこのif文の条件をクリアしてプログラムを実行するにはどのようなやり方があるのでしょうか。

削除ボタンのSUBMITのname属性を変化させてやはり再設定をした方がいいのでしょうか。

お手数をおかけし申し訳ありませんがわかるかたおりましたらよろしくお願いいたします。

2009/04/04 00:44:34
id:fut573 No.2

fut573回答回数195ベストアンサー獲得回数542009/04/03 21:11:21

ポイント35pt

//●データを削除

mysql_query("DELETE FROM P_POINT WHERE=".$row["NUMBER"]."");

↑ここに列名が無いのってOKでしたっけ?

mysql_query("DELETE FROM P_POINT WHERE NUMBER=".$row["NUMBER"]."");

としてみたらどうでしょうか?

id:aiomock

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

2009/04/04 00:30:18
  • id:aiomock
    データをHTMLに出力表示する際のコード

    //★★データの表示

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {
    echo "<tr>\n";
    echo ' <td style="vertical-align: top; text-align: center;">'.$row["NUMBER"].'</td>'."\n";
    echo ' <td style="vertical-align: top; text-align: center;">'.$row["DAY"].'</td>'."\n";
    echo ' <td style="vertical-align: top; text-align: center;">'.$row["NAME"].'</td>'."\n";
    echo ' <td style="vertical-align: top; text-align: center;">'.$row["POINT_NAIYOU"].'</td>'."\n";
    echo ' <td style="vertical-align: top; text-align: center;">'.$row["POINT"].'</td>'."\n";
    echo ' <td style="vertical-align: top; text-align: center;">'."<input type=\"submit\" name=\"".$row["NUMBER"]."\" value=\"削除する\"> </td>'"."\n";
    echo "</tr>\n";
    }
  • id:aiomock
    データを削除する部分のコードになります。

    //------------------------------------------------------------------------------------------------------------------------------

    //★★データ削除の処理

    //------------------------------------------------------------------------------------------------------------------------------

    if(isset($_POST["".$row["NUMBER"].""]))
    {

    //●ポイントを減らす

    if($row["NAME"]=="たかあき"){
    $point_t=mysql_query("SELECT TAKAAKI FROM P_POINT_SUU LIMIT 0,1");
    while ($point_t2 = mysql_fetch_array($point_t , MYSQL_ASSOC))
    {$point_t3=$point_t2["POINT"]-$row["POINT"]; }

    mysql_query("UPDATE P_POINT_SUU SET TAKAAKI='".$point_t3."'" );
    }

    if($row["NAME"]=="よしのぶ"){
    $point_y=mysql_query("SELECT YOSHINOBU FROM P_POINT_SUU LIMIT 0,1");
    $point_y2=$point_t-$row["POINT"];
    mysql_query("UPDATE P_POINT_SUU SET YOSHINOBU='".$point_y2."'" );
    }

    //●データを削除
    mysql_query("DELETE FROM P_POINT WHERE=".$row["NUMBER"]."");

    }
  • id:aiomock
    この上記2種類のコードのどこかに問題があるとは思うのですが、お手数をおかけしますが回答がわかる方おりましたらよろしくお願いいたします。
  • id:fut573
    ソースが見れないので的外れかもしれないのですが、ポイントを減らす処理というのは必要なのでしょうか?

    SELECT SUM(POINT) FROM table名 WHERE NAME=`たかあき`
    SELECT SUM(POINT) FROM table名 WHERE NAME=`よしのぶ`
    とやれば合計ポイント求められます。
    データを削除すれば反映されます。
  • id:fut573
    ああhttp://oskuni7.sakura.ne.jp/point .phps
    から読めますね。
    ファイル名に半角スペースが入っているようです。
  • id:aiomock
    fut573 さん

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

    そして申し訳ありません。コードをきちんと見れるようにさせていただきました。

  • id:aiomock
    現在プログラムを実行してみたのですが、

    if(isset($_POST["".$row["NUMBER"].""]))の条件に当てはまらずその下のプログラムが実行できないようになっています。

    Pahooさんからはwhileループをする方法というものを教えていただいたのですが、

    それ以外にif文の条件をクリアしてプログラムを実行するにはどのようなやり方があるのでしょうか。

    削除ボタンのSUBMITのname属性を変化させてやはり再設定をした方がいいのでしょうか。

    お手数をおかけし申し訳ありませんが詳しい方おりましたらよろしくお願いいたします。
  • id:pahoo
    > それ以外にif文の条件をクリアしてプログラムを実行するにはどのようなやり方があるのでしょうか。

    うーん、#1の回答に「ポイント減算/削除の SQL 文に where NUMBER= として適用する」という別解を差し上げたのですが、これだけでは解決しませんか?
  • id:aiomock
    pahoo さん

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

    if(isset($_POST["".$row["NUMBER"].""]))

    の下に

    echo "if文を実行します。";

    というecho 文を入れてみたのですが、SUBMITボタンを押しても実行されず、if文をパスしてプログラム実行まで移っていないのではないか?

    と考えました。

    そのためにはやはりpahooさんがおっしゃっていたようにwhile文を一度実行し、$row["NUMBER"]の値を再度読み込む、きちんと指定するような処理が発生するのではないか?

    と考えたのですが、どのような処理を組み立てればいいのか少しつかめなかったのでご質問をさせていただきました。

    if(isset($_POST["".$row["NUMBER"].""]))部分を変える必要がでてくるような気がするのですが、

    変えなくてもよろしいでしょうか?

    お手数をおかけし申し訳ありません。

  • id:pahoo
    ソースプログラムを見ることができるようになったので、内容を拝見しました。

    うーん、困りました。
    このプログラムでは「データ削除の処理」に入る時点で、配列 $row には値がセットされません。whileループを使って最初の if を回避できたとしても、次の
    if($row["NAME"]=="たかあき"){
    で期待したような条件分岐が行われません。
    これは、プログラム全体を見直す必要があります。

    表示、追加、削除を同じプログラムでやっているのが問題です。
    実際には1つのスクリプト・ファイルに統合できるのですが、失礼ながら、aiomockさんのスキルでそれをやるのは時期尚早です。
    まずは、個々の機能を別々のスクリプト・ファイルに書くようにしてください。
  • id:aiomock
    pahoo さん

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

    表示、追加、削除を同じプログラムでやっているのが問題ということはどういうことでしょうか?

    プログラムとしてどのような組み立て方になるのでしょうか。

    以前、調べたことがあるクラスとかいう概念みたいなものが入ってくるということなのでしょうか?。

    お手数をおかけしますが今一イメージがわかないのですがお手数をおかけしますが知っておりましたらご回答をよろしくお願いいたします。
  • id:pahoo
    > 表示、追加、削除を同じプログラムでやっているのが問題ということはどういうことでしょうか?

    まず、表示部分はPHPではなくHTMLで書き直してください。――これを hoge1.html とします。
    次に、追加と削除ですが、これらが別々の SQL 文になることはお分かりですよね。追加のための SQL 文を実行するための PHP スクリプトを hoge2.php、削除のための SQL 文を実行するための PHP スクリプトを hoge3.php とします。
    つまり、hoge1.html の FORM は、追加のために hoge2.php へジャンプする FORM と、削除のために hoge3.php へジャンプする FORM を分けて書く必要があります。

    3つの機能をきちんと切り分けて書かないと、目的を達成することはできません。
  • id:aiomock
    ご回答真にありがとうございます。

    三つに分けて実行してみたところ実行できました。

    データの受け渡しにarray_keys関数を使用し、配列のデータを変数に受け渡して実行したところうまくいきました。

    本当にありがとうございます。

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

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

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

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