mysqli::__construct
mysqli::connect
mysqli_connect
(PHP 5, PHP 7, PHP 8)
mysqli::__construct -- mysqli::connect -- mysqli_connect — 新規に MySQL サーバーへの接続をオープンする
説明
オブジェクト指向型
?string
$hostname
= null
,?string
$username
= null
,#[\SensitiveParameter] ?string
$password
= null
,?string
$database
= null
,?int
$port
= null
,?string
$socket
= null
)
?string
$hostname
= null
,?string
$username
= null
,#[\SensitiveParameter] ?string
$password
= null
,?string
$database
= null
,?int
$port
= null
,?string
$socket
= null
): bool
手続き型
?string
$hostname
= null
,?string
$username
= null
,#[\SensitiveParameter] ?string
$password
= null
,?string
$database
= null
,?int
$port
= null
,?string
$socket
= null
): mysqli|false
MySQL サーバーへの接続をオープンします。
パラメータ
hostname
-
ホスト名または IP アドレスです。この引数に
null
を渡すと mysqli.default_host から値を取得します。 可能な場合は、TCP/IP プロトコルの代わりにパイプが使用されます。 ホスト名とポートが一緒に指定された場合は、TCP/IP プロトコルが使われます。 例:localhost:3308
.ホストの前に
p:
をつけると、持続的な接続を開きます。 接続プールから開いた接続上で mysqli_change_user() が自動的にコールされます。 username
-
MySQL のユーザー名。
null
の場合は、mysqli.default_user iniオプションに基づいてユーザー名が決定されます。 password
-
MySQL のパスワード。
null
の場合は、mysqli.default_pw iniオプションに基づいてパスワードが決定されます。 database
-
null
以外を指定した場合は、 クエリが実行されるデフォルトのデータベースとなります。 port
-
MySQL サーバーに接続する際のポート番号を指定します。
null
の場合は、mysqli.default_port iniオプションに基づいてポート番号が決定されます。 socket
-
使用するソケットあるいは名前つきパイプを指定します。
null
の場合は、mysqli.default_socket iniオプションに基づいてソケットが決定されます。注意:
socket
引数を指定しても、MySQL サーバーへの 接続時の型を明示的に定義することにはなりません。MySQL サーバーへの 接続方法についてはhostname
引数で定義されます。
戻り値
mysqli_connect() は、
MySQL サーバーへの接続を表すオブジェクトを返します。
失敗した場合に false
を返します.
エラー / 例外
mysqli のエラー報告 (MYSQLI_REPORT_ERROR
) が有効になっており、かつ要求された操作が失敗した場合は、警告が発生します。さらに、エラー報告のモードが MYSQLI_REPORT_STRICT
に設定されていた場合は、mysqli_sql_exception が代わりにスローされます。
変更履歴
バージョン | 説明 |
---|---|
8.1.0 |
mysqli::connect() は、成功時に null ではなく true を返すようになりました。
|
7.4.0 | すべてのパラメータが、nullable になりました。 |
例
例1 mysqli::__construct() の例
オブジェクト指向型
<?php
/* You should enable error reporting for mysqli before attempting to make a connection */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
/* Set the desired charset after establishing a connection */
$mysqli->set_charset('utf8mb4');
printf("Success... %s\n", $mysqli->host_info);
手続き型
<?php
/* You should enable error reporting for mysqli before attempting to make a connection */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
/* Set the desired charset after establishing a connection */
mysqli_set_charset($mysqli, 'utf8mb4');
printf("Success... %s\n", mysqli_get_host_info($mysqli));
上の例の出力は、 たとえば以下のようになります。
Success... localhost via TCP/IP
例2 mysqli クラスを拡張する
<?php
class FooMysqli extends mysqli {
public function __construct($host, $user, $pass, $db, $port, $socket, $charset) {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
parent::__construct($host, $user, $pass, $db, $port, $socket);
$this->set_charset($charset);
}
}
$db = new FooMysqli('localhost', 'my_user', 'my_password', 'my_db', 3306, null, 'utf8mb4');
例3 手動によるエラーハンドリング
エラーの報告機能が無効になっている場合、 開発者がエラーのチェックとエラー処理を行う必要があります。
オブジェクト指向型
<?php
error_reporting(0);
mysqli_report(MYSQLI_REPORT_OFF);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
if ($mysqli->connect_errno) {
throw new RuntimeException('mysqli connection error: ' . $mysqli->connect_error);
}
/* Set the desired charset after establishing a connection */
$mysqli->set_charset('utf8mb4');
if ($mysqli->errno) {
throw new RuntimeException('mysqli error: ' . $mysqli->error);
}
手続き型
<?php
error_reporting(0);
mysqli_report(MYSQLI_REPORT_OFF);
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
if (mysqli_connect_errno()) {
throw new RuntimeException('mysqli connection error: ' . mysqli_connect_error());
}
/* Set the desired charset after establishing a connection */
mysqli_set_charset($mysqli, 'utf8mb4');
if (mysqli_errno($mysqli)) {
throw new RuntimeException('mysqli error: ' . mysqli_error($mysqli));
}
注意
注意:
MySQLnd は常に、サーバーのデフォルト文字セットを想定しています。この文字セットは接続時の ハンドシェイク/認証 のときに送信され、これを mysqlnd が使います。
Libmysqlclient が使うデフォルトの文字セットは my.cnf で設定したものです。あるいは明示的に mysqli_options() をコールして設定することもできます。 これは、mysqli_init() のあとで mysqli_real_connect() を実行する前にコールします。
注意:
オブジェクト指向型 に関する注意: 接続に失敗した場合にもオブジェクトが返されます。 接続が失敗したかどうかを確かめるには、先ほどの例のように mysqli_connect_error() 関数あるいは mysqli->connect_error プロパティを使用しましょう。
注意:
接続タイムアウトなどのオプションを設定する必要がある場合は、かわりに mysqli_real_connect() を使わなければなりません。
注意:
コンストラクタをパラメータなしでコールするのは、 mysqli_init() をコールするのと同じ意味になります。
注意:
エラー "Can't create TCP/IP socket (10106)" が発生するのは、たいていは variables_order 設定ディレクティブに
E
が含まれていない場合です。 Windows では、これが含まれていなければSYSTEMROOT
環境変数が使用できず、PHP が Winsock の読み込みに失敗します。
参考
- mysqli_real_connect() - mysql サーバーとの接続をオープンする
- mysqli_options() - オプションを設定する
- mysqli_connect_errno() - 直近の接続コールに関するエラーコードを返す
- mysqli_connect_error() - 直近の接続エラーの説明を返す
- mysqli_close() - 事前にオープンしているデータベース接続を閉じる
User Contributed Notes 5 notes
Note that on all >=Windows 7 Servers, a host name "localhost" will create a very expensive lookup (~1 Second).
That's because since Windows 7, the hosts file doesn't come with a preconfigured
127.0.0.1 localhost
anymore
So, if you notice a long connection creation, try "127.0.0.1" instead.
Please do use set_charset("utf8") after establishing the connection if you want to avoid weird string issues. I do not know why the documentation does not warn you about this kind of stuff.
We had a hard time figuring out what was going on since we were using mb_detect_encoding and it said everything was UTF-8, but of course the display was wrong. If we used iconv from ISO-8859-1 to UTF-8 the strings looked fine, even though everything in the database had the right collation. So in the end, it was the connection that was the filter and although the notes for this function mention default charsets, it almost reads as a sidenote instead of a central issue when dealing with UTF and PHP/MySQL.
Just wanted to add a note for anyone looking to use the MySQLi persistent connections feature; it's important to note that PHP opens and retains one connection per database user per process.
What this means is that if you are hosting multiple applications, each with its own database user (as is good practice) then you will end up multiplying the number of connections that PHP may hold open.
For example, if you have PHP configured with a maximum of eight worker processes, and you regularly use four different database users, then your MySQL server will need to accept at LEAST a maximum of 32 connections, or else it will run out.
However, if you would like to minimise the number of connections, what you can do is instead is to open the connection using a "guest" user (with no privileges except logging in) and then use ->change_user() to switch to a more privileged user, before switching back to the guest when you're done. Since all of the connections would therefore belong to the guest user, PHP should only maintain one per worker process.
There's a separate port parameter, unlike mysql_connect. However, using host:port on the host parameter does actually work.
There is a caveat. If the host is 'localhost' then the port is ignored, whether you use a port parameter or the implicit syntax I mentioned above. This is because 'localhost' will make it use unix sockets rather than TCP/IP.
If you want to connect via an alternate port (other than 3306), as you might when using an ssh tunnel to another host, using "localhost" as the hostname will not work.
Using 127.0.0.1 will work. Apparently, if you specify the host as "localhost", the constructor ignores the port specified as an argument to the constructor.