現在メールフォームを作成しているのですが、INSERT INTO 文でデータがうまく入力できず困っています。
コードを張るのでわかるかたおりましたらご回答いただけないでしょうか。サーバーはさくらインターネット、INSERT INTO文はMyAdminのなかで直接入力してできたのですが、phpのサイトからデータを送ることができません。
質問のコメントで用意されたコードと回答のコードには、セキュリティ上の問題やトラブルとなる記述があります。
回答の為に極力元のコードを改変しないようにしてありますが、実際に公開する前に対策する(例えば、より安全な仕組みを利用して書き直す)ことを強くお勧めします。
(準備)データ保管用のテーブルは以下のように作成してあります。
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へ修正、必要なものを追加したところ、動作しました。
https://qiita.com/harufuji/items/d033d3480a0c791973ae
PHP で 入力フォームのデータを
SELECT文 の INSERT を使って、MySQL に書き込む方法のURLです。
参考になさってください。
質問のコメントで用意されたコードと回答のコードには、セキュリティ上の問題やトラブルとなる記述があります。
回答の為に極力元のコードを改変しないようにしてありますが、実際に公開する前に対策する(例えば、より安全な仕組みを利用して書き直す)ことを強くお勧めします。
(準備)データ保管用のテーブルは以下のように作成してあります。
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へ修正、必要なものを追加したところ、動作しました。
>しかし、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 となります。
ご連絡遅れて申し訳ありません。
無事にメールフォーム作成できました。
ありがとうございます^^。
>しかし、phpMyAdmin側ではデータが追加されません。
コメントにあるVALUES側のダブルクォーテーションが抜けていました。
正しくは、
このようになります。
"namae"に「a」"mail"に「b」を入れてPOSTした時に、データベースに挿入する直前でvar_dump($sql);で確認すると、以下のようになります。
このようなミスを防ぐためにもプリペアドステートメントが有効です。
例えば、このようになります。(一部抜粋。送信されるデータには悪意のない内容である前提のコードです。)
ご連絡遅れて申し訳ありません。
無事にメールフォーム作成できました。
ありがとうございます^^。