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

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

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

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

Q&A

解決済

1回答

2672閲覧

PHPでブログを作成中に継承のところでエラーが出ます。

Akki-ra

総合スコア5

PHP

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

0グッド

1クリップ

投稿2020/09/19 11:52

編集2020/09/20 06:44

前提・実現したいこと

PHPでブログを作っています。
【PHP/MySQL入門】
こちらの動画をみて進めていったらindex.phpのところでエラーが出ました。

エラーメッセージ Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in C:\MAMP\htdocs\dbc.php:35 Stack trace: #0 C:\MAMP\htdocs\dbc.php(35): PDO->query('SELECT * FROM ') #1 C:\MAMP\htdocs\index.php(5): Dbc->getAll() #2 {main} thrown in C:\MAMP\htdocs\dbc.php on line 35

該当のコード
dbc.php

<?php Class Dbc { protected $table_name; // 1.データベース接続 // 引数:なし // 返り値:接続結果を返す protected function dbConnect() { $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'hiatus5270'; try { $dbh = new PDO($dsn,$user,$pass,[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch(PDOException $e) { echo '接続失敗', $e->getMessage(); exit(); }; return $dbh; } // 全部のデータを取ってくる // 2.データを取得する // 引数:なし // 返り値:取得したデータ public function getAll() { $dbh = $this->dbConnect(); //⓵SQLの準備 $sql = "SELECT * FROM $this->table_name"; //⓶SQLの実行 $stmt = $dbh->query($sql); //⓷SQLの結果を受け取る $result = $stmt->fetchall(\PDO::FETCH_ASSOC); return $result; $dbh = null; } // idから一つのデータを取ってくる // 引数:$id // 返り値:$result public function getById($id) { if(empty($id)) { exit('IDが不正です。'); } $dbh = $this->dbConnect(); // SQL準備 $stmt = $dbh->prepare("SELECT * FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, PDO::PARAM_INT); // SQL実行 $stmt->execute(); // 結果を取得 $result = $stmt->fetch(PDO::FETCH_ASSOC); if(!$result) { exit('ブログがありません。'); } return $result; } } ?>

blog.php

<?php require_once('dbc.php'); Class Blog extends Dbc { protected $table_name = 'blog'; // 3.カテゴリー名を表示 // 引数;数字 // 返り値:カテゴリ0の文字列 public function setCategoryName($category) { if ($category === '1') { return '日常'; } elseif ($category === '2') { return 'プログラミング'; } else { return 'その他'; } } //Mysqlに書き込み public function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = $this->dbConnect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title',$blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content',$blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category',$blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status',$blogs['publish_status'], PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch(PDOException $e) { $dbh->rollBack(); exit($e); } } } ?>

index.php

<?php require_once('blog.php'); ini_set('display_errors', "On"); $blog = new Blog(); $blogData = $blog->getAll(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ブログ一覧</title> </head> <body> <h2>ブログ一覧</h2> <p><a href="/form.html">新規作成</a></p> <table> <tr> <th>No</th> <th>タイトル</th> <th>カテゴリ</th> </tr> <?php foreach($blogData as $column): ?> <tr> <td><?php echo $column['id']?></td> <td><?php echo $column['title']?></td> <td><?php echo $blog->setCategoryName($column['category']) ?></td> <td><a href="/detail.php?id=<?php echo $column['id'] ?>">詳細</a></td> </tr> <?php endforeach; ?> </table> </body> </html>

試したこと

dbc.phpファイルでtable_nameにblogと入れてやるとエラーが出ません。
一応動画と同じやり方でやりましたが
protected 継承のやり方が間違っているのでしょうか?

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

takasima20

2020/09/19 12:56

index.php で Dbc->getAll() みたいなことしてるんだったらそうなるんじゃないかなあ。というか、なんで親子で同じ変数を定義するんだろう。
Akki-ra

2020/09/19 14:25

動画と同じにやってもダメなんすかね?
退会済みユーザー

退会済みユーザー

2020/09/19 19:12

コードを読む気にならないです。 マークダウンを適切に使用してください。
takasima20

2020/09/20 11:36

なるほど。全角スペースまで含めて変数名と解釈されたわけか。エラーになんないんだねえ。勉強になるわ~
guest

回答1

0

ベストアンサー

$this->table_nameをダブルクォーテーションの外に出したら動くと思います。

PHP

1//⓵SQLの準備 2$sql = "SELECT * FROM $this->table_name";

PHP

1//⓵SQLの準備 2$sql = "SELECT * FROM " . $this->table_name;

コードを貼るときは入力欄の上にある<code>を使用すると、↑のように見やすくなります。

投稿2020/09/19 22:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Akki-ra

2020/09/20 06:45

行いましたがエラーが出てしまいます。
退会済みユーザー

退会済みユーザー

2020/09/20 07:23

質問に書かれているのと同じエラーでしょうか。
Akki-ra

2020/09/20 07:30

全く同じですね。
Akki-ra

2020/09/20 07:41

お手数おかけしました。 確認したところprotected $table_name = 'blog';の = の両端のスペースが全角だったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問