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

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

ただいまの
回答率

87.96%

パソコンを初期化したら、PHPでMySQLに接続できない。【1932エラー】

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,294

score -34

Windows10でXamppを使っています。パソコンを初期化したのですが、その影響か、PHPコードを実行したとき、MySQL(MariaDB)のデータベースに接続できないという不具合が発生しています。
Xamppのコントロールパネルでは、、MySQLは起動自体はしていて、phpMyAdminで今まで作ったデータベースを閲覧、操作することは可能です。
しかし、以前作ったDBを使ったPHPのプログラムを実行すると、DBから取り寄せる情報が表示されないという不具合が起きています。これは、PHPのデータベース接続用API(PDO)がMySQLに接続できていないということだと思います。

phpmyadminで作成したデータベースのテーブルにアクセスしようとしたところ、
1932エラー「Table 'テーブル名' doesn't exist in engine」を吐きました。
PCの初期化の時に、私の作ったテーブルが消えてしまったということでしょうか?
それとも残っていて、何らかのエラーでphpMyAdminで読み込めないだけでしょうか?
(データベース自体にはアクセスできてるので、存在するとは思うのですが…)

問題なのは、エラーメッセージが何も出ていないということです。

Googleで調べたのですが、1932エラーについての情報が少なすぎて、どうにもなりません。
(PCを初期化した結果こうなった、という状況についてはさらに情報が少ないです。)

どこの設定をチェックすればいいでしょうか?
ご回答宜しくお願いします。

追記

正常に動かないPHPプログラムの画像を張ります。
プログラム
画像の矢印の部分のSelectのところに、MySQLのDBのテーブルに入っているデータが入るはずなんです。
このプログラムのソースコードは以下の通りです。

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>プロジェクトマネージャー</title>
  </head>
  <body>
    <?php
    /*データベースから科目名と科目コードを取得しておく*/
    $dsn = "mysql:dbname=project_manager;host=localhost";
    $user = 'root';
    $password = '*******';//個人情報のため、秘匿
    $dbh = new PDO($dsn,$user,$password);
    $dbh -> query('SET NAMES utf8');

    $sql = 'SELECT code,subject_name FROM subject WHERE 1';
    $stmt = $dbh -> prepare($sql);
    $stmt -> execute();

    while(true){
      $rec = $stmt->fetch(PDO::FETCH_ASSOC);
      if($rec==false){
        break;
      };
      $subject[] = $rec["subject_name"];
      $code[] = $rec["code"];
    };

    $dbh = null;

    ?>

    単元追加 <br><br>
    <form action="tangen_main.php" method="post">
      科目:
      <select name="subject">
        <?php
        $max = count($subject);
        for($i=0;$i<$max;$i++){
          print '<option value="'.$subject[$i].'">'.$subject[$i].'</option>';
        }
        //submit時には、選択された科目コードがvalueに格納される
        ?>
      </select>
      <br>
      単元:
      <input type="text" name="tangen" value="" style="width:300px">
      <br>
      済or未<input type="checkbox" name="checkbox[]" value=""><!--checkboxはnameに[]が必要-->
      <br>
      <button type="submit">OK</button>
      <br><br>
      <a href="tangen_hyou.php">単元表へ</a>
    </form>

  </body>
</html>


phpMyAdminの方のエラーについては、以下画像のようになります。イメージ説明

追記その2

いまコマンドプロンプトで試してみたところ、データベースのテーブル一覧まではアクセスできたのですが、
SELECT文でテーブルの中に格納されたレコードを参照しようとすると、同じく1932エラーを吐きました。
つまり、phpとか関係なく、そもそも、

以前作ったテーブルが存在しないことになっている

ということです。
PC初期化の際にデータが消えてしまったのでしょうか?
データベース自体は残っているのに、なぜデータそのものだけなくなるんでしょう?

ご回答宜しくお願いSます。

追記その3 パソコン初期化前後のバックアップと復元の流れ

