前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー