(PHP 5, PHP 7, PHP 8)
mysqli::__construct -- mysqli::connect -- mysqli_connect — Baut eine neue Verbindung zum MySQL-Server auf
Objektorientierter Stil
$hostname
= null
,$username
= null
,$password
= null
,$database
= null
,$port
= null
,$socket
= null
$hostname
= null
,$username
= null
,$password
= null
,$database
= null
,$port
= null
,$socket
= null
Prozeduraler Stil
$hostname
= null
,$username
= null
,$password
= null
,$database
= null
,$port
= null
,$socket
= null
Baut eine Verbindung zum MySQL-Server auf.
hostname
Kann entweder ein Hostname oder eine IP-Adresse sein. Wenn diesem
Parameter der Wert null
übergeben wird, wird der Wert von
mysqli.default_host
übernommen. Wenn möglich, werden Pipes anstelle des TCP/IP-Protokolls
verwendet. Das TCP/IP-Protokoll wird verwendet, wenn ein Hostname und
eine Portnummer zusammen angegeben werden, z. B.
localhost:3308
.
Wenn dem Host ein p:
vorangestellt wird, wird eine
persistente (dauerhafte) Verbindung geöffnet. Bei Verbindungen, die aus
dem Verbindungs-Pool geöffnet werden, wird automatisch die Funktion
mysqli_change_user() aufgerufen.
username
Der MySQL-Benutzername oder null
, um den Benutzernamen aus der
INI-Option
mysqli.default_user zu
übernehmen.
password
Das MySQL-Passwort oder null
, um den Benutzernamen aus der INI-Option
mysqli.default_pw zu
übernehmen.
database
Die Datenbank, die standardmäßig bei Abfragen verwendet werden soll,
oder null
.
port
Die Portnummer, über die versucht wird, eine Verbindung mit dem
MySQL-Server herzustellen, oder null
, um den Port aus der INI-Option
mysqli.default_port zu
übernehmen.
socket
Der Socket oder die benannte Pipe an, der/die verwendet werden soll,
oder null
, um den Socket aus der INI-Option
mysqli.default_socket
zu übernehmen.
Hinweis:
Mit dem Parameter
socket
wird nicht explizit festgelegt, welche Art von Verbindung bei der Verbindung mit dem MySQL-Server verwendet werden soll. Wie die Verbindung zur MySQL-Datenbank hergestellt wird, wird durch den Parameterhostname
bestimmt.
mysqli::__construct() gibt immer ein Objekt zurück, das die Verbindung zu einem MySQL-Server repräsentiert, unabhängig davon, ob sie erfolgreich ist oder nicht.
mysqli_connect() gibt ein Objekt zurück, das die
Verbindung zu einem MySQL-Server repräsentiert. Bei einem Fehler wird false
zurückgegeben.
mysqli::connect() gibt bei Erfolg true
zurück.
Bei einem Fehler wird false
zurückgegeben. Vor PHP 8.1.0 wird bei Erfolg null
zurückgegeben.
If mysqli error reporting is enabled (MYSQLI_REPORT_ERROR
) and the requested operation fails,
a warning is generated. If, in addition, the mode is set to MYSQLI_REPORT_STRICT
,
a mysqli_sql_exception is thrown instead.
Version | Beschreibung |
---|---|
8.1.0 |
mysqli::connect() gibt bei Erfolg nun true
anstelle von null zurück.
|
7.4.0 |
Alle Parameter sind nun nullable (akzeptieren den null -Wert).
|
Beispiel #1 mysqli::__construct()-Beispiel
Objektorientierter Stil
<?php
/* Bevor versucht wird, eine Verbindung aufzubauen, sollte die Meldung von Fehlern für mysqli aktiviert werden */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
/* Einstellen des gewünschten Zeichensatzes nach dem Aufbau der Verbindung */
$mysqli->set_charset('utf8mb4');
printf("Erfolg... %s\n", $mysqli->host_info);
Prozeduraler Stil
<?php
/* Bevor versucht wird, eine Verbindung aufzubauen, sollte die Meldung von Fehlern für mysqli aktiviert werden */
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
/* Einstellen des gewünschten Zeichensatzes nach dem Aufbau der Verbindung */
mysqli_set_charset($mysqli, 'utf8mb4');
printf("Erfolg... %s\n", mysqli_get_host_info($mysqli));
Oben gezeigte Beispiele erzeugen eine ähnliche Ausgabe wie:
Erfolg... localhost via TCP/IP
Beispiel #2 Erweitern der Klasse 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');
Beispiel #3 Manuelle Fehlerbehandlung
Falls die Meldung von Fehlern deaktiviert ist, ist der Entwickler dafür verantwortlich, Fehler zu überprüfen und zu behandeln
Objektorientierter Stil
<?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-Verbindungsfehler: ' . $mysqli->connect_error);
}
/* Einstellen des gewünschten Zeichensatzes nach dem Aufbau der Verbindung */
$mysqli->set_charset('utf8mb4');
if ($mysqli->errno) {
throw new RuntimeException('mysqli-Fehler: ' . $mysqli->error);
}
Prozeduraler Stil
<?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-Verbindungsfehler: ' . mysqli_connect_error());
}
/* Einstellen des gewünschten Zeichensatzes nach dem Aufbau der Verbindung */
mysqli_set_charset($mysqli, 'utf8mb4');
if (mysqli_errno($mysqli)) {
throw new RuntimeException('mysqli-Fehler: ' . mysqli_error($mysqli));
}
Hinweis:
MySQLnd nimmt immer den Standardzeichensatz des Servers an. Dieser Zeichensatz wird während des Aufbaus der Verbindung bzw. der Authentifizierung übermittelt und danach von MySQLnd verwendet.
Libmysqlclient verwendet als Standardzeichensatz den, der in der Datei my.cnf angegeben oder durch einen Aufruf von mysqli_options() vor dem Aufruf von mysqli_real_connect() aber nach mysqli_init() gesetzt wurde.
Hinweis:
Objektorientierter Stil: Wenn die Verbindung fehlschlägt, wird trotzdem ein Objekt zurückgegeben. Um zu prüfen, ob die Verbindung fehlgeschlagen ist, kann wie in den vorangegangenen Beispielen entweder die Funktion mysqli_connect_error() oder die Eigenschaft mysqli->connect_error verwendet werden.
Hinweis:
Wenn es nötig ist, Optionen zu setzen, z. B. das Zeitlimit für die Verbindung, muss stattdessen die Funktion mysqli_real_connect() verwendet werden.
Hinweis:
Der Aufruf des Konstruktors ohne Parameter entspricht dem Aufruf von mysqli_init() .
Hinweis:
Der Fehler "Can't create TCP/IP socket (10106)" bedeutet in der Regel, dass in der Konfigurationsanweisung variables_order das Zeichen
E
fehlt. Wenn unter Windows die Systemumgebung nicht kopiert wird, ist die UmgebungsvariableSYSTEMROOT
nicht verfügbar und PHP hat dann ein Problem beim Laden von Winsock.
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.
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.
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.
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.