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

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

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

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

Q&A

解決済

2回答

1175閲覧

データベースにデータを登録する

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2021/05/20 13:49

編集2021/05/20 13:56

##データべースにデータを登録したい

PHPで以下のサイト(https://gray-code.com/php/make-the-board-vol1/)を参考にしながら一言掲示板を作っています。
データベースにデータの登録をするときに問題が発生し、データの登録が正常にできませんでした。
サイト等で検索したところquery部分に問題があることは分かったのですが、それに対してどのように対処すれば良いかわかりませんでした。
解決策のご教示をお願します。

phpmyadminには以下のエラーメッセージが発生しました。

返り値が空でした (行数 0)。 (クエリの実行時間: 0.0002 秒。)
イメージ説明

イメージ説明

該当のエラーコード

php

1if (empty($error_message)) { 2 3 4 //データベースに接続 5 $mysqli = new mysqli('localhost','root','root','board'); 6 7 //接続エラーの確認 8 if ($mysqli->connect_errno) { 9 $error_message[] = '書き込みに失敗しました。エラー番号'.$mysqli->connect_errno.':'.$mysqli->connect_error; 10 }else { 11 12 // 文字コード設定 13 $mysqli->set_charset('utf8'); 14 15 // 書き込み日時を取得 16 $now_date = date("Y-m-d H:i:s"); 17 18 // データを登録するSQL作成 19 $sql = "INSERT INTO message (view_name, message, post_date) VALUES ( '$clean[view_name]', '$clean[message]', '$now_date')"; 20 21 // データを登録 22 //問題あり? 23 $res = $mysqli->query($sql); 24 25 if( $res ) { 26 $success_message = 'メッセージを書き込みました。'; 27 } else { 28 $error_message[] = '書き込みに失敗しました。'; 29 } 30 31 // データベースの接続を閉じる 32 $mysqli->close(); 33 } 34 }

試したこと> 引用テキスト

データベースへの接続、接続エラーの確認(elseより前のコード)までは問題なく動作することは確認しました。
その他綴り間違い等はありませんでした。

補足情報(FW/ツールのバージョンなど)

Mac (M1)
MAMP

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

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

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

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

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

m.ts10806

2021/05/20 13:54

エラーハンドリングして詳細取得するかサーバーのエラーログ確認してください。
Y.H.

2021/05/20 13:58

$sql に代入したSQL文を質問に追記ください。 saitopさんが実行したいSQL文になっているか var_dump($sql); とかで表示して確認しましょう。
m.ts10806

2021/05/20 13:59

>返り値が空でした エラーではないです。SELECT結果で0件だっただけです。
guest

回答2

0

ベストアンサー

$clean[view_name]じゃなくて$clean['view_name']って表記するんだけど、
$sqlに代入する場面でそれをやっちゃうと大変なことになるので、
悪いことは言わないからプリペアードステートメントのやり方を覚えてください。

php

1$sql = "INSERT INTO message (view_name, message, post_date) VALUES ( ?, ?, now)"; 2$stmt = $mysqli->prepare($sql); 3$stmt->bind_param('ss', $clean['view_name'], $clean['message']); 4$stmt->execute(); 5$res = $stmt->get_result();

みたいな。(あくまで机上のコードで動作させてない。デバッグよろしく)


ざっと一連の教材を見てみましたが、
フォーム入力のサニタイズをしてない、
本来HTML表示用にのみ使うべきhtmlspecialchars()で加工した値をDB保存用に使ってしまう悪手、
SQLインジェクション対策してない、トランザクション処理してない、
PHPに慣れるためだとしても脆弱性対策するやり方を別途学ばなきゃいけないことに
大変注意が必要です。

他の教材も探したほうがよろしいかと。
PDOじゃなくmysqliを使ってるとか他のデータベースを使うときに困るし。

投稿2021/05/20 13:59

編集2021/05/21 01:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/21 00:41

つまり、教材が時代遅れ。
退会済みユーザー

退会済みユーザー

2021/05/21 05:01

ご回答ありがとうございます。今から試してみます。
退会済みユーザー

退会済みユーザー

2021/05/21 05:09

BAはうまく行ってからね。同じ話題で別の質問とか起こされるとしんどいので。
guest

0

query部分に問題があることは分かったのですが

$sqlをechoで出力し、出力された文字列をphpMyAdminで実行してみてください。
それでエラーなく終了し、想定のデータが登録されているならSQLは問題ないです。

あとは、エラーハンドリングしてください。
このコードだけでは各変数がどのように定義されたか不明ですし、
SQLだけでの正常動作が確認できてなければ、PHPから実行しても当然正常動作しません。

mysqli::$errorは確認する必要がありますが、「エラーハンドリング」としてはtry-catchによる例外処理が一般的で、必須です。
特にMySQLのようなPHPからすると外部の仕組みを利用するのであれば、外部で起きたエラー詳細はちゃんとハンドリングしないと確認できません(エラーログには出てるはずですが)
mysqli_sql_exception

デバッグもしてください。処理がどこまで通っているか。
どの分岐を通り、変数には何が入っているか。
はじめは定義をしている変数全てを確認するくらいがちょうど良いです。

あとmysqliよりPDOのほうが参考できる記事も多く組みやすいと思います。
PHPでデータベースに接続するときのまとめ

現在、SQLインジェクション対策(必須です)されてませんし、全部組み替えるくらいのほうが後々はいいかもしれません。

投稿2021/05/20 14:08

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2021/05/21 05:08

PHP5時代のコンテンツの焼き直しっぽい、一連の教材なので、 そこで説明されてないことを求めても辛いのかもしれないなぁ。 (でも許さん)
m.ts10806

2021/05/21 05:25

更新日時に騙されないようにするのは難しそうですね。表示するだけならなんでも出来ますから。 せめてインジェクションの意識は持ってもらいたいところ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問