ある日スタートアップ画面にてフリーズにより強制終了
→スタートアップ復元起動するも完走せずに通常起動し、真っ黒な画面に。
→回復ドライブを作成し再度スタートアップ復元をするも、完走せず
→システムの復元を実行するも、問題が発生して終了。その後、再起動ループに陥る
→セーフモードでシステムの復元を実行するも、同じく
→以前のバージョンに戻そうにも、問題が発生して終了
→PCの初期化を実行。やっと正常に動くように。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • WeilSpinor

    2019/05/22 15:31

    ご回答ありがとうございます。
    MySQLの仕組みがよくわかっていないのですが、どうやら具体的なテーブルの構造やそこに入ったレコードについては、ストレージエンジンというものが管理しているようですね。

    色々調べたのですが、今回のエラーに関しては、あまりにもWeb上の情報が少なく(日本海外問わず)、わずかに存在する解決情報もストレージエンジンの仕組みをあまりわかっていない人の記録で、ほとんど参考にならないものばかりでしたので、もう復旧はあきらめて、MySQLを再インストールすることにしました。

    直接的な原因としては、なぜか該当テーブルのibdファイルがなくなっていたことのようです。
    この時点で復旧は諦めて、データベースのフォルダを手動で丸ごと削除し、同じ名前のデータベース、同じ名前・構造のテーブルを作り直そうとしたのですが、作ろうとすると、
    「既に存在します」とか言い出しました。さっきは存在しないって言ってたくせに…。
    つまり、「存在する」状態と「存在しない」状態が重ね合わさっている感じです。

    この時点で、「MySQLがテーブルの存在を確認するとき、フォルダではなく、別の何かを参照している」と気づき、それがどうやらInnoDBのデータディクショナリとかいうものらしいのです。
    一応、InnoDB関連のファイルを片っ端から(ibdata1も含む)覗いてみたところ、削除したはずのテーブル名が存在していました。これが原因なのかと思い、いっそと思ってInnoDB関連のファいるを全部削除して、もう一度CREATE TABLEをしてみたのですが、依然として「既に存在しています」…。
    もうお手上げ、となって、もうMySQL毎入れ替えるしかなさそうです

    キャンセル

  • m.ts10806

    2019/05/22 15:32

    着々と環境壊してますねぇ。

    キャンセル

  • papinianus

    2019/05/22 18:31

    テーブルはfrmも持っているのでは?また、データベースが最適と思って構成するものがファイル単位と決めてかかるのは早計だと思います。
    なくなったのか最初からなかったのかもホントのところは分かりませんが、いずれにせよデータベースのサービス中にOSが落ちた、かつバックアップをとっていない、というのは問題の性質としてノウハウが貯まったりノウハウを共有したりする領域ではないのだと思います。OSの落ち方とその時の壊れ方なんて制御できないですし、どうしようもなくて復旧しないといけなくなった事態なんて公開できるケースじゃないでしょうから

    キャンセル

回答 3

+2

コメントでも書いたんですけど、伝わってなかったようなので回答にしときますね。

エラー拾う設定を入れてください。
PHPのエラー表示をONの指定をしたうえで、
PDOExceptionを拾うようにしてください。

データが取得できているかどうかを「画面に想定の情報が出ているかどうか」で確認するのではなく、変数のデバッグによって確実に確認してください。

プログラムは組んだようにしか動かないので「想定通り動かない」ならデバッグで問題を切り分けるしかないです。
つまり、「どう動いているか」をポイントポイントで出力して地道に確認するしかないのです。
冒頭で書いたエラー表示やExceptionを拾うようにするコードもデバッグの一環です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

とりあえず、ここに書かれている対応策を参考にしてみては
シラサヤ備忘館 - [MySQL]1932 Table doesn't exist in engine エラーの解決方法
(状況的にも似ているので、幾分参考にはなるんじゃないですかね)

あ、過去質問からして、きちんと理解しないうちに行き当たりばったりでやってる感じがするので、参考記事内容をきちんと理解して、自己責任で実施してくださいね。
まあ、どうせPCを初期化したのなら、一から作り直す方がいいかもしれませんが(勉強にもなるし)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/22 01:03

    エラーログを見た結果、
    「もしかして、テーブルのフォルダの中に、ibdファイルが無いんじゃない?」
    と言われたので、フォルダを調べてみたところ、
    確かに、ibdファイルがありませんでした。
    別のデータベースのテーブルのフォルダをみたところ、
    どうも、データベースのテーブルを作成すると、そのフォルダ内に、

    テーブル名.frmとテーブル名.ibd

    という2つのファイルがセットで作成されているみたいです。
    しかし、私が最近扱っていたデータベースだけ、frmファイルはあるが、ibdファイルだけ無くなっているようなんです。

    僅かに存在する参考ブログでは、その2つのファイルをいったん削除してしまい、バックアップから復元させる、というやり方をとっているようでした。
    しかし、私のmysqlのバックアップフォルダにはバックアップが作成されていなかったので、この方法は使えないと思われます。

    あと、エラーログには「InnoDBのデータディクショナリには残ってる」と言っていました。
    データディクショナリが何を意味するのか分からないのでスルーしましたが…。

    そもそもInnoDBとはいったいなんなのか、engineとはなんなのか、mysqlとどういう関係にあるのか、よくわかりません。(調べてもレベルの高い技術者向け文章ばかり)

    もうお手上げでしょうか。

    日本のサイトだけでなく海外のサイトを見ても情報が少なすぎます。
    なぜこんなに情報が少ないんだろう…。

    キャンセル

  • 2019/05/22 22:33

    類似質問をバカスカ出して色々と情報を集めたようですね。それらの質問で回答にも上がっていますが、データベースエンジンの不整合が起きている状況なので、一から構築したほうが早いです。
    しかし、データのバックアップを取っていなかったというのは、言っちゃあなんですが、「愚の骨頂」ですね。PC初期化をすると決めたのなら、その時点で取るのは「当たり前」のことですよ。もしくは定期的に取っておくのが普通です。
    ま、こうした失敗も知識の一つのなりますから、これも「お勉強」と思って、プラスの経験としてください。

    キャンセル

  • 2019/05/23 00:16

    ええ、また一つ賢くなりました。

    キャンセル

0

大変ご苦労されたと思います。
まずデータの外部ストレージへのバックアップ方法について調べて置く必要があったのではないでしょうか。
もっともOSを含む全体のバックアップをするには特権などの知識も必要になります。
使っているPCがわからないので何とも言えないのですが外部HDを接続して必要なデーターだけ保存したら良いと思います。
Windows10のOS内部にあるファイルが関連しているとOSを含む全データーのバックアップが必要になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る