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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1264閲覧

データベースに数値が反映されません。

lilly.com

総合スコア4

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/06/08 09:41

編集2020/06/29 21:48

PHP初心者で、簡単な掲示板を作っているところです。

会員登録画面から登録した時に、データベースに数値が反映されていませんでした。エラーは出ていません。

わざとユーザー名やパスワードを間違えて見た所、
DB接続エラー : SQLSTATE[HY000] [1045] Access denied for user '(名前)'@'localhost' (using password: YES)
と表示されました。どこに問題があるのでしょうか。よろしくお願いいたします。

また、入力内容を確認する画面で写真がしっかり表示されないことも気になります。
イメージ説明

イメージ説明

dbconnect.php ↓

<?php try { $db = new PDO('mysql:dbname=mini_bbs;host=127.0.0.1; charset=utf8', 'root', 'root'); } catch(PDOException $e) { print('DB接続エラー : ' . $e->getMessage()); }

index.php↓

<?php session_start(); if (!empty($_POST)) if ($_POST['name'] === '') { $error['name'] = 'blank'; } if ($_POST['email'] === '') { $error['email'] = 'blank'; } if (strlen($_POST['password']) < 4 ) { $error['password'] = 'length'; } if ($_POST['password'] === '') { $error['password'] = 'blank'; } $fileName = $_FILES['image']['name']; if(!empty($fileName)) { $ext = substr($fileName, -3); if($ext != 'jpg' && $ext != 'gif' && $ext != 'png'){ $error['image'] = 'type'; } } if (empty($error)) { $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], '.._member_picture/' . $image); $_SESSION['join'] = $_POST; $_SESSION['join']['image'] = $image; header('Location: check.php'); exit(); } if ($_REQUEST['action'] == 'rewrite' && isset($_SESSION['join'])) { $_POST = $_SESSION['join']; } ?> ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>会員登録</title> <link rel="stylesheet" href="../style.css" /> </head> <body> <div id="wrap"> <div id="head"> <h1>会員登録</h1> </div> <div id="content"> <p>次のフォームに必要事項をご記入ください。</p> <form action="" method="post" enctype="multipart/form-data"> <dl> <dt>ニックネーム<span class="required">必須</span></dt> <dd> <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES)); ?>" /> <?php if ($error['name'] === 'blank'): ?> <p class="error">* ニックネームを入力してください</p> <?php endif; ?> </dd> <dt>メールアドレス<span class="required">必須</span></dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['email'], ENT_QUOTES)); ?>" /> <?php if ($error['email'] === 'blank'): ?> <p class="error">* メールアドレスを入力してください</p> <?php endif; ?> <dt>パスワード<span class="required">必須</span></dt> <dd> <input type="password" name="password" size="10" maxlength="20" value="<?php print(htmlspecialchars($_POST['password'], ENT_QUOTES)); ?>" /> <?php if ($error['password'] === 'length'): ?> <p class="error">* パスワードは4文字以上で入力してください</p> <?php endif; ?> <?php if ($error['password'] === 'blank'): ?> <p class="error">* パスワードを入力してください</p> <?php endif; ?> </dd> <dt>写真など</dt> <dd> <input type="file" name="image" size="35" value="test" /> <?php if ($error['image'] === 'type'): ?> <p class="error">* 写真などは「.gif」または「.jpg」「.png」の画像を指定してください</p> <?php endif; ?> <?php if (!empty($error)): ?> <p class="error">* 恐れ入りますが、画像を改めて指定してください。</p> <?php endif; ?> </dd> </dl> <div><input type="submit" value="入力内容を確認する" /></div> </form> </div> </body> </html>

check.php↓

