リモートデータベースクラウドサービスがあるクラウドにdrupalサイトをインストールしています。
しかし、drupalはHost
を無視しているようで、リモートデータベースに接続するために_unix_socket
_を使用しています。
インストール中のデータベースのセットアップ画面は次のとおりです。データベース名、ユーザー名、パスワードは正しいと思います。 Host
フィールドでIPアドレスとドメイン名を試しました。 socket
フィールドにはemptyが残ります。
そして私は得ました:
データベースサーバーへの接続に失敗しました。サーバーは次のメッセージを報告します:SQLSTATE [HY000] [2002]無効な引数。
私はPHPとmysqlに精通していません。何が無効な引数です。私はgrep
をいくつか実行し、_[drupaldir]/includes/database/database.inc
_にprint_r()
を追加します。
_$driver_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
print_r($dsn);print_r($username);print_r($password);print_r($driver_options);
// Call PDO::__construct and PDO::setAttribute.
parent::__construct($dsn, $username, $password, $driver_options);
_
これは私が得たものです(いくつかの改行を追加し、実際の名前とパスワードを置き換えます):
_mysql:unix_socket=;dbname=demo_db
demo_username
demo_password
Array ( [1000] => 1 [20] => 1 [3] => 2 )
_
つまり、Drupalインストールは、Host
を無視し、空であっても_unix_socket
_を使用しますか?
私はこの問題を見つけたと思います。 contains/database/mysql/database.inc、32行目:
// The DSN should use either a socket or a Host/port.
if (isset($connection_options['unix_socket'])) {// will be TRUE if unix_socket is ''
$dsn = 'mysql:unix_socket=' . $connection_options['unix_socket'];
}
else {
// Default to TCP connection on port 3306.
$dsn = 'mysql:Host=' . $connection_options['Host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']);
}
$connection_options['unix_socket']
は、ページ上で空のままにすると、空の文字列になります。したがって、このテストはTRUE
になります。 isset
を!empty
に置き換えて、この問題を解決してください:)