2013-08-28 12 views
9

私は自分のホストに新しいサイトを設定しようとしていますが(問題があればホストルート)、PDOを使用しようとするとこのエラーが発生します:PHP PDO:接続できません、カタログ名が無効です

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36 

私はこれらの設定を使用する場合:データベースがレイアウトされている方法

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

.... 

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1'); 

enter image description here

私は他のサブドメイン/メインサイトでmysqli connect fineを使用することができますが、PDOを動作させることはできません。

私は私の周り見てきた、これを試してみた:

$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1'); 

が、それは構文エラーをretuns。

誰もがこれを引き起こしている可能性がありますか?


これは私のローカルサーバー上で動作しています。接続回線とは別にアップロードしても何も変わりません。

+0

どのラインが36ですか? – Mike

+0

新しいPDO( "mysql:host = 91.146.107.11 – Mihai

+0

@Mikeその$ stmt-> execute();上記のクエリ用 –

答えて

11

の代わりに:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

試してみてください。

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

ホスト=を追加)

そして、あなたはmysql:localhost...mysql:127.0.0.1...を持っているので、それが最も可能性が高い、ローカルサーバー上で動作しますそこにそれは無視される(それがないために)ホスト=同様)、デフォルトではlocalhostです。

+0

編集:これは、ありがとう、ありがとう。 –

1

PDO manual pageから、try/catchブロックで接続をラップする必要があることがわかります。接続に何か問題が生じた場合は、この方法で通知されます。このような何か:

try { 
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 

    // Then actually do something about the error 
    logError($e->getMessage(), __FILE__, __LINE__); 
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__); 
    // etc. 
    die(); // Comment this out if you want the script to continue execution 
} 

あなたの接続にエラーがあるので、あなたがこのエラーを得ている理由ですが、あなたが停止するスクリプトを教えていないことから、それはしていません。生成されたエラーメッセージを見て、それを修正する方法を明らかにする必要があります。 Michael Prajsnarの答えはあなたが "ホスト"を設定していないという点で正しいと思われます。

編集:それは結局のところあなたはPDO接続DSNの部分であなたのhostdbnameを残せば

、PDO は(少なくともUnixでは)文句はありません。私はそれをテストし、それを空白のままにしておくと "localhost"になり、ローカルホストの接続では完全に罰金をかけて接続することができました。実際には、このようなデータベースエンジン以外のDSNで絶対に何も供給しない接続することは完全に可能である:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************"); 

唯一の問題は、データベースを使用するので、データベースを使用しないということです、ただやる:そうは言って

if ($dbh->query("USE kennyi81_gamersite") === false)) { 
    // Handle the error 
} 

しかし、は、私は私の疑問あなたが実際にあなたが何らかの形で有効なデータベースの資格情報を提供しない限り、(あなたのコメントで言及したように)try/catchブロックを使用して接続しようとしたを持っています。実際に正しく接続してkennyi81_gamersiteデータベースを選択した場合にのみ、この方法でエラーが発生しないようにしてください。そうでない場合は、次のようなメッセージが表示されます。

データベースに接続できません。 "MySQLは" 言った:SQLSTATE [28000] [1045] アクセス(パスワード使用:YES)ユーザーkennyi81_gamer '@ 'localhost' のために拒否されたあなたがしたい場合は、常にtry/catchブロックでの接続をラップ要するに

を、接続中にエラーを見つける。 PDOExceptiongetMessage()を再スローしないようにしてください。ログイン資格情報が公開されている可能性があります。

+0

私はそれを試しましたが、私は既に持っているものとは別にメッセージが表示されていません –

+0

@ TristanCunningham私の編集を参照してください – Mike

+1

例外を捕まえないでおくと、*あなたに*致命的なエラーを誘発し、さらに実行を停止させるでしょう。アドバイス – Phil

関連する問題