MySQLテーブルの存在チェックでエラー

このQ&Aのポイント
  • データーベースにテーブルが存在するかどうかのチェックについてお聞きします。テーブルが存在しない際のエラー処理やテーブルの作成についてアドバイスをいただきたいです。
  • テーブルの存在確認にはSHOW TABLES文を使用し、テーブルが見つかったかどうかをfetchRowメソッドで判定します。存在しない場合はエラーオブジェクトが返され、その場合は新規にテーブルを作成します。
  • 現在のコードでは、テーブルが見つからない場合にエラーオブジェクトが返され、エラーメッセージが出力されます。テーブルの作成処理はまだ記述されていませんので、追加する必要があります。
回答を見る
  • ベストアンサー

MySQL テーブルの存在チェックでエラー

宜しくお願いします。 環境 php5 MySQL5.6 PEAR (mdb2) Smarty レンタルサーバー(ロリポップ:チカッパ)でテスト確認 ---------------- データーベースにテーブルが存在するかどうかのチェックについてお聞きします。 下記コードをご確認の上よろしくお願いします。 テーブルが存在しない時は、エラーオブジェクトがかえるのでしょうか? それとも0(ゼロ)などの数値がかえるのでしょうか? また、テーブルが存在しないかどうかのチェックは下記のようにすれば大丈夫でしょうか? ------------------------------------.. //$mdb2にはDBへの接続情報はきちっと格納されています。 $sql = "SHOW TABLES FROM dbname LIKE 'tablename'"; $request = $mdb2->query($sql); //★ if($request->fetchRow()){    //※テーブルが見つかった場合の処理 }else{ //※テーブルが見つからない場合の処理 } ------------------------------------ 上記を実行すると、 テーブルが存在しない際は、エラーとなります。 ※ Call to undefined method MDB2_Error::fetchRow() テーブルが存在してるときは、エラーとなりません。 そもそも、テーブルの存在確認で、テーブルが存在しない際は、 エラーオブジェクトがかえるようになっているのでしょうか? それともエラーとはならず、0など値が返るもんでしょうか? ★の位置でチェックすると、エラーオブジェクトが返ってきています。 if (PEAR::isError($request)){ echo $sth->getDebugInfo(); exit(); } その為、★より以下を実行されていなく、 ※ Call to undefined method MDB2_Error::fetchRow() のエラーがでて引っかかってると思います。 実現したいこととしては、 DBにテーブルが無いときは、新規にテーブルを作成する。 というものです。 もし、 if($request->fetchRow()){ ・・・・ }else ・・・・ } に問題があれば修正したいので、最良の書き方を教えていただくとありがたいです。 どうぞ宜しくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>下記のような関数(配列を返すだけ)で接続情報を受け渡ししています。 基本的に(PDOなどで接続するのに)データベース名にハイフンがあっても問題ありません。逆にこの時点ではバッククォートがあるとマズイです(SQL文ではないので)。おそらくここで(余計なバッククォートがあるので)接続出来ずに引っかかっていると思います。つまり「接続情報」でのデータベース名にはバッククォートを付けてはいけません。 とはいえ接続情報に使うデータベース名とSQL文で使うデータベース名(後者はバッククォートで括る)の二つを持つなんてのは無駄ですね。なので本来はSQL文を組み立てる側で(この関数の戻り値を利用している側で)バッククォートを補うべきです。 プログラム内で「データベース名」を使っている部分は限られると思いますので、書き直すしかないです。あるいはバッククォートで括ったデータベース名を定義しておいて、接続&データベース選択で使うときにバッククォートを(str_replaceなどで)消して使うかでしょう(こちらは普通に書いていれば一箇所しかないハズ)。可能であれば前者を採るべきですが・・・

n-yuuki
質問者

お礼

この度は毎度のご丁寧な回答をいただき、 大変助かりました。有難うございまいした。 結局のところ、ご指摘のようにプログラムを部分的に書き直し、 また、的確な回答ばかりだったので驚くほどスムーズにいきました。 無事目的を達成できました。 今回は本当に勉強になりましたのでこころからお礼を申し上げます。 有難うございました。

その他の回答 (3)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>the right syntax to use near '-t1 LIKE 't1_p'' at line 1 テーブル名をバッククォートで括ってください。ハイフンが演算子(マイナス)として認識されています。 SHOW TABLES FROM `LAA04-t1` LIKE 't1_p'