<?php session_start(); require('../dbconnect.php'); if (!isset($_SESSION['join'])) { header('Location: index.php'); exit(); } if(!empty($_POST)) { $statement = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW ()'); echo $statement->execute(array( $_SESSION['join']['name'], $_SESSION['join']['email'], sha1($_SESSION['join']['password']), $_SESSION['join']['image'] )); unset($_SESSION['join']); header('Location: thanks.php'); exit(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>会員登録</title> <link rel="stylesheet" href="../style.css" /> </head> <body> <div id="wrap"> <div id="head"> <h1>会員登録</h1> </div> <div id="content"> <p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p> <form action="" method="post"> <input type="hidden" name="action" value="submit" /> <dl> <dt>ニックネーム</dt> <dd> <?php print(htmlspecialchars($_SESSION['join'] ['name'], ENT_QUOTES)); ?> </dd> <dt>メールアドレス</dt> <dd> <?php print(htmlspecialchars($_SESSION['join'] ['email'], ENT_QUOTES)); ?> </dd> <dt>パスワード</dt> <dd> 【表示されません】 </dd> <dt>写真など</dt> <dd> <?php if ($_SESSION['join']['image'] !== ''): ?> <img src="../member_picture/<?php print(htmlspecialchars ($_SESSION['join']['image'], ENT_QUOTES)); ?>"> <?php endif; ?> </dd> </dl> <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div> </form> </div> </div> </body> </html>

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

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

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

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

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

m.ts10806

2020/06/08 09:48

>PHP初心者の掲示板作り 質問に「初心者アイコン」がつけられるのでタイトルや内容に含める必要はありません。
m.ts10806

2020/06/08 09:51 編集

「yuka」ってなんでしょう。 コード内にないようですが、エラーからするとyukaというユーザーで繋ごうとしてます。
lilly.com

2020/06/08 10:09

コメントありがとうございます。 ・タイトルの件、承知しました。今回初めての質問でそこを理解していませんでした。 ・わかりにくくて失礼しました。 最初エラーが何も出なかったので、「データベースとの接続の際に入力情報をわざと間違えて、エラーが表示されるはずの状況でエラーが出なければパラメータに問題がある」と書いている人がいたので試してみたときの記録です。 データベースの情報を正しく書くと、「登録しました」の画面にまで行けるのですが、データベースには何も入っていませんでした。
m.ts10806

2020/06/08 10:17

「初心者アイコン」もつけられたほうが良いです。タイトル編集の横にあるアイコンをクリックして活性化すると、つきます。 現象については、「起きてる現象」としてきちんと記載してください。 問題切り分けのやりかたは間違っていないですが、肝心の「起きてる現象、問題」がないので、解決策の提示につながりません。 あと「数値が反映されない」と仰いますが、入力されるものは数値でないものの方が多いような? 何を「数値」として想定されてますか? INSERT文がMySQLでしか使えない文法であるなど気になる箇所は他にもありますが、execute実行するところにこそtry-catchは必要ですので、そちらにもtry-catch入れてみてください。 ただ、今の組み方ではエラーの出る設定になってませんので下記など参考にしてください。https://qiita.com/mpyw/items/b00b72c5c95aac573b71
guest

回答1

0

ベストアンサー

色んな基本的をすっ飛ばされているので、今現在参考にしている資料(書籍やサイト)は考え直した方が良いと思います。

ざっと列挙します。おそらく全て理解は難しいでしょうけど、1つ1つ調べながら理解していってください。

  • デバッグしましょう。ifを使った分岐の前でその変数をvar_dump()で出力して確認しましょう。今回は実はそれだけで1つ開けます。
  • header()などによるリダイレクトはREQUEST METHODはGETになるので$_POSTは定義されない

あとPHPマニュアルにあるようにheader() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。と、header()の前に出力を書いてはいけません。

  • 学習時期、開発工程(製造)はエラー表示はONにすべき
  • DBのエラーは接続を一度確立してしまえば接続時のエラーはなかなか起きるものではない。それより外部の入力を動的に受け入れるSQL実行部分の方が起きやすい。try-catchによるException捕捉はSQL実行時の処理にも必ず入れておくこと。

接続時のエラーオプション次第ではエラー補足してくれないので注意。

  • SQLはいきなりPHPから実行するのではなく、DBに対して直接実行して想定の結果を得られたものを利用すること。phpMyAdminからでもコマンドでもその他DBツールなんでも良いので、PHP以外から実行できる環境は必須。
  • プログラムはスペース1つで意味が変わる。例えばnow()now ()は別のもの。
  • INSERTはSETではなく(カラム名,,,) VALUES (値,,,)の形式を覚えた方が良い(MySQL以外では見ることはないので)
  • ユーザーから送信されたファイルのファイル名を利用するのは極力避けましょう。
  • substr($fileName, -3)これだと「ファイル名の後ろ3文字」を取ってるだけに過ぎず、ファイルタイプのバリデーションとしては不十分です(例えばexe拡張子のファイルをjpgに名前変更しただけで通ります)。ファイル自体の情報を取得しましょう。

ファイルアップロードの例外処理はこれぐらいしないと気が済まない

  • でなくてもファイルアップロード成功してもしなくてもリダイレクトしてます。ユーザーからの入力を受け付ける限り絶対はありません。

ユーザーからの入力は基本すべて信用しない を念頭に対応を入れていきましょう。

  • index.phpの下記は絶対画面に出ているはず。気にしましょう。

php

1?> 2?>

投稿2020/06/08 13:11

編集2020/06/08 13:14
m.ts10806

総合スコア80850

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

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

lilly.com

2020/06/08 13:16

m.ts10806さん 夕方頂いたコメントに返信できておらず、すみません。 そうですね、先ほど挙げてくださった記事を読み、今まさに、もう一度基礎をじっくり固めた方が良いと思っておりました。 毎回ご丁寧に書いていただいて、本当にありがとうございます!とても助かっています。↑についても一つ一つ自分で調べて学習することにします。引き続き頑張ります!!
m.ts10806

2020/06/08 13:18

>毎回ご丁寧に書いていただいて lilly.comさんは今回初質問のようですが「毎回」とは何のことでしょうか。
lilly.com

2020/06/08 13:20

今日の19時ごろのコメントのことです。同じ方だと思ったのですが…
m.ts10806

2020/06/08 13:24

あぁなるほど。初めてで「毎回」というのも変だなと思います。 私もそれなりに(3年少し)やってきてるので、「以前どこかで会ったか、同人別アカウントかな」と勘ぐってしまいます。 回答者は一度に複数の質問者を相手にすることも少なくないので、なるべく確実に「○○のこと」と具体的に示してもらえると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問