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

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

ただいまの
回答率

87.59%

PHPからMySQLへのデータ送信のプログラミング構造

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,128

score 27

プログラミング二か月目、MySQL数日目の初心者です。
見よう見まねで全ては理解できていない状態でプログラミングしました。

ユーザ登録画面です、この前のページで名前とメールアドレスを入力してもらい、DBにその情報を送る操作を打ちました。
Mysqlのファイルにデータが送信できることは確認済みです。
ただ、当方の書いたものだと名前とメアドが違う横列に入ってしまいます。
どこを統一すれば同一人物の情報だと認識して、DBに格納されるのでしょうか?

最初のif (!isset($_POST['Name'])  || $_POST['Name'] === "" && !isset($_POST['Ad'])  || $_POST['Ad'] === "")にするなど試したのですがうまくいきませんでした。
ご教授願います。

<?php
//name
if(empty($_POST)) {
    echo "<a href='projlogin.php'>ログイン画面</a>←こちらのページからどうぞ";
}else{
    //名前入力判定
    if (!isset($_POST['Name'])  || $_POST['Name'] === "" ){
        echo "名前が入力されていません。";
    }else{
        //プリペアドステートメント
        $stmt1 = $mysqli->prepare("INSERT INTO user_list (user_name) VALUES (?)");

        if($stmt1){
            //プレースホルダへ実際の値を設定する
            $stmt1->bind_param('s', $Name);
            $Name = $_POST['Name'];

            if($stmt1->execute()){
                echo htmlspecialchars($Name, ENT_QUOTES, 'UTF-8')."さんで登録いたしました。";
            }else{
                echo $stmt1->errno . $stmt1->error;
            }


            //ステートメント切
            $stmt1->close();
        }else{
            echo $mysqli->errno . $mysqli->error;
        }
    }

    //アド入力判定
    if (!isset($_POST['Ad'])  || $_POST['Ad'] === "" ){
        echo "アドレスが入力されていません。";
    }else{
        //プリペアドステートメント
        $stmt2 = $mysqli->prepare("INSERT INTO user_list (user_ad) VALUES (?)");

        if($stmt2){
            //プレースホルダへ実際の値を設定する
            $stmt2->bind_param('s', $Ad);
            $Ad = $_POST['Ad'];

            if($stmt2->execute()){
                echo "メールアドレスは".htmlspecialchars($Ad, ENT_QUOTES, 'UTF-8');
                echo "で登録いたしました。";
            }else{
                echo $stmt2->errno . $stmt2->error;
            }

            //ステートメント切断
            $stmt2->close();
        }else{
            echo $mysqli->errno . $mysqli->error;
        }
    }
}

// データベース切断
$mysqli->close();
?>

回答をもとに変更してみました。
以下のように記述しましたら、
1136Column count doesn't match value count at row 1
のエラーが出ました。
調べたところ、コラムの数が合わないのが原因のようなのですが、対処方法はありますでしょうか?
たしかにDBにはインデックスとしてauto_incrementでもう一つコラムは設定されています。

<?php
$name=filter_input(INPUT_POST,"Name");
$ad=filter_input(INPUT_POST,"Ad");

    //名前入力判定

        //プリペアドステートメント
        $stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)");

        if($stmt){
            //プレースホルダへ実際の値を設定する
      $stmt->bind_param('s', $Name);
      $stmt->bind_param('s', $Ad);
      $Name = $_POST['Name'];
      $Ad = $_POST['Ad'];

            if($stmt->execute()){
                echo "お名前は".htmlspecialchars($Name, ENT_QUOTES, 'UTF-8')."さん<br>";
        echo "メールアドレスは".htmlspecialchars($Ad, ENT_QUOTES, 'UTF-8')."<br>";
        echo "で登録いたしました。";
            }else{
                echo $stmt->errno . $stmt->error;
            }

            //ステートメント切断
            $stmt->close();
        }else{
            echo $mysqli->errno . $mysqli->error;
        }



// データベース切断
$mysqli->close();
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

check解決した方法

0

回答者様の意見総合的に見て解決できました、ありがとうございます。
以下で解決

$name=filter_input(INPUT_POST,"Name");
$ad=filter_input(INPUT_POST,"Ad");

$stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)");
$stmt->bind_param('ss', $name,$ad);


今後の自身のためのメモ:insertと$stmt->bind_paramはまとめる、sは変数(打ち込みデータ)の数

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/24 16:45

    データ二個ならssでは。
    いずれにしてもpdoに切り替えられた方が書きやすくなります。

    キャンセル

  • 2019/01/24 16:48

    ご指摘ありがとうございます。最重要箇所間違えておりました。

    キャンセル

0

$name=filter_input(INPUT_POST,"Name");
$ad=filter_input(INPUT_POST,"Ad");

$stmt = $mysqli->prepare("INSERT INTO user_list (user_name,user_ad) VALUES (?,?)");
$stmt->bind_param('s', $name);
$stmt->bind_param('s', $ad);


おなじレコードに登録するのですから一度に投入してください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/24 13:41

    ありがとうございます、試してみます。

    キャンセル

  • 2019/01/24 16:28

    >$stmt->bind_param('s', $name);
    >$stmt->bind_param('s', $ad);
    の箇所に
    mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables
    というエラーがでてしまたのですが、解決策はありますでしょうか?

    キャンセル

  • 2019/01/24 16:32

    まとめて$stmt->bind_param('ss', $name,$ad);で解消しました!ありがとうございます。

    キャンセル

0

insertを2回送信していれば別レコードになるのは当然です。

下記のようなSQLを送信してください。

INSERT INTO user_list (user_name,user_ad) VALUES (?,?)

どちらも必須のようですが、必須にも関わらず一方だけでも登録できるのはDB設計上のミスと思います。
テーブル定義がどうなっているか分かりませんが、必須のカラムはNot Nullに設定してください。
そうするとSQLのエラーになるので今回のミスに気づけます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/24 16:38

    なるほど、ありがとうございます。

    今回のエラーはタイプミスではなく、構造無知湯故の普通のミスだったのですが、コピペ意識して今後取り組みます。

    キャンセル

  • 2019/01/24 16:42

    もう少しphpマニュアルをきちんと読んだ方がいいかなと。
    ネットの記事を参考にするのも良いですが、そもそものphpの機能の仕様を理解して使うことが前提です

    キャンセル

  • 2019/01/24 17:03

    仕組を理解できるようにマニュアルも読みます、ありがとうございます。

    キャンセル

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

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

関連した質問

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