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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2079閲覧

INSERTができない

imaharu

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/09/28 11:17

やっていること

パーフェクトPHP(2016)を読みながら、コードを写しています

insertの処理が動いておらず、DBに値が入力されません

下のコードで何が間違っている点はありますでしょうか?

特にweb上でエラーは出ていません

そのまま、写すとmysql > mysqli関係のエラーが出たので、少し改善しました

イメージ説明

<?php // データベースに接続 $link = mysqli_connect('localhost', 'root', ''); if(!$link){ die('データベースに接続できません: ' . mysqli_error()); } // データベースを選択する mysqli_select_db($link , 'oneline_bbs'); $errors = array(); // POSTなら保存処理実行 if($_SERVER['REQUEST_METHOD'] === 'POST'){ // 名前が正しく入力されているかチェック $name = null; if(!isset($_POST['name']) || !strlen($_POST['name'])){ $errors['name'] = '名前を入力してください'; } else if(strlen($_POST['name']) > 40){ $errors['name'] = '名前は40文字以内で入力してください'; } else{ $name = $_POST['name']; } // ひとことが正しく入力されているかチェック $comment = null; if(!isset($_POST['comment']) || !strlen($_POST['comment'])){ $errors['comment'] = 'ひとことを入力してください'; } else if(strlen($_POST['comment']) > 200){ $errors['comment'] = 'ひとことは200文字以内で入力してください'; } else{ $comment = $_POST['comment']; } // エラーがなければ保存 if(count($errors) === 0){ // 保存するためのSQL文を作成 $sql = "INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('" . mysqli_real_escape_string($link , $name) . "','" . mysqli_real_escape_string($link , $comment) . "','" . date('Y-m-d H:i:s') . "')"; // 保存する mysqli_query($link,$sql); } } ?> <!DOCTYPE html> <html> <head> <title>ひとこと掲示板</title> </head> <body> <h1>ひとこと掲示板</h1> <form action="bbs.php" method="post"> <?php if(count($errors)):?> <ul class="error_list"> <?php foreach($error as $error):?> <li> <?php echo htmlspecialchars($error, ENT_QUOTES,'UTF-8') ?> </li> <?php endforeach; ?> </ul> <?php endif; ?> 名前: <input type="text" name="name" /> <br> ひとこと: <input type="text" name="comment" size="60" /> <br> <input type="submit" name="submit" value="送信する" /> </form> </body> </html>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マニュアルの記載順にもよりますがinsertの前にselectでデータが読めるかどうか確認は取っていますか?

その上で

$sql = "INSERT INTO post (name,comment,create_at) VALUES ('"

. mysqli_real_escape_string($link , $name) . "','" . mysqli_real_escape_string($link , $comment) . "','" . date('Y-m-d H:i:s') . "')";

の後ろで

print $sql;

とすると、それなりのSQL文が表示されますか?

投稿2017/09/28 11:26

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/09/28 11:35

ちなみにプレースホルダーでprepareの処理をしない限り インジェクションの対策が不完全です 2016版とありますが、ちょっと書き方が古すぎるような気がします
imaharu

2017/09/29 01:21

コードを実行すると下の文が表示されました Tom INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('hehe','hehehehe','2017-09-29 03:17:46') が出力されました Tomはselect文でデータが取得できていることを示しています ``` if(count($errors) === 0){ // 保存するためのSQL文を作成 $sql = "SELECT name FROM post"; if ($result = $link->query($sql)) { // 連想配列を取得 while ($row = $result->fetch_assoc()) { echo $row["name"] . "<br>"; } // 結果セットを閉じる $result->close(); } $in = "INSERT INTO `post` (`name`,`comment`,`create_at`) VALUES ('". mysqli_real_escape_string($link , $name) . "','". mysqli_real_escape_string($link , $comment) . "','". date('Y-m-d H:i:s') . "')"; print $in; // 保存する mysqli_query($link,$in); } ```
yambejp

2017/09/29 01:27

selectはできてinsert文は文法に問題がないけど、最終的に投入されないということですね? そうなるとデータ投入の権限がついていない可能性があります $ret= mysqli_query($link,$sql); var_dump($ret); で失敗してることは確認できますか? printf("Error: %s\n", mysqli_error($link)); でエラー内容が確認できるかもしれません
imaharu

2017/09/29 05:43

create_at > created_at にするとinsertができました。 タイプミスだったようです。 ------ プレースホルダーでprepareの処理をしない限り インジェクションの対策が不完全です ------ これについて詳しく知りたいのですが、参考サイトなどありますでしょうか?
imaharu

2017/09/29 06:08

勉強しておきます 解決に協力して頂き、ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問