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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

2回答

3029閲覧

Uncaught PDOExceptionエラーの解決方法

planetsman

総合スコア18

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2019/07/17 14:21

編集2019/07/18 12:30

環境
MacOS Mojave 10.14.5
VirtualBox 6.0.0
Vagrant 2.2.3
CentOS Linux release 7.6.1810
Apache/2.4.6
PHP 7.2.19
mysql5.7.26

パーフェクトPHPというPHPの参考書を見ながらブログシステムの構築を行っているのですが、以下のエラーの原因が突き止められません。

Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null in /var/www/mini-blog.com/application/core/DbRepository.php:20

アカウント登録機能を実装し、投稿処理を作成している際にエラーが起こりました。
ログインしているユーザーのホームページにあたるindexアクションを作成し、投稿処理にあたるpostアクションを作成しました。
Postメソッドの実行時、statusテーブルから情報を取得する部分にてエラーが起こっているのではないかと想定しているのですが、解決できていないため質問させていただきます。

該当されると思われるファイルのソースコードを以下に記載いたします。

core/DbRepository.php

public function execute($sql,$params = array()) { $stmt = $this->con->prepare($sql); $stmt->execute($params); return $stmt; }

models/StatusRepository.php

public function insert($user_id, $body) { $now = new DateTime(); $sql = " INSERT INTO status(user_id, body, created_at) VALUES(:user_id, :body, :created_at) "; $stmt = $this->execute($sql, array( ':user_id' => $user_id, ':body' => $body, ':created_at' => $now->format('Y-m-d H:i:s'), )); }

controllers/StatusController.php

public function postAction() { if(!$this->request->isPost()){ $this->forward404(); } $token = $this->request->getPost('_token'); if(!$this->checkCsrfToken('status/post', $token)){ return $this->redirect('/'); } $body = $this->request->getPost('body'); $errors = array(); if(!strlen($body)){ $errors[] = 'ひとことを入力して下さい'; }else if(mb_strlen(($body) > 200)){ $errors[] = 'ひとことは200文字以内で入力して下さい'; } if(count($errors) === 0){ $user = $this->session->get('user'); $this->db_manager->get('Status')->insert($user['id'],$body); return $this->redirect('/'); } $user = $this->session->get('user'); $statuses = $this->db_manager->get('Status') ->fetchAllPersonalArchivesByUserID($user['id']); return $this->render(array( 'errors' => $errors, 'body' => $body, 'statuses' => $statuses, '_token' => $this->generateCsrfToken('status/post'), ),'index'); }

宜しくお願いいたします。

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

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

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

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

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

yukikp

2019/07/17 15:30

パーフェクトPHPなつかしいです。 確か誤植が結構あったはずなので、(今回の問題点と関係あるかどうかは良くみていませんが)出版社のサイトの書籍のページを一度見てみたらどうでしょうか?
planetsman

2019/07/19 11:44

ご回答有り難うございます。 書籍のページも参考にして進めてまいります。
guest

回答2

0

ベストアンサー

user_idはnullにはできませんというエラーです。(英語苦手でしたらGoogle翻訳へ)

user_idがDB上、Not Nullになっているためですね。

insert前に$this->session?というのから色々取得されているようですが、想定通りの情報がとれているかデバッグしてみてはいかがでしょうか。

蛇足。
PHP5系は全てサポート終了しています。確かに書籍では当該バージョンかもしれませんが、今5系を学習するメリットはほとんどないので、なるべく最新のバージョン(最低でも7.1以上)の環境を導入し、書籍もできればPHP7以上対応のものを利用してください。
※パーフェクトPHPが悪いわけではないですがPHP5.4はさすがによろしくないかと

投稿2019/07/17 21:17

m.ts10806

総合スコア80850

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

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

planetsman

2019/07/18 12:33

ご回答有り難うございます。 PHPのバージョンに誤記がありましたので修正致しました。 使用しているバージョンは7.2.19でした。 本件まだ未解決なのですが、単純にまだユーザー作成をしていないためにNullが渡っているということはあり得ますでしょうか。 デバックでどのような値を取得しているのかがまだどのように行えばいいのか分かっていないので引き続き調査していきます。
m.ts10806

2019/07/18 13:34 編集

質問にちょっとだけ書いてますが、下記だけで1つ進むと思います。 $user = $this->session->get('user'); var_dump($user); exit; //内容確認するだけなのでいったん止める $this->db_manager->get('Status')->insert($user['id'],$body); ほかにもデバッグについて参考になる回答者のコメント: https://teratail.com/questions/195256#reply-289628
planetsman

2019/07/19 11:40

$userにはNullが渡っていることが確認できました。 Session.phpのgetメソッドですが、 public function get($name,$default = null) { if(isset($_SESSION[$name])){ return $_SESSION[$name]; } return $default; } となっておりデフォルトではNullが渡されるようになっていました。 丁寧にご回答頂き有難うございました。
m.ts10806

2019/07/19 12:32

解決されたようで何よりです。 的確なデバッグができるようになると解決もスムーズになりますので。
guest

0

Column 'user_id' cannot be nullとあるので、「insert($user_id, $body)」の$user_idnullで渡っているのでは?

フレームワークもどきを作る書籍だったと思います。
挙動を追うのであれば、ステップ実行できるデバッグ環境を作ってしまうのが楽です。

投稿2019/07/17 21:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

planetsman

2019/07/19 11:42

ご回答有難うございます。 ご指摘の通りでした。 「ステップ実行できるデバッグ環境を作る」というアドバイスも適宜実行できるよう精進してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問