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

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

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

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

Q&A

解決済

2回答

193閲覧

データーベースにPHPで入力された情報を保存したい

Cherry1217

総合スコア24

PHP

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

0グッド

2クリップ

投稿2019/05/02 20:08

PHPで変数に保存されたデータをデーターベース上に保存したいのですが、方法が分かりません。
データーベースはMYSQLを使用しています。

  • 最終的にやりたい事

      Web上で入力された情報をデーターベースに保存し、その情報をWeb上に反映させる

PHP

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="description" content="タスク"> 6 <title>タスク</title> 7</head> 8 9<body> 10 11 <form method="POST"> 12 <h>タスクを入力します</h> 13 <p><input type="text" name="text" size="70"></p> 14 <p><input type="submit" value="タスクを追加する"></p> 15 </form> 16 17<?php 18 19ini_set('error_reporting', E_ALL); 20ini_set('display_errors', 1 ); 21 22 23//postなら保存処理を行う 24 if(!isset($post['text'])) 25 $errors['text'] = 'タスクを入力してください。'; 26else{ 27 $name = $_post['text']; 28} 29 30//textにデータが入っていた場合は、日付を登録する 31if(isset($post['text'])){ 32 $Registered_Date = data("yyyy/mm/dd"); 33}else{ 34 $errors = 'タスクを入力してください'; 35} 36 37try{ 38 39 $dsn='mysql:dbname=morning glory;host=127.0.0.1'; 40 $user='root'; 41 $password='root'; 42 43 $pdo = new pdo($dsn,$user,$password); 44 45 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 46 47//エラーがなかった場合、データーベースにデータを保存する 48 if(count($errors) === 0){ 49 $sql1 =//$name $Registered_Dateで保存された情報をデーターベースに保存する 50 } 51 52 53 $stmt = $pdo->query($sql1); 54 55 foreach( $stmt as $value ) { 56 echo $value['task']; 57} 58}catch (Exception $e){ 59 echo 'エラーがありました'; 60 echo $e->getMessage(); 61 exit; 62 63} 64 65?> 66 67</body> 68</html> 69

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

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

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

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

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

guest

回答2

0

ベストアンサー

「Web上で入力された情報をデーターベースに保存し、その情報をWeb上に反映させる」
というシステムの中で、どう機能を分割して作っていくかをしっかり考える必要があります。
例えば、

1.フォーム入力用のページを表示する。
2.フォーム入力によって送信されてきたデータをデータベースに反映する。
3.データベースからデータを引き出して表示する。

の3つがあるように見えます。
これらを、一つのphpファイルで実現するのか、それぞれ独立したhtmlファイルやphpファイルで実現させるか、
を検討します。

ここでは、一つのphpファイルで実現するとしましょう。
一つの中に3つの処理を破綻せず詰め込むためには、処理の順番が肝心です。

・フォーム入力を受信してた場合に、データを検証してOKならデータベースに反映する。
・フォーム入力枠表示する。フォーム入力を受信してた場合に、NGだった場合にはフォーム入力欄にデータを表示しつつエラーメッセージも表示する。
・(フォーム入力があろうともなかろうとも)データベースからデータを引き出して表示する。

みたいな流れが妥当でしょうか。

冒頭でデータベースへのコネクションを確立しさえすれば、
データベースに反映する場面と
データを引き出す場面とで共通してコネクションを使い回せます。

この流れでphpファイル上の処理を見直しをしてみてください。

それとは別に、
データベースにアクセスできているかを簡単にテストしてください。
いきなり上に掲げた処理を作っても、多数の問題を抱えていてはどこから手を付けていいかわからなくなります。
確実に動く、使える処理を揃えてから、組み合わせていきます。
下記は、データベース接続だけを試すコードです。

php

1<?php 2 3ini_set('error_reporting', E_ALL); 4ini_set('display_errors', 1 ); 5 6try{ 7 8 $dsn = 'mysql:dbname=morning glory;host=127.0.0.1;charset=utf8mb4'; 9 $user = 'root'; 10 $password = 'root'; 11 12 $pdo = new pdo($dsn, $user, $password, [ 13 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 14 PDO::ATTR_EMULATE_PREPARES => false 15 ]); 16 17 18} 19catch (PDOException $e) { 20 header('Content-Type: text/plain; charset=UTF-8', true, 500); 21 exit($e->getMessage()); 22} 23?> 24<!DOCTYPE html> 25<html lang="ja"> 26<head> 27 <meta charset="utf-8"> 28 <meta name="description" content="タスク"> 29 <title>タスク</title> 30</head> 31<body> 32 <p>接続成功.</p> 33</body> 34</html>

ポイントは、データベース接続で例外が発生した場合に
すでにhtml出力してしまうと正しく情報を出力する妨げになりうるため、
データベース処理部分のあとにHTMLのヘッダーやら本体やらを置いていることです。
フォーム入力をデータベースに反映する場合にも
この組み方を真似すると良いでしょう。

次に、データベースにデータを格納できるかどうかをテストします。

php

