PHP: Verbindung zu einer entfernten MySQL-Datenbank
Wer mit einer Maschine, auf der ein aktuelles PHP und MySQL läuft, versucht, eine Verbindung z.B. über "mysql_pconnect" herzustellen, kann eine böse Überraschung erleben: Die Verbindung will einfach nicht klappen, und das, obwohl auf dem entfernten MySQL-Server der Remote-Zugriff korrekt eingestellt ist und die Zugangsdaten absolut korrekt eingegeben wurden.
Eine Verbindung via Console klappt hingegen problemlos:
# mysql -umyuser -pmypassword -h myhostname.com mydatabase
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 219759953
Server version: 5.0.90 Gentoo Linux mysql-5.0.90-r2
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Das Ergebnis via PHP sieht so aus:
# php -r "mysql_pconnect('
myhostname.com
', 'myuser
', 'mypasswd');"
PHP Warning: mysql_pconnect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in Command line code on line 1 PHP Stack trace: PHP 1. {main}() Command line code:0 PHP 2. mysql_pconnect('db1044.mydbserver.com', 'p112542d3', 'mypasswd') Command line code:1
Die Lösung steht auch schon da: Wir werden angewiesen unser Passwort neu zu setzen, damit es im neuen, sichereren Format in der Datenbank abgelegt wird. Gesagt, getan, wir verbinden uns also wieder per Console mit der Datenbank und tippen:
mysql> SET PASSWORD = PASSWORD('mypasswd');
Query OK, 0 rows affected (0.04 sec)
mysql> exit
Bye
#
Normalerweise sollte es nun klappen - tut es aber in bestimmten Fällen nicht, nämlich dann, wenn in der my-Konfiguration "old_passwords=1" eingestellt ist.
Das können wir ganz leicht überprüfen:
mysql> SHOW VARIABLES LIKE 'old_passwords';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | ON |
+---------------+-------+
1 row in set (0.04 sec)
Die Einstellung ist also gesetzt, aber leider handelt es sich um einen MySQL-Server, auf dessen Konfiguration wir keinen Einfluss haben? Dann gehen wir wie folgt vor:
mysql> SET old_passwords = OFF;
mysql> SHOW VARIABLES LIKE 'old_passwords';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| old_passwords | OFF |
+---------------+-------+
1 row in set (0.04 sec)
mysql> SET PASSWORD = PASSWORD('mypasswd');
mysql> exit
bye
#
Nun klappt's auch mit <strike>dem Nachbarn</strike> der Verbindung:
# php -r "mysql_pconnect('
myhostname.com
', 'myuser
', 'mypasswd');"
# echo 'Juchhu!!!'
# Juchhu!!!