n-yuuki
質問者

お礼

すみません、追記です。 //★ここに `LAA04-t1` ←このように書くと接続そのものができないようです。 のところですが、 ただしくは //★ここに '`LAA04-t1`' です。 シングルクォートで囲った中にバッククォートで囲んでいます。

n-yuuki
質問者

補足

有難うございます! ロリポップでテストを繰り返していたのですが、 このサーバーは、データーベース作成時には自動的に ハイフンを絡めたデーターベース名を割り振るようになっています。 その為、ご指摘にありますようにそれをバッククォートで囲んでやる必要がありました。 MySQLの場合、ハイフンが絡むデーターベース名にはバッククォートがで囲む必要があると激しく勉強になりました。 それにしても嵌りました・・・・。 ローカル環境ではハイフンが入るようなDB名を設定したことがなく、今回のようなことに気づかずにずっときていまいした。 エラー文からその対応を推測できるようにもならないとダメだなともおもいました。 最後に質問です。 データーベースに接続する際に、 下記のような関数(配列を返すだけ)で接続情報を受け渡ししています。 function Extra(){ $t = array( 'phptype' => 'mysql', 'username' => 'LAA04', 'password' => '******', 'hostspec' => 'mysql006', 'database' => 'LAA04-t1',//★ここに `LAA04-t1` ←このように書くと接続そのものができないようです。 'charset' => 'utf8' ); return $t; } 上記の配列の中で、 'database' => 'LAA04-t1', の項目がありますが、この値のところに前述の通りに バッククォートで囲ったDB名を書き込むとエラーとなるようなんです。 この関数に書かれた接続情報は、プログラム中で使いまわししているので、 この部分にバッククォート囲んだDB名を設置すればプログラム全体を書き直す必要もないのですが、ダメなようなんです。 配列の値にはバッククォートは入れちゃだめなんでしょうか?

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>[message] => MDB2 Error: syntax error >[userinfo] => _doQuery: >[Error message: Could not execute statement] [Last executed query: SHOW TABLES FROM・・・・・・・・・・・・・ エラーメッセージとしてはsyntax errorですね(SQL文の文法間違い)。Last execute queryの後ろに続くSQL文は一字一句間違いありませんか?コピペしてphpMyAdminで実行させてみるなどしてみてください。 #dbnameやtablenameは英数字、ハイフン、アンダースコアだけですよね?

n-yuuki
質問者

補足

phpMyadminにてSQLを流してみました。 SHOW TABLES FROM LAA04-t1 LIKE 't1_p' です。 やはりエラーがでてしまいました。 #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 '-t1 LIKE 't1_p'' at line 1 ハイフンやアンダースコアを利用していますが、 問題ないように思えます。 ちなみに、 SHOW TABLES とだけですとエラーがです、正常に稼動しています。 ※上記はすべてテーブルを一つも作成していない状況でおこないました。 ※DB名やテーブル名はダミーです。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

#mdb2は詳しくないので、mdb2固有の使い方はわかりませんが(汗 >$request = $mdb2->query($sql); この時点で$requestがエラーなら、$request->fetchRowを実行してはいけない。というか実行する意味がない($requestが期待したオブジェクトになっていないのでundefined methodになるのは当然)です。 なお、普通は(提示されたSQL文であれば)テーブルがなくてもエラーにはならないハズです。つまり >テーブルが存在しない時は、エラーオブジェクトがかえるのでしょうか? >それとも0(ゼロ)などの数値がかえるのでしょうか? 正しいresourceが返ります。で、件数は0なので最初のfetchでfasleになります(普通のselect文で件数 0 のテーブルを読むのと変わりません)。 ∴ もし$requestがエラーになるのだとしたらエラー内容を表示して確認するなどしてください(それが提示されないと何とも・・・)。

n-yuuki
質問者

補足

$requestのprint_r()での出力は下記です。 エラー文が長々と続きますので最初のエラー文だけです。 -------------------------------- MDB2_Error Object ( [error_message_prefix] => [mode] => 1 [level] => 1024 [code] => -2 [message] => MDB2 Error: syntax error [userinfo] => _doQuery: [Error message: Could not execute statement] [Last executed query: SHOW TABLES FROM・・・・・・・・・・・・・ ---------------------------- 以上です。 とくにエラーをみて判別できるようなものではないようですが。。。いかがでしょう? 何かご指摘ありますでしょうか?

関連するQ&A

  • MDB2 [Call to undefined method MDB2

    MDB2 [Call to undefined method MDB2_Error::execute()] 以下のようなMDB2を利用したSELECT文を書きましたが、 最終行で、 Call to undefined method MDB2_Error::execute() が出ます。 どのように修正すれば良いでしょうか? ===================================================================================== require_once('/usr/share/pear/PEAR/MDB2.php'); $db=MDB2::connect('mysqli://【user】:【password】@localhost/【dbname】?charset=utf8'); if(PEAR::isError($db)){ die($db->getMessage()); } $sql = 'select * from user where name=? and password=?'; $types = array('text','text'); $stmt=$db->prepare($sql, $type, TRUE); $data = array('guest' , 'guest'); $res = $stmt->execute($data); ===================================================================================== 下から3行目の$stmtがMDB2_Errorオブジェクトなのまでは分かるのですが、 どう対処すればよいかが不明です。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PEARでレコード数の取得

    レコード数の取得でPEAR_DBで $sql = 'SHOW COUNT(*) FROM XXX'; $res = $db->query($sql); $rocordcnt = $res->fetchRow(); したら Fatal error: Call to undefined method DB_Error::fetchRow() になりました。 $sql = 'SHOW * FROM XXX';だったら$rocordcntに最初にヒットしレコードが 配列で入るのですが、count(*) を得るにはどうしたらよいですか? 他の方法のありますが、勉強のために count(*) の結果の取得を教えて下さい。

    • ベストアンサー
    • MySQL
  • PEARのエラーを救ってください。

    こんにちは,よろしくお願いします。 6行目 $rs = $db->query("SELECT * FROM member ORDER BY id ASC"); PEAR::DBで,上のようなクエリーを実行しようとすると次のようなエラーが出ます。 Fatal error: Call to undefined method DB_Error::query() in /home・・・・・/aaaa.php on line 6 PEAR::MDB2でも同じエラーが出ます。 また,PEARを使わないデータベースとの接続は,問題なくできます。 接続はうまくいっているようなのですが,原因と対処法を教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • Compact Edition でテーブルの存在チェック

    Visual Studio 2005 (VB) から、 SQL Server 2005 Compact Edition に対し、 テーブルの存在チェックを行いたいのですが、 SQL文の書き方がわかりません。 Compact Edition 以外のSQL Server でしたら、 以下のような SQL でチェックできる事は知っております。 IF object_id('Northwind..Orders', 'U') IS NOT NULL PRINT N'存在します' ELSE PRINT N'存在しません' 例外にて判断する方法は、最後の手段と考えております。 ご存じの方、どうぞ宜しくお願いします。

  • PEAR::MB2によるPHP+MySQLについて

    PEAR::MB2でPHP+MySQLを勉強中なのですが、特定カラムの値を取得することができません。 下記のソースコードで、変数$aaaをechoで参照すると空白となってしまいます。 大変恐縮ですがご教授のほどよろしくお願いいたします。 [環境]----------------------------------------------------------- OS: windows7(64bit) PHP: ver5.3.8 MySQL: ver5.5 Pear::MDB2  pear/MDB2 2.5.0b3 2.4.1 database abstraction layer  pear/MDB2_Driver_fbsql 0.2.0 fbsql MDB2 driver  pear/MDB2_Driver_ibase 1.5.0b3 ibase MDB2 driver  pear/MDB2_Driver_mssql 1.5.0b3 mssql MDB2 driver  pear/MDB2_Driver_mysql 1.5.0b3 1.4.1 mysql MDB2 driver  pear/MDB2_Driver_mysqli 1.5.0b3 mysqli MDB2 driver  pear/MDB2_Driver_oci8 1.5.0b3 oci8 MDB2 driver  pear/MDB2_Driver_odbc 0.1.0 ODBC Driver for MDB2  pear/MDB2_Driver_pgsql 1.5.0b3 pgsql MDB2 driver  pear/MDB2_Driver_querysim 0.6.0 querysim MDB2 driver  pear/MDB2_Driver_sqlite 1.5.0b3 sqlite MDB2 driver  pear/MDB2_Driver_sqlsrv 1.5.0b3 sqlsrv MDB2 driver  pear/MDB2_Schema 0.8.5 XML based database schema manager  pear/MDB2_TableBrowser 0.1.2 Database table abstraction library (pear list -allから一部抜粋) [ソースコード]----------------------------------------------------------- require_once("MDB2.php"); $dsn = "mysql://user:pass@localhost/db_name"; $conn = MDB2::connect($dsn); // 接続に失敗したらメッセージを表示して終了 if (MDB2::isError($conn)){ die($conn->getMessage()); } //フェッチモード設定 $conn->setFetchMode(MDB2_FETCHMODE_ASSOC); //SELECT文 $sql = <<<EOS SELECT * FROM db_table WHERE name = 'taro' EOS; //実行 $res = $conn->query($sql); //エラーチェック if (PEAR::isError($res)) { die($res->getMessage()); } //値の取得 $row = $res->fetchRow(); //変数$aaaに、別カラム値(例:miyoji)を格納 $aaa = $row['miyoji']; echo "$aaa"; //←(例)mysqlから田中といった苗字を出力したい。 //クローズ $conn->disconnect(); ----------------------------------------------------------------------- エラー出力はありません。

    • ベストアンサー
    • PHP
  • MySQLから連続でデータを取るとエラーが

    $sql = "select ホゲ from ホゲホゲ where ホゲホゲホゲ like '%ホゲホゲ%';"; $result = $db->query($sql); if (DB::isError( $result )) { die($result->getMessage()); } while($row = $result->fetchRow()){ echo $row[0]; // 返却データをループ } という感じのプログラムを、テーブル名のみを変更して13行並べているのですが、最後の4つあたりが「DB Error: no such field」というエラーが出て正常に処理されません。 エラーが出ている箇所を上のほうに持ってくると解決するのですが、するとまた下の4つが・・・という感じです。 これって何が原因なのでしょうか?

    • 締切済み
    • PHP
  • テーブルの存在チェックについて

    oracle初心者です。 テーブルの存在をチェックする命令はあるのでしょうか? オンラインマニュアルやSQLポケットリファレンスなどを参考に探したのですが見つかりませんでした。 SELECT count(*) FROM テーブルA・・・などでステータスを判断(ZERO以外は未存在)し存在有無を確認するような方法しかないのでしょうか? よろしくお願いします。

  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • PEAR MDB2 のsetFetchModeが設定がうまくいきません

    お世話になります。 Pearのmdb2を使用し始めたのですが、 setFetchMode(DB_FETCHMODE_ASSOC) の記述をしても、データが連想配列形式になりません。 (数値添え字の配列になってしまいます。) 何か問題として考えられることはありませんでしょうか。 環境は、 CentOS5 apache 2.2.3 php 5.1.6 mysql 5.0.22 (すべてRPM) です。 ソースは下記のとおりです。 $mdb2 =& MDB2::connect( $dsn, array() ); if( PEAR :: isError( $mdb2 ) ){ $errmsg .= "データベースの接続に失敗しました。<br />"; }else{ //連想配列で取り出す $mdb2->setFetchMode(DB_FETCHMODE_ASSOC); $res =& $mdb2->query('SELECT * FROM tablename'); if (PEAR::isError($res)) { $errmsg .= "SQLの実行に失敗しました。<br />"; } print("<pre>"); while ($row = $res->fetchRow()) { print_r($row); } print("</pre>"); // 接続断 $mdb2->disconnect(); } アドバイスがあればぜひよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • チェックボックス検索システム

    http://php.dori-mu.net/search.html このサイト(php dream)のソースを丸写しし(データベースサーバー、データベース名、パスワード、テーブル名は入力)したんですが、検索ボタンを押すとエラーが出ます。(phpソースのエラー文)他に何か設定がいるんでしょうか?レンタルサーバーはヘテムルでphpmyadmin。テーブルは作成し、php dreamのsqlソースをsqlから入力し、実行しました。 エラー文を記述するよう言われた為記述いたします。 search.php内の「//エラーチェック //リクエストメソッドチェック if($REQUEST_METHOD != "POST") { print "Error: invalid method"; exit(); } 」 Error: invalid methodこの部分のみ表示されます。 あと、このサイトではデータベースsampleとbbs、テーブルsearchとbbsを作るよう書いてありますが、データベースとテーブルを二つずつ作る必要があるんですか?

    • ベストアンサー
    • PHP

専門家に質問してみよう