(php 5.3.3)
If $port is a string, such as "3306", mysqli::query() will not work, even though mysqli_connect_errno() reports no error (value 0)!
<?php
$mysqli = new mysqli("localhost", "user","password","database", "3306"); //port is a string!
$mysqli->query("SELECT 1;")->fetch_assoc();
// Fatal error: Call to a member function fetch_assoc() on a non-object
?>
This is particularly strange, since mysqli::query() should return a result object, or a boolean.
So, be careful when you read your port from a string or config file. Cast it to int first:
<?php
$port = (int)$port;
?>
mysqli::__construct
mysqli_connect
(PHP 5)
mysqli::__construct -- mysqli_connect — 新規に MySQL サーバーへの接続をオープンする
説明
オブジェクト指向型
$host = ini_get("mysqli.default_host")
[, string $username = ini_get("mysqli.default_user")
[, string $passwd = ini_get("mysqli.default_pw")
[, string $dbname = ""
[, int $port = ini_get("mysqli.default_port")
[, string $socket = ini_get("mysqli.default_socket")
]]]]]] )手続き型
$host = ini_get("mysqli.default_host")
[, string $username = ini_get("mysqli.default_user")
[, string $passwd = ini_get("mysqli.default_pw")
[, string $dbname = ""
[, int $port = ini_get("mysqli.default_port")
[, string $socket = ini_get("mysqli.default_socket")
]]]]]] )実行中の MySQL サーバーへの接続をオープンします。
パラメータ
-
host -
ホスト名または IP アドレスです。この引数に
NULLまたは "localhost" を渡すと ローカルホストとみなされます。もし可能な場合、TCP/IP プロトコルの代わりに パイプが使用されます。ホストの前に p: をつけると、持続的な接続を開きます。 接続プールから開いた接続上で mysqli_change_user() が自動的にコールされます。
-
username -
MySQL のユーザー名。
-
passwd -
省略したり
NULLを渡したりした場合、MySQL サーバーは パスワードを持たないユーザーレコードについてのみ認証を試みます。 これによってひとつのユーザー名において(パスワードが指定されたか 否かによって)違うパーミッションを与えることができます。 -
dbname -
指定した場合は、 クエリが行われるデフォルトのデータベースとなります。
-
port -
MySQL サーバーに接続する際のポート番号を指定します。
-
socket -
使用するソケットあるいは名前つきパイプを指定します。
注意:
socket引数を指定しても、MySQL サーバーへの 接続時の型を明示的に定義することにはなりません。MySQL サーバーへの 接続方法についてはhost引数で定義されます。
返り値
MySQL サーバーへの接続を表すオブジェクトを返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.3.0 | 持続的な接続機能が追加されました。 |
例
例1 mysqli::__construct() の例
オブジェクト指向型
<?php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
/*
* これは "公式な" オブジェクト指向のやりかたですが、
* PHP 5.2.9 および 5.3.0 より前のバージョンでは $connect_error は動作していませんでした
*/
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
/*
* PHP 5.2.9 および 5.3.0 より前のバージョンとの互換性を保ちたい場合は
* $connect_error のかわりにこのようにします
*/
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
オブジェクト指向型で mysqli クラスを継承する例
<?php
class foo_mysqli extends mysqli {
public function __construct($host, $user, $pass, $db) {
parent::__construct($host, $user, $pass, $db);
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
}
$db = new foo_mysqli('localhost', 'my_user', 'my_password', 'my_db');
echo 'Success... ' . $db->host_info . "\n";
$db->close();
?>
手続き型
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
if (!$link) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . mysqli_get_host_info($link) . "\n";
mysqli_close($link);
?>
上の例の出力は以下となります。
Success... MySQL host info: localhost via TCP/IP
注意
注意:
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() - 事前にオープンしているデータベース接続を閉じる
If you get an error like
Can't connect to MySQL server on 'localhost' (10061)
and you use named pipes/socket connections (or aren't sure how you installed the MySQL server) try the following connect command:
<?php
mysqli_connect('.', $user_name, $password, $database_name, null, 'mysql');
?>
The '.' as hostname is absolutely necessary when using named pipes. 'localhost' won't work. 'mysql' is the standard name for the pipe/socket.
If you have error like "Trying to clone an uncloneable object of class..." when trying connect, add record
php_value zend.ze1_compatibility_mode 0
in your .htaccess file. This resolve connection problem.
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.
If you want to connect to local named pipe on windows and you get error "php_network_getaddresses: getaddrinfo failed: No such host is known. ", even if you using using "." as host, please check your if you are using mysqlnd driver: If this is true, then probably you need to update to version 5.4 of php:
Named pipes support for Windows was added in PHP version 5.4.0.
@ http://php.net/manual/en/mysqlnd.overview.php
Hopefully that will save you some time.
To specify charset in my.cnf file you just have to add
skip-character-set-client-handshake directive after
[mysqld]
default-character-set=utf8
