@destroy_fukuma

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

phpにおいて、テーブルが見つからないとエラーがでる。

Q&A

Closed

phpでSQLとのデータをやり取りしたい為

<?php

    try{
        $pdo = new PDO('mysql:host=mysql; dbname=mydatas; charset=utf8','root','root');

        $sql = 'CREATE TABLE users (
            id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(60) NOT NULL,
            email VARCHAR(255) NOT NULL
            )';

        $sql = "INSERT INTO users
                    (name, email) 
                VALUES 
                    ('田中', 'tanaka@gmail.com'),
                    ('山田', 'yamada@gmail.com'),
                    ('石田', 'ishida@gmail.com')";

        $pdo->query($sql);
        
        } catch (PDOException $e){
            exit ($e->getMessage());
        }

    $sql = 'SELECT * FROM users';
    
    $statement = $pdo->prepare($sql);
    
    $statement->execute();
    
    $travels = [];
    
    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
        $travels[] = $row;
    }

    $statement = null;
    $pdo = null;

    require_once 'show_table.php';

と書き、昨日は無事にデータを取り出せたのですが、今日になってデータが取り出せず、

Base table or view not found: 1146 Table 'mydatas.users' doesn't exist php

と出ます。そうしたらよいですか?

0 likes

1Answer

    $sql = 'CREATE TABLE users (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(60) NOT NULL,
        email VARCHAR(255) NOT NULL
        )';

...の後に
$pdo->query($sql);

を記述し工事完了です...(自己完結)
でも何故1回目はいけたのか解りません

0Like

Comments

  1. ええっと、これは練習コード(外部に出さない)ですよね? そう願ってます。
    それはそうと、その対応だと、テーブルが存在する時にエラーが出るので記述を消して、またテーブルが消えたら書き直さないといけないので、 CREATE TABLE IF NOT EXISTS に置き換えるとよいでしょう。
    MySQLについては、 charset=utf8 (最大3バイト) は古いのでやめましょう。 utf8mb4 (最大4バイト) にしないと、絵文字をはじめとした一部の文字が入らずエラーになります。また、もし、万一、ユーザーの入力を受け付ける際は、prepared statementを使って、安全にエスケープをしてください。
    細かいですが、emailなど、ASCII文字列のみ格納する場合は、 CHARSET ASCIICREATE TABLE 文の当該行でつけると、変な文字が入らず、エラーとなるのでいいと思います。
    PHPの作法の点では、require_onceは先頭においてください。

    $statement = null;
    $pdo = null;
    

    は不要です。ガベージコレクションが自動で行われるので、明示的に消さなくていいです。

Your answer might help someone💌