質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

submitボタン1つでいくつも処理する方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,773

score 133

フォーム内にsubmitボタン1つとラジオボタンを複数設けて、ラジオボタン毎に各処理を行い、その処理開始をsubmitボタンで行うという動作にしたいんですが、submitにname属性を付けるとその属性にしか処理が行われないし、外しても一つの処理しか行われず、if文の式を変更しても全く改善されません

各if文に$_POSTで処理を受け取るためにラジオボタンのname属性を付けてみたんですが、思うような動作になりません

添削お願いします

$link = mysqli_connect($host, $user, $pass, $db) or die("NG");

    mysqli_select_db($link, "XXX");

    $sqli = "bbs";
    if (isset($_POST["bbs"])) {
        $sqli = mysqli_real_escape_string($_POST['bbs']);
    }

    if (isset($_POST['name'], $_POST['comment'], $_POST['bbs']) && !empty($_POST['post']))) {
        $name = $_POST['name'];
        $comment = $_POST['comment'];
        mysqli_query($link, "INSERT INTO XXX (name, comment) VALUES ('$name', '$comment')");
    } elseif (isset($_POST['bbs'], $_POST['update'])) {
        $update = $_POST['update'];
        mysqli_query($link, "UPDATE XXX SET name = '$name', comment = '$comment' WHERE id = $update");
    } else (isset($_POST['bbs'], $_POST['delete'])) {
        $delete = $_POST['delete'];
        mysqli_query($link, "DELETE FROM XXX WHERE id = $delete");
    }

    $result = mysqli_query($link, "SELECT * FROM XXX");
?>

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>
    <body>
        <form method="post" action="">
            <table>
                <tr>
                    <td>
                        名前:<input type="text" name="name">
                        内容:<textarea name="comment" cols="30" rows="3"></textarea>
                        <input type="radio" name="bbs" value="post" checked>投稿
                        <input type="radio" name="bbs" value="update">更新
                        <input type="radio" name="bbs" value="delete">削除
                        <input type="submit" value="投稿">
                    </td>
                </tr>
            </table>

<?php
            while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
?>

            <table>
                <input type="checkbox" name="chkid[]" value="<? = $row['$id'] ?>">
                <tr>
                    <td>名前:
                        <?php echo $row['name'] ?>
                    </td>
                </tr>
                <tr>
                    <td>内容:
                        <?php echo $row['comment'] ?>
                    </td>
                </tr>
            </table>

<?php
            };
            mysqli_free_result($result);

            mysqli_close($link);
?>

        </form>
    </body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

同じ間違いをずっと繰り返しているのでよく見なおした方がいいですよ

<?PHP
$id      = filter_input(INPUT_POST,'id')?:"";
$bbs     = filter_input(INPUT_POST,'bbs')?:"";
$name    = filter_input(INPUT_POST,'name')?:"";
$comment = filter_input(INPUT_POST,'comment')?:"";
$sql="";

switch($bbs){
case "post":
    $sql="INSERT INTO XXX (name, comment) VALUES ('$name', '$comment')";
  break;
case "update":
  if($id){
    $sql="UPDATE XXX SET name = '$name', comment = '$comment' WHERE id = $id";
  }
  break;
case "delete":
  if($id){
    $sql="DELETE FROM XXX WHERE id = $id";
  }
  break;
default:
  $sql="";
  break;
}  
print $sql;
?>
<form method="post" action="">
<input type="hidden" name="id" value="123456">
名前:<input type="text" name="name" value="test">
内容:<textarea name="comment" cols="30" rows="3">test textarea</textarea>
<input type="radio" name="bbs" value="post" checked>投稿
<input type="radio" name="bbs" value="update">更新
<input type="radio" name="bbs" value="delete">削除
<input type="submit" value="投稿">
</form>
  • 投稿と更新・削除はidの取り扱いがまったく違うので本来同じ画面で処理することはありえない
  • $_POST['update']だとか$_POST['delete']などご自身がHTML側から渡してないものを拾おうとしない(idを指定しているつもりになっていますが、どこにもそんなHTMLは書かれていない)
  • nameやcommentなどユーザーから送られてくるデータはすべてmysqli_real_escape_string()してインジェクション対策すること

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/10 17:01

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

    上記コードに書き換えて確認しましたが、以前と同じく「投稿」のみ処理されてしまいます

    前回お答えいただいたときもそうですが、<input type="hidden" name="id" value="123456">は何を処理してるのでしょうか

    あとfilter_inputの三項演算子も同じく何を処理してるのでしょうか

    キャンセル

  • 2016/08/10 17:26

    >以前と同じく「投稿」のみ処理

    ラジオボタンで更新や削除を選んで「投稿」ボタンを押すと
    それぞれUPDATEやDELETEのSQL文が表示されませんか?

    ><input type="hidden" name="id" value="123456">
    更新や削除をするにはその文書のidを指定しないといけませんよね?
    (そこの仕様が違うとなると根本から設計がおかしい事になります)
    なのでhiddenなどでidを先に拾っておいて、更新や削除に利用します。
    実際にはidはそのまえに参照する処理が必要があって、そこから
    プログラムでidを引っ張ってくる必要があります

    filter_inputと三項演算の関係ですが、これはデフォルト値””を指定しています
    $id = filter_input(INPUT_POST,'id');
    だけだと$_POST["id"]がない場合、NULLが返るのでそれを""に変更しています。

    本来filter_input()におけるデフォルト値の提案は
    $id = filter_input(INPUT_POST,'id',FILTER_DEFAULT,array("options"=>array("default"=>"")));
    としますが、しちめんどくさいので三項演算子をつかって

    $id = filter_input(INPUT_POST,'id')?filter_input(INPUT_POST,'id'):"";
    と書きます。三項演算子の拡張機能で
    $a?$a:$b(変数$aが理論上trueであれば$aそうでなければ$b)
    を短縮形で
    $a?:$bとかけます。
    従って
    $id = filter_input(INPUT_POST,'id')?:"";
    というのは$_POST['id']に値が設定されればその値を$idに代入、
    そうでない($_POST['id']が設定されていない)場合は$idに""を代入しています。
    ただし欠点として$_POST['id']に"0"が指定されている場合はfalseとみなされ""に
    変換されてしまうので注意ください

    キャンセル

+1

ここまでコードを書けるなら、ラジオボタンとsubmitの動作については、ググれば解決すると思います。
ただ、上記に記載されているコードを見る限り、今後も同様の初歩的な誤りと、ご自身のスキルアップにはつながらないと思いますので、正直に書かせていただくと、
まずは、作業毎に分けるべきです。
上記の記述だと、HTMLでviewの表示を行いながら、phpにて条件分岐を行っており、且つSQLを叩いています。
この状態では、間違い個所を見つけるのに中々見つからないと思います。

まずは思い切って、4つの作業に分けましょう。

① phpにて条件分岐を行う。
② 必要に応じたSQLにてデータを取得する。
③ 取得したデータをphpに設定する。
④ HTMLにて、表示を行う。

作業を完全に切り分けることで、ひとつひとつの動作を確認できますよね。
恐らく、この確認動作を行えるようになれば、submitなんかは、簡単に解決できますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

そもそもFormのサブミットはフォーム名(name)に依存するので、複数の処理がしたかったら
条件を定義すればいい。

もうひとつ言うなら、フレームワーク使いましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/10 15:35

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

    >複数の処理がしたかったら条件を定義すればいい
    その条件定義が分からなくて質問いたしました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る