PHPについて質問です。

現在メールフォームを作成しているのですが、INSERT INTO 文でデータがうまく入力できず困っています。
コードを張るのでわかるかたおりましたらご回答いただけないでしょうか。サーバーはさくらインターネット、INSERT INTO文はMyAdminのなかで直接入力してできたのですが、phpのサイトからデータを送ることができません。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2021/04/16 18:31:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:psne No.2

回答回数605ベストアンサー獲得回数334

ポイント300pt

質問のコメントで用意されたコードと回答のコードには、セキュリティ上の問題やトラブルとなる記述があります。

回答の為に極力元のコードを改変しないようにしてありますが、実際に公開する前に対策する(例えば、より安全な仕組みを利用して書き直す)ことを強くお勧めします。

(準備)データ保管用のテーブルは以下のように作成してあります。

CREATE TABLE `exapmle_db`.`mailform` ( `NAMAE` TEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `MAIL` TEXT CHARACTER SET utf8 COLLATE utf8_bin NULL , `IKEN` TEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `TIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB;

(1) link.html

<html lang="ja">
<body>
    <form action="./index.php" method="post">
        名前/ニックネーム <input type="text" name="namae"> <br><br>
        メール(任意) <input type="text" name="mail"><br><br>
        仕入れてほしい商品/意見<br>
        <textarea name="iken" rows="4" cols="40"></textarea><br><br>
        <input type="submit" name="submit" value="送信">
</body>
</html>

phpファイルへのリンクを相対パスに変更した以外に特に変更点はありません。


(2) index.php

<?php

if (isset($_POST["submit"])){
    $db=mysqli_connect("mysql57.ユーザー名.sakura.ne.jp","ユーザー名","パスワード","exapmle_db");
    // コントロールパネル 接続サーバの設定に合わせて記述します。
    // 回答時点では、ユーザ名と、MySQLサーバのバージョンの組み合わせで接続サーバの指定ができるようです。
    // DBの選択( exapmle_db )も接続時に行うため、不要となった下の指定部分をコメントアウトしてあります。

    //DBの選択
    //$conn = mysqli_select_db("exapmle_db",$db);

    //$sql="INSERT INTO `mailform`(`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (`aaa`,`aaaa`,`aaaaa`,`aaaaa`);";
    $sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (\"aaa\", \"aaaa\", \"aaaaa\", NOW() );";
    // 上記は、phpMyAdmin にて手動で挿入した後に、phpでの記述を取得することができます。
    // また、タイムスタンプを自動で入力するように NOW() へ変更してあります。

    // mysql_query($sql);
    $ret = mysqli_query($db,$sql);
    // mysqliに変更、返却されるデータを見るために変数を追加してあります。
    var_dump( $ret );
    // データの挿入が成功している場合は true となります。

    var_dump( mysqli_error( $db ) );
    // 直前の操作で、どのようなエラーが発生したか確認するためのものです。

    //header("Location:link.html");
    // エラーの確認の為にコメントアウト
}

mysql_queryをmysqli_queryへ修正、必要なものを追加したところ、動作しました。

他3件のコメントを見る
id:psne

>しかし、phpMyAdmin側ではデータが追加されません。

コメントにあるVALUES側のダブルクォーテーションが抜けていました。

正しくは、

$sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (\"" . $_POST["namae"] . "\", \"" . $_POST["mail"] . "\", \"iken\", NOW() );";

このようになります。

"namae"に「a」"mail"に「b」を入れてPOSTした時に、データベースに挿入する直前でvar_dump($sql);で確認すると、以下のようになります。

string(91) "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES ("a", "b", "iken", NOW() );" bool(true) string(0) ""

このようなミスを防ぐためにもプリペアドステートメントが有効です。

例えば、このようになります。(一部抜粋。送信されるデータには悪意のない内容である前提のコードです。)

$sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES ( ?, ?, ?, NOW() );";

$stmt = mysqli_prepare($db, $sql);

mysqli_stmt_bind_param($stmt, "sss", $post_namae, $post_mail, $post_iken);

$post_namae = $_POST["namae"];

$post_mail = $_POST["mail"];

$post_iken = $_POST["iken"];

$ret = mysqli_stmt_execute($stmt);

// mysql_query($sql);

//$ret = mysqli_query($db,$sql);

// mysqli_stmt_execute を利用するため、コメントアウト

var_dump( $ret );

// データの挿入が成功している場合は true となります。

2021/04/15 08:28:21
id:aiomock

ご連絡遅れて申し訳ありません。

無事にメールフォーム作成できました。

ありがとうございます^^。

2021/04/16 18:30:26

その他の回答1件)

id:aSayuri No.1

回答回数97ベストアンサー獲得回数21

 

https://qiita.com/harufuji/items/d033d3480a0c791973ae

 

PHP で 入力フォームのデータを

SELECT文 の INSERT を使って、MySQL に書き込む方法のURLです。

 

参考になさってください。

 

 

id:psne No.2

回答回数605ベストアンサー獲得回数334ここでベストアンサー

ポイント300pt

質問のコメントで用意されたコードと回答のコードには、セキュリティ上の問題やトラブルとなる記述があります。

回答の為に極力元のコードを改変しないようにしてありますが、実際に公開する前に対策する(例えば、より安全な仕組みを利用して書き直す)ことを強くお勧めします。

(準備)データ保管用のテーブルは以下のように作成してあります。

CREATE TABLE `exapmle_db`.`mailform` ( `NAMAE` TEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `MAIL` TEXT CHARACTER SET utf8 COLLATE utf8_bin NULL , `IKEN` TEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `TIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB;

(1) link.html

<html lang="ja">
<body>
    <form action="./index.php" method="post">
        名前/ニックネーム <input type="text" name="namae"> <br><br>
        メール(任意) <input type="text" name="mail"><br><br>
        仕入れてほしい商品/意見<br>
        <textarea name="iken" rows="4" cols="40"></textarea><br><br>
        <input type="submit" name="submit" value="送信">
</body>
</html>

phpファイルへのリンクを相対パスに変更した以外に特に変更点はありません。


(2) index.php

<?php

if (isset($_POST["submit"])){
    $db=mysqli_connect("mysql57.ユーザー名.sakura.ne.jp","ユーザー名","パスワード","exapmle_db");
    // コントロールパネル 接続サーバの設定に合わせて記述します。
    // 回答時点では、ユーザ名と、MySQLサーバのバージョンの組み合わせで接続サーバの指定ができるようです。
    // DBの選択( exapmle_db )も接続時に行うため、不要となった下の指定部分をコメントアウトしてあります。

    //DBの選択
    //$conn = mysqli_select_db("exapmle_db",$db);

    //$sql="INSERT INTO `mailform`(`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (`aaa`,`aaaa`,`aaaaa`,`aaaaa`);";
    $sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (\"aaa\", \"aaaa\", \"aaaaa\", NOW() );";
    // 上記は、phpMyAdmin にて手動で挿入した後に、phpでの記述を取得することができます。
    // また、タイムスタンプを自動で入力するように NOW() へ変更してあります。

    // mysql_query($sql);
    $ret = mysqli_query($db,$sql);
    // mysqliに変更、返却されるデータを見るために変数を追加してあります。
    var_dump( $ret );
    // データの挿入が成功している場合は true となります。

    var_dump( mysqli_error( $db ) );
    // 直前の操作で、どのようなエラーが発生したか確認するためのものです。

    //header("Location:link.html");
    // エラーの確認の為にコメントアウト
}

mysql_queryをmysqli_queryへ修正、必要なものを追加したところ、動作しました。

他3件のコメントを見る
id:psne

>しかし、phpMyAdmin側ではデータが追加されません。

コメントにあるVALUES側のダブルクォーテーションが抜けていました。

正しくは、

$sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES (\"" . $_POST["namae"] . "\", \"" . $_POST["mail"] . "\", \"iken\", NOW() );";

このようになります。

"namae"に「a」"mail"に「b」を入れてPOSTした時に、データベースに挿入する直前でvar_dump($sql);で確認すると、以下のようになります。

string(91) "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES ("a", "b", "iken", NOW() );" bool(true) string(0) ""

このようなミスを防ぐためにもプリペアドステートメントが有効です。

例えば、このようになります。(一部抜粋。送信されるデータには悪意のない内容である前提のコードです。)

$sql = "INSERT INTO `mailform` (`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES ( ?, ?, ?, NOW() );";

$stmt = mysqli_prepare($db, $sql);

mysqli_stmt_bind_param($stmt, "sss", $post_namae, $post_mail, $post_iken);

$post_namae = $_POST["namae"];

$post_mail = $_POST["mail"];

$post_iken = $_POST["iken"];

$ret = mysqli_stmt_execute($stmt);

// mysql_query($sql);

//$ret = mysqli_query($db,$sql);

// mysqli_stmt_execute を利用するため、コメントアウト

var_dump( $ret );

// データの挿入が成功している場合は true となります。

2021/04/15 08:28:21
id:aiomock

ご連絡遅れて申し訳ありません。

無事にメールフォーム作成できました。

ありがとうございます^^。

2021/04/16 18:30:26
  • id:aiomock
    <?php


    if (isset($_POST["submit"])){


    $db=mysqli_connect("SQLサーバー","tensi","7ga7nhr2",);


    //DBの選択
    $conn = mysqli_select_db("tensi_tensi",$db);

    $sql="INSERT INTO `mailform`(`NAMAE`, `MAIL`, `IKEN`, `TIME`) VALUES ("aaa","aaaa","aaaaa","aaaaa");";

    mysql_query($sql);


    header("Location:link.html");
    }
    ?>
  • id:aiomock
    HTMLも載せておきます

    <html>
    <body>
    <form action="http://tensi.sakura.ne.jp/index.php" method="post">
    名前/ニックネーム <input type="text" name="namae"> <br><br>
    メール(任意) <input type="text" name="mail"><br><br>
    仕入れてほしい商品/意見<br>
    <textarea name="iken" rows="4" cols="40"></textarea><br><br>
    <input type="submit" name="submit" value="送信">
    </body></html>
  • id:aiomock
    完成したHTMLコード

    <html>
    <body>
    <form action="index.php" method="post">
    名前/ニックネーム <input type="text" name="namae"> <br><br>
    メール(任意) <input type="text" name="mail"><br><br>
    仕入れてほしい商品/意見<br>
    <textarea name="iken" rows="4" cols="40"></textarea><br><br>
    <input type="submit" name="submit" value="送信">
    </body></html>
  • id:aiomock
    完成したPHPコード

    <?php


    if (isset($_POST["submit"])){



    $db=mysqli_connect("mysql57.ID名.sakura.ne.jp","ID名","PW","DB名");


    $sql = "INSERT INTO `テーブル名` (`NAMAE`, `MAIL`, `IKEN`, `TIME`)
    VALUES (\"" . $_POST["namae"] . "\",\" " . $_POST["mail"] . "\",\"" . $_POST["iken"] . "\", NOW() );";

    $ret = mysqli_query($db,$sql);


    header("Location:link.html");
    }
    ?>

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

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

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

回答リクエストを送信したユーザーはいません