1<?php 2 3ini_set('error_reporting', E_ALL); 4ini_set('display_errors', 1 ); 5 6try{ 7 8 $dsn = 'mysql:dbname=morning glory;host=127.0.0.1;charset=utf8mb4'; 9 $user = 'root'; 10 $password = 'root'; 11 12 $pdo = new pdo($dsn, $user, $password, [ 13 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 14 PDO::ATTR_EMULATE_PREPARES => false 15 ]); 16 17 $stmt = $pdo->prepare('INSERT INTO tasks("name", "registered_date") VALUES (:name, now());'); 18 $pdo->beginTransaction(); 19 try { 20 $stmt->bindValue(':name', 'sample text', PDO::PARAM_STR); 21 $stmt->execute(); 22 $pdo->commit(); 23 } 24 catch (PDOException $e) { 25 $pdo->rollBack(); 26 throw $e; 27 } 28 29} 30catch (PDOException $e) { 31 header('Content-Type: text/plain; charset=UTF-8', true, 500); 32 exit($e->getMessage()); 33} 34?> 35<!DOCTYPE html> 36<html lang="ja"> 37<head> 38 <meta charset="utf-8"> 39 <meta name="description" content="タスク"> 40 <title>タスク</title> 41</head> 42<body> 43 <p>データ格納成功.</p> 44</body> 45</html>

みたいな。

丁寧にbeginTransaction()とか書く習慣を身に着けておくと良いです。
たまたま今回は一つのテーブルにデータを保存するだけかもしれませんが、
規模が大きくなってくると複数のテーブルにデータを書き込むことになり、
書き込んでいる途中でエラーが生じた場合に、
書き込む前の状態まで巻き戻す(rollback()する)必要があります。
その練習だと思って書きました。

データベース処理のその先については
PHPでデータベースに接続するときのまとめ - Qiita
を折りに触れて読み返すことをおすすめします。

フォーム入力の検証については、
流行り(?)のfilter_input()を使うとよいかと。
$name = $_POST['text'];

$name = filter_input(INPUT_POST, 'text');
とすることで、POST受信していなければ文字列長ゼロの文字列になりますし。
もちろん、そのあと$nameにふさわしくない文字が含まれているかどうかを検証する処理は必要です。
(へんな記号は使いたくないとか、そこは自分で仕様を決める部分ですが。)

ここでは伝えきれないことも多々あるので、
細かな場面毎の使える技術の積み重ねを心がけてください。

老婆心ながら、
フォーム上ではtext、
php上の変数名がnameとなるのは、
規模が大きくなってくるといちいち場面毎に
どこになんのデータが入っているかを対照表を作らなきゃならなくなるので、
なるべくフォーム上も変数名もテーブル上のカラム名も同じ名称を使うようにするべきかと。
使えない場合でも簡単に類推できるようでないと、
後々自分の首を絞めます。
(数カ月後にテコ入れしようとした場合とか忘れてる。)

さらに老婆心ながら、
日付らしきデータを
$Registered_Date = data("yyyy/mm/dd");
で作っているようですが、
日付時刻データを文字列で処理するのはナンセンスです。
具体例としては、
・日付や時刻の足し算引き算、
・2つの日付や時刻の差を求めるとき、
など大変なので、
php上ではDateTimeクラスなど、
データベース上ではDATE型TIMESTAMP型を使います。
php内で特に処理しなくても、
データベース上で使えるnow()関数があります。
一度ご自身で調べてみてください。

投稿2019/05/03 01:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

色々つっこむところはありそうに思いますが、取り急ぎ、$_POSTです。
変数は大文字小文字を大別するので正確に。はじめのうちはPHPマニュアルからコピペするくらいがちょうどいいです。
※今は入力値の検証もできるfilter_input()を使うのが主流になってきています


エラー表示はONに
されているようですが、エラーメッセージ確認しましたか?変数未定義・または配列のindexエラーが出ているはずです。
特に学習段階や開発途中はエラーメッセージが問題解決・問題切り分けのヒントになります。

下記のような記事は必ず目を通しておいてください。


質問するときのヒント」は読んでほしいのですが、「起きている問題(エラーメッセージ)」「聞きたい事」「要件」は具体的に記載してください(はじめのうちは質問テンプレートを利用するのが良い)
質問は編集できる、、ということも覚えておいてください(この質問からやってみてください)

投稿2019/05/02 20:58

編集2019/05/02 22:14
m.ts10806

総合スコア80850

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

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

Cherry1217

2019/05/03 01:56

ご回答ありがとうございます。 もう一点訪ねたいのですが、 if(count($errors) === 0){ $sql = "select task from task_information where task = 'テスト';"; } の一番最初の行で「Notice: Undefined variable: errors in /Applications/MAMP/htdocs/PHP/index.php on line 43」 変数が未定義だと言われてしまうのですが、「$errors」という変数を定義しているにも関わらず エラーとして表示されてしまう理由がわかりません。 ヒント等いただけると助かります。
m.ts10806

2019/05/03 02:02

定義されないパターンがあるからですね。 ifなどで分岐させてますよね。 分岐などなにもないところで確実に初期化した変数を定義してください。
退会済みユーザー

退会済みユーザー

2019/05/03 02:19

横から。 $errors['text'] = 'タスクを入力してください。'; と $errors = 'タスクを入力してください'; って見つけるけど、そもそも$errorsを初期化してないからだよね。
m.ts10806

2019/05/03 02:37

ちょこちょこ直すよりいったん造り直してもいいかもしれませんね。 CRUDの基本形なので自分できちんと全て理解できるまで何度も作り直しても読み直してしたほうが身に付きます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問