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

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

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

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

PHP

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

Q&A

解決済

2回答

3912閲覧

[PHP]値がDBに保存されない。

Anstrengung

総合スコア3

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/06/10 01:05

編集2020/06/10 01:51

前提・実現したいこと

現在、PHPで予定などを登録するためのカレンダーアプリを実装している途中です。
新規登録する際には、登録した内容がしっかりデータベースに反映されており、ログインもできる状態ですが、
予定を登録しようとするとデータベースに反映されません。
コードも問題ないと思うのですが、どこがおかしいのかわからないためご教示いただけると幸いです。

該当のソースコード

PHP

1<?php 2session_start(); 3require('dbconnect.php'); 4header('Expires:-1'); 5header('Cache-Control:'); 6header('Pragma:'); 7 8if ($_COOKIE['email']!== ''){ 9$email = $_COOKIE['email']; 10} 11 12 13if(!empty($_POST)){ 14$email = $_POST['email']; 15if($_POST["email"]!==''&&$_POST["password"]!==''){ 16$login = $db->prepare('SELECT * FROM users WHERE email=? AND password=?'); 17$login->execute(array( 18$_POST["email"], 19sha1($_POST["password"]) 20)); 21$user =$login->fetch(); 22 23if($user){//こちらです 24$_SESSION['id'] = $user['id']; 25$_SESSION['time'] = time(); 26 27if ($_POST['save'] === 'on'){ 28setcookie('email',$_POST['email'],time()+60*60*24*14); 29} 30header('Location:index.php'); 31exit(); 32}else{ 33$error['login'] = 'failed'; 34} 35}else{ 36$error['login'] = 'blank'; 37} 38}

PHP

1<?php 2require('dbconnect.php'); 3session_start(); 4 5if (!empty($_POST)){ 6 if ($_POST['message'] !== ''){ 7 $content = $db->prepare('INSERT INTO posts SET user_id=?, content=?'); //ここがデータベースに反映されません 8 $content->execute(array( 9 $_SESSION['id'], 10 $_POST['message'] 11 )); 12 header('Location: index.php'); 13 exit(); 14 } 15} 16?> 17<!DOCTYPE html> 18<html lang="ja"> 19<head> 20 <meta charset="UTF-8"> 21 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 22 <title>message</title> 23</head> 24<body> 25<form action="" method="post"> 26 <textarea name='message' cols="50" rows="5"></textarea> 27 <input type="hidden" name="reply_post_id" value="" /> 28 <div> 29 <p> 30 <input type="submit" value="投稿する" /> 31 </p> 32 </div> 33</form> 34</body> 35</html>

PHP

1<?php 2try{ 3 $db = new PDO('mysql:host=localhost;dbname=calender;charset=utf8','root',''); 4}catch(PDOException $e){ 5 echo "DB接続エラー:" .$e->getMessage(); 6} 7 8?>

試したこと

$_SESSION['id']、$_POST['message']ともにvar_dumpで確認し、しっかりと値は入っています。

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

開発環境
OS:Mac
Webサーバー:xampp
DB:mysql

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

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

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

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

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

m.ts10806

2020/06/10 01:16

・$_SESSIONの値はどこで設定されてるのでしょう ・テーブル定義を提示してください ・PHPからではなく直接DBに同じSQL実行するとどうなりますか あと、これは確認ではないですが、MacでXAMPPは超悪手です
Anstrengung

2020/06/10 01:30

・$_SESSIONの値はloginする際に設定しております。 ``` <?php session_start(); require('dbconnect.php'); header('Expires:-1'); header('Cache-Control:'); header('Pragma:'); if ($_COOKIE['email']!== ''){ $email = $_COOKIE['email']; } if(!empty($_POST)){ $email = $_POST['email']; if($_POST["email"]!==''&&$_POST["password"]!==''){ $login = $db->prepare('SELECT * FROM users WHERE email=? AND password=?'); $login->execute(array( $_POST["email"], sha1($_POST["password"]) )); $user =$login->fetch(); if($user){//こちらです $_SESSION['id'] = $user['id']; $_SESSION['time'] = time(); if ($_POST['save'] === 'on'){ setcookie('email',$_POST['email'],time()+60*60*24*14); } header('Location:index.php'); exit(); }else{ $error['login'] = 'failed'; } }else{ $error['login'] = 'blank'; } } ``` ・テーブル定義は以下のようになります。 テーブル名: posts カラム: id(int(11),autoincrement)・user_id(int(11))・reply_message_id(int(11))・content(int(11)) ・DBに直接実行した際は値は保存されております。 (MacでXAMPPは超悪手に関して そうだったのですか!初めて知りました。大変勉強になります。)
m.ts10806

2020/06/10 01:44

質問は編集できますので
m.ts10806

2020/06/10 01:46

あと、try-catchはSQL実行時にも入れてください。そちらで問題が起きることのほうが圧倒的に多いので必須です。 ただ、エラーモードを指定しないとエラー拾ってくれないので、指定してあげてください。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71
Orlofsky

2020/06/10 01:47

[質問への追記・修正の依頼]では字下げを表現できないので、コードは[質問]に追記されては? Teratail 側には何度も改善を依頼しているのですが、まったく音沙汰ありません。
Anstrengung

2020/06/10 01:54

m.ts10806さん ご回答ありがとうございます。 一度そちらの方法で試してみたいと思います。 Orlofskyさん 質問への追記・修正の依頼に関して教えていただきありがとうございます。
m.ts10806

2020/06/10 02:00

直接の解決方法というより問題の顕在化、切り分けのために利用してください。
m.ts10806

2020/06/10 02:06

あと、既に回答で指摘されていていることなのでこちらに書きますが、INSERTのSET構文はMySQLでしか使えないと思ってください。 他のDBでは使えないもののはずなので、SETで覚えると後々苦労します。
Anstrengung

2020/06/10 03:14

m.ts10806さん ありがとうございます。 これを機にこの書き方は辞めたいと思います。
Orlofsky

2020/06/10 03:28

[質問]のコードは字下げがコードの見易さに直結します。字下げがきちんとできないのが気にならないのは大問題です。
Anstrengung

2020/06/10 03:37

Orlofskyさん ご指摘ありがとうございます。 これからしっかりと意識していきたいと思います。
guest

回答2

0

ベストアンサー

現状のコードではエラーが出ても把握できない(=デバッグ出来ない)構造になっているので、
学習には向いていません。(教科書を投げ捨てて良い状況であれば投げ捨てて別の教科書にされることをお勧めします。)

まずはエラーを把握できないと進まないので、エラーを補足出来るようにコードを修正してみてください。

具体的には

PHP

1 $db = new PDO('mysql:host=localhost;dbname=calender;charset=utf8','root','');

PHP

1 $db = new PDO('mysql:host=localhost;dbname=calender;charset=utf8','root',''); 2 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

に変更してエラーを例外として補足できるようにして、

↓の様な形で処理全体をtry-catchで囲んでエラーを表示するようにするとエラーが補足出来るようになります。
エラーが把握出来たら、エラーで検索してみるだけでも問題が解決することが多いかと思います。

PHP

1<?php 2session_start(); 3require('dbconnect.php'); 4try { 5 header('Expires:-1'); 6 header('Cache-Control:'); 7 header('Pragma:'); 8 9 if ($_COOKIE['email'] !== '') { 10 $email = $_COOKIE['email']; 11 } 12 13 14 if (!empty($_POST)) { 15 $email = $_POST['email']; 16 if ($_POST["email"] !== '' && $_POST["password"] !== '') { 17 $login = $db->prepare('SELECT * FROM users WHERE email=? AND password=?'); 18 $login->execute(array( 19 $_POST["email"], 20 sha1($_POST["password"]) 21 )); 22 $user = $login->fetch(); 23 24 if ($user) {//こちらです 25 $_SESSION['id'] = $user['id']; 26 $_SESSION['time'] = time(); 27 28 if ($_POST['save'] === 'on') { 29 setcookie('email', $_POST['email'], time() + 60 * 60 * 24 * 14); 30 } 31 header('Location:index.php'); 32 exit(); 33 } else { 34 $error['login'] = 'failed'; 35 } 36 } else { 37 $error['login'] = 'blank'; 38 } 39 } 40 41}catch(Exception $e){ 42 echo $e->getMessage(); 43 echo $e->getTraceAsString(); 44 die(); 45}
<?php require('dbconnect.php'); session_start(); try { if (!empty($_POST)) { if ($_POST['message'] !== '') { $content = $db->prepare('INSERT INTO posts SET user_id=?, content=?'); //ここがデータベースに反映されません $content->execute(array( $_SESSION['id'], $_POST['message'] )); header('Location: index.php'); exit(); } } }catch(Exception $e){ echo $e->getMessage(); echo $e->getTraceAsString(); die(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>message</title> </head> <body> <form action="" method="post"> <textarea name='message' cols="50" rows="5"></textarea> <input type="hidden" name="reply_post_id" value="" /> <div> <p> <input type="submit" value="投稿する" /> </p> </div> </form> </body> </html> ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>message</title> </head> <body> <form action="" method="post"> <textarea name='message' cols="50" rows="5"></textarea> <input type="hidden" name="reply_post_id" value="" /> <div> <p> <input type="submit" value="投稿する" /> </p> </div> </form> </body> </html>

投稿2020/06/10 02:33

tanat

総合スコア18727

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

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

Anstrengung

2020/06/10 03:19

tanatさん ご丁寧に教えていただきありがとうございます。 教えていただいたやり方で、エラーメッセージが出たので、それに沿って無事に解決することができました。 この質問を通して、(他の方もおっしゃっていたのですが)try-catchの重要性を実感することができました。 本当にありがとうございます。
tanat

2020/06/10 03:22

解決して良かったです。
guest

0

INSERT INTO posts SET user_id=?, content=?

insertの構文じゃないですよね

INSERT INTO posts(user_id,content) values(?,?)'

投稿2020/06/10 02:01

yambejp

総合スコア116724

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

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

yambejp

2020/06/10 02:01

executeところまできちんとtry-catchすればエラーも確認できるでしょう
m.ts10806

2020/06/10 02:05 編集

MySQLだと通るやつです(これで覚えると後で苦労する)。 テーブル名も良く見るものなので、そういう書き方をしてる書籍を使ってるんだろうなと
hentaiman

2020/06/10 02:07

知らなかった 通るんですかコレ
m.ts10806

2020/06/10 02:15 編集

はい。私がこの手のINSERTに回答するときは「MySQLでしか使えないから普通の書き方覚えてね」って添えるようにしてますが、書籍特定して出版社に指摘したほうが良い気がしてきた。
yambejp

2020/06/10 02:20

あーいわれてみればそんなやり方もあったかな・・・ まぁいずれにしてもtry-catchでエラーを拾うことが解決の糸口になるかと
Anstrengung

2020/06/10 03:14

教えていただきありがとうございます。 こちらの書き方に修正いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問