remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 03.10.2006 23:51:35 von Ralf Schmitz

Hi@ll,

ich habe da mal ein derbes Problem:

Wenn ich via PHP auf einen MySQL Server auf localhost zugreife, dann
funktioniert das ohne Schwierigkeiten.

Änder ich jedoch im Aufruf von mysql_connect den Host, so connected er
immernoch auf localhost und ignoriert den angegebenen Hostnamen, sowie User
und Passwort gänzlich - auf localhost geht das !

Aufruf von localhost:
mysql_connect('localhost', 'rooty', 'password');

Aufruf auf remote Host (Auszug Zeile 7-9):
7: mysql_connect('192.168.110.8', 'rooty', 'password');
8: mysql_select_db('datenbank');
9: mysql_query("insert into something");

Als Ausgabe erhalte ich dann:
Warning: mysql_connect(): Can't connect to MySQL server on '192.168.110.8'
(111) in /var/www/test.php on line 7

Warning: mysql_select_db(): Access denied for user 'www-data'@'localhost'
(using password: NO) in /var/www/test.php on line 8

Warning: mysql_select_db(): A link to the server could not be established in
/var/www/test.php on line 8

Warning: mysql_query(): Access denied for user 'www-data'@'localhost' (using
password: NO) in /var/www/test.php on line 9

Warning: mysql_query(): A link to the server could not be established in
/var/www/test.php on line 9


Natürlich sind laut phpinfo() safe_mode's deaktiviert:
safe_mode Off Off
sql.safe_mode Off Off
mysql.allow_persistent On On
mysql.connect_timeout -1 -1
mysql.default_host no value no value
mysql.default_password no value no value
mysql.default_port no value no value
mysql.default_socket no value no value
mysql.default_user no value no value
mysql.max_links Unlimited Unlimited
mysql.max_persistent Unlimited Unlimited
mysql.trace_mode Off Off


Kennt das Verhalten irgendwer von Euch ???

Übrigens bekomme ich auch o.g. Verhalten, wenn ich localhost gegen die IP
des 'localhost' ändere ... WARUM ???

Danke und Gruß
Stefan

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 00:13:46 von Bodo Eggert

Ralf Schmitz wrote:

[...]
> Änder ich jedoch im Aufruf von mysql_connect den Host, so connected er
> immernoch auf localhost und ignoriert den angegebenen Hostnamen, sowie User
> und Passwort gänzlich - auf localhost geht das !

> Aufruf auf remote Host (Auszug Zeile 7-9):
> 7: mysql_connect('192.168.110.8', 'rooty', 'password');
> 8: mysql_select_db('datenbank');
> 9: mysql_query("insert into something");
>
> Als Ausgabe erhalte ich dann:
> Warning: mysql_connect(): Can't connect to MySQL server on '192.168.110.8'
> (111) in /var/www/test.php on line 7

Ist der Zugriff für 'rooty' von dem Server aus gestattet?

BTW: tutorial-yank.php?article=tutorial-yank&kind=t&id=1847&open= 1&anc=0&view=1>

> Übrigens bekomme ich auch o.g. Verhalten, wenn ich localhost gegen die IP
> des 'localhost' ändere ... WARUM ???

Weil er dann nicht den UNIX-Socket verwendet, also von einer anderen Adresse
aus konnektiert.
--
Ich danke GMX dafür, die Verwendung meiner Adressen mittels per SPF
verbreiteten Lügen zu sabotieren.

http://david.woodhou.se/why-not-spf.html

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 01:03:07 von Carsten Wiedmann

Ralf Schmitz schrieb:

> Aufruf auf remote Host (Auszug Zeile 7-9):
> 7: mysql_connect('192.168.110.8', 'rooty', 'password');
> 8: mysql_select_db('datenbank');
> 9: mysql_query("insert into something");
>
> Als Ausgabe erhalte ich dann:
> Warning: mysql_connect(): Can't connect to MySQL server on
> '192.168.110.8' (111) in /var/www/test.php on line 7

Da solltest du halt klären, warum du keinen Connect bekommst. (benutz der
Server unter 192.168.110.8 überhaupt TCP/IP, Firewall?)


> Warning: mysql_select_db(): Access denied for user 'www-data'@'localhost'
> (using password: NO) in /var/www/test.php on line 8
>
> Warning: mysql_select_db(): A link to the server could not be
> established in /var/www/test.php on line 8
>
> Warning: mysql_query(): Access denied for user 'www-data'@'localhost'
> (using password: NO) in /var/www/test.php on line 9
>
> Warning: mysql_query(): A link to the server could not be established in
> /var/www/test.php on line 9

Da es also bisher keine Verbindung mit einem Sever gab, baut PHP beim
Benutzen einer MySQL-Funktion erst einmal eine Verbindung zum (lokalen)
Standardserver auf. Zumindest wird dieses Versucht. Da aber keine gültigen
Anmeldedaten wo hinterlegt wurden, funktioniert zwar der Connect, aber die
Anmeldung scheitert dann jeweils.


> Kennt das Verhalten irgendwer von Euch ???

Jup. Steht im PHP-Manual so drin.


> Übrigens bekomme ich auch o.g. Verhalten, wenn ich localhost gegen die IP
> des 'localhost' ändere ... WARUM ???


Siehe oben. (Server benutzt kein TCP/IP oder Firewall).
(BTW: Anstatt "die IP des 'localhost'", hättest auch gleich 127.0.0.1
schreiben können. Dann weis man wenigstens gleich was du meinst.)

xpost+fup2 d.c.l.p.d

Gruß
Carsten

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 01:33:21 von Andreas Scherbaum

Hallo,

Ralf Schmitz wrote:

> ich habe da mal ein derbes Problem:

ja, das hast du.


> Aufruf auf remote Host (Auszug Zeile 7-9):
> 7: mysql_connect('192.168.110.8', 'rooty', 'password');

<-- Genau hier fehlt deine Fehlerprüfung, ob mysql_connect()
erfolgreich war. Die Funktion liefert einen Rückgabewert zurück,
den man auswerten sollte. In deinem Fall wird dein Script dann
in den Fehlerteil springen und du wirst feststellen, das hier
schon kein Connect möglich war.

Im einfachsten Fall schaut das so aus:
$db = mysql_connect(...);
if (!$db) {
die("Fehler: " . mysql_error());

}


> 8: mysql_select_db('datenbank');

Hier versucht PHP wohl mit irgendwelchen Werten doch noch irgendeine
DB zu connecten, ist aber im Prinzip auch egal, normal sollte dein
Script hier gar nicht mehr hinkommen.

Hier fehlt allerdings ebenfalls eine Fehlerprüfung.


> 9: mysql_query("insert into something");

Und auch hier wird nicht geprüft, ob ein Fehler aufgetreten ist.



> Kennt das Verhalten irgendwer von Euch ???

Ja.
Typischer Fall von "Handbuch nicht gelesen".
Auf der Webseite haben alle Beispiele eine schöne, kurze, knackige
Fehlerprüfung eingebaut.


> Übrigens bekomme ich auch o.g. Verhalten, wenn ich localhost gegen die IP
> des 'localhost' ändere ... WARUM ???

Weil deine Datenbank nicht konfiguriert ist, um dich über etwas anderes
als localhost auf die Datenbank zu lassen?
Weil deine Firewall die Verbindungen blockiert?

Die Liste der Möglichkeiten an dieser Stelle ist lang.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 10:31:03 von Claus Reibenstein

Andreas Scherbaum schrieb:

> Im einfachsten Fall schaut das so aus:
> $db = mysql_connect(...);
> if (!$db) {
> die("Fehler: " . mysql_error());
>
> }

Warum nicht gleich so:

$db = mysql_connect(...) or die("Fehler: " . mysql_error());

Gruß. Claus

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 17:11:27 von Andreas Scherbaum

Claus Reibenstein wrote:
> Andreas Scherbaum schrieb:
>
>> Im einfachsten Fall schaut das so aus:
>> $db = mysql_connect(...);
>> if (!$db) {
>> die("Fehler: " . mysql_error());
>>
>> }
>
> Warum nicht gleich so:
>
> $db = mysql_connect(...) or die("Fehler: " . mysql_error());

Weil ich persönlich keine Programmblöcke in der gleichen Zeile
wie die Bedingung mag und erst recht keine Bedingung am Ende
der Zeile. Aber das ist mein eigener Stil, beide Codestücke
funktionieren gleich.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 19:42:21 von Johannes Vogel

Hi

Andreas Scherbaum wrote:
> Im einfachsten Fall schaut das so aus:
> $db = mysql_connect(...);
> if (!$db) {
> die("Fehler: " . mysql_error());
> }

Wenn schon
if (!is_resource($db)) {...}
Siehe auch: http://ch2.php.net/is_resource

HTH, Johannes

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 19:44:55 von Dark Rayden

On Wed, 4 Oct 2006 17:11:27 +0200, Andreas Scherbaum
wrote:

>Claus Reibenstein wrote:
>> Andreas Scherbaum schrieb:
>>
>>> Im einfachsten Fall schaut das so aus:
>>> $db = mysql_connect(...);
>>> if (!$db) {
>>> die("Fehler: " . mysql_error());
>>>
>>> }
>>
>> Warum nicht gleich so:
>>
>> $db = mysql_connect(...) or die("Fehler: " . mysql_error());
>
>Weil ich persönlich keine Programmblöcke in der gleichen Zeile
>wie die Bedingung mag und erst recht keine Bedingung am Ende

Und warum schreibst du dann die geschwungene Klammer in der gleichen
Zeile, was eigentlich schon lange eine Unart ist? &)

>der Zeile. Aber das ist mein eigener Stil,

Das ist schon OK so, aber ...

>beide Codestücke funktionieren gleich.

.... der zweite Code ist optimierter und übersichtlicher und das sollte
jeder, egal welchen Stil er hat, anstreben.

>Bye

Cya!

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 20:07:35 von Niels Braczek

Dark Rayden schrieb:

> Und warum schreibst du dann die geschwungene Klammer in der gleichen
> Zeile, was eigentlich schon lange eine Unart ist? &)

Es entspricht vielen Style-Guides, zB. PEAR oder Joomla!. Danach gehört=

die öffnende geschweifte Klammer nur dann in eine eigene Zeile, wenn si=
e
einen class- oder function-Body einleitet.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 20:36:23 von Claus Reibenstein

Dark Rayden schrieb:

> On Wed, 4 Oct 2006 17:11:27 +0200, Andreas Scherbaum
> wrote:

Datum, Uhrzeit und Mailadresse sind zum Verständnis Deiner Antwort nicht
notwendig.

>> Claus Reibenstein wrote:
>>
>>> Warum nicht gleich so:
>>>
>>> $db = mysql_connect(...) or die("Fehler: " . mysql_error());
>>
>> Weil ich persönlich keine Programmblöcke in der gleichen Zeile
>> wie die Bedingung mag und erst recht keine Bedingung am Ende
>
> Und warum schreibst du dann die geschwungene Klammer in der gleichen
> Zeile, was eigentlich schon lange eine Unart ist? &)

Weil dadurch die Zugehörigkeit zur vorherigen Kontrollstruktur leichter
zu erkennen ist. Deshalb codiere ich _immer_ nach dieser "Unart".

Die geschweifte Klammer in eine _neue_ Zeile zu setzen, empfinde _ich_
als Unart, weil dadurch der Zusammenhang _nicht_ mehr offensichtlich ist.

Gruß. Claus

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 22:50:22 von Andreas Scherbaum

Hallo,

na gut Dark ...

Dark Rayden wrote:
> On Wed, 4 Oct 2006 17:11:27 +0200, Andreas Scherbaum
> wrote:
>
>>Claus Reibenstein wrote:
>>> Andreas Scherbaum schrieb:
>>>
>>>> Im einfachsten Fall schaut das so aus:
>>>> $db = mysql_connect(...);
>>>> if (!$db) {
>>>> die("Fehler: " . mysql_error());
>>>>
>>>> }
>>>
>>> Warum nicht gleich so:
>>>
>>> $db = mysql_connect(...) or die("Fehler: " . mysql_error());
>>
>>Weil ich persönlich keine Programmblöcke in der gleichen Zeile
>>wie die Bedingung mag und erst recht keine Bedingung am Ende
>
> Und warum schreibst du dann die geschwungene Klammer in der gleichen
> Zeile, was eigentlich schon lange eine Unart ist? &)

Weil es meine eigene Eigenart ist. Du kannst dich jetzt gern weiter
über meinen Programmierstil auslassen, stört mich nicht sonderlich.
Trägt aber auch nicht wirklich zum Thema bei.


>>beide Codestücke funktionieren gleich.
>
> ... der zweite Code ist optimierter und übersichtlicher und das sollte
> jeder, egal welchen Stil er hat, anstreben.

Als ob eine Bedingung am Ende der Zeile beim Überfliegen so einfach
zu interpretieren ist wie ein abgesetzter und eingerückter Block. Noch
dazu, wenn die Zeile vielleicht so lang ist, das ich im Editor scrollen
müsste, um überhaupt festzustellen, das die Zeile, die ich am Anfang sehe,
nur eventuell ausgeführt wird.
Gut gebrüllt Löwe.

Und jetzt schreibt jeder weiter seinen Code und der OP darf selber
entscheiden, was ihm besser gefällt und was er in sein Problem
einsetzt.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 04.10.2006 23:40:57 von Frank Schenk

Carsten Wiedmann schrieb:

> (BTW: Anstatt "die IP des 'localhost'", hättest auch gleich 127.0.0.1
> schreiben können. Dann weis man wenigstens gleich was du meinst.)

Das ist nicht das selbe.

localhost -> benutzt den mysqld.sock
127.0.0.1 -> benutzt tcp/ip

Nachzulesen im MySQL Handbuch


Ergibt interessante Effekte, wenn in der my.cnf skip-networking o.dgl.
konfiguriert wurde.


gruß, Frank

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 05.10.2006 00:07:20 von Carsten Wiedmann

Frank Schenk schrieb:

> Carsten Wiedmann schrieb:
>
> > (BTW: Anstatt "die IP des 'localhost'", hättest auch gleich 127.0.0.1
> > schreiben können. Dann weis man wenigstens gleich was du meinst.)
>
> Das ist nicht das selbe.

Da dem Hostnamen "localhost" immer die IP 127.0.0.1 zugewiesen ist, ist "die
IP des 'localhost'" zwangläufig immer 127.0.0.1 und man hätte gleich die IP
(127.0.0.1) hinschreiben.

Hätte er mit "die IP des 'localhost'" z.B. 192.168.0.1 gemeint, wäre das
nicht die IP des "localhost", sondern (einer der) die LAN-IP des Rechners.
Der dazugehörige Hostname wäre dann aber nicht "localhost" (verkonfigurieren
kann man natürlich alles ;-) ).

Hätte er wirklich "localhost" gemeint, dürfte er nicht "IP des..."
schreiben, da das Wort "localhost" keine IP ist.


> localhost -> benutzt den mysqld.sock
> 127.0.0.1 -> benutzt tcp/ip

Das ist der Grund warum ihm das passiert ist. Eben weil er für die
Verbindung "127.0.0.1" (bzw. eine andere IP) genommen hat und nicht
"localhost" (als Wort). Nur warum schreibt er dann nicht "127.0.0.1" in
seinem Post, sondern "die IP des 'localhost'"? Wenn er z.B. 192.168.0.1
genommen hat, dann hat er natürlich den selben Effekt (nur ist es dann die
LAN-IP des Rechners).

Gruß
Carsten

Re: remote mySQL Zugriff scheitert (PHP Version 4.3.10-16)

am 05.10.2006 07:40:46 von Kris

Carsten Wiedmann wrote:
> Da dem Hostnamen "localhost" immer die IP 127.0.0.1 zugewiesen ist, ist
> "die IP des 'localhost'" zwangläufig immer 127.0.0.1 und man hätte gleich
> die IP (127.0.0.1) hinschreiben.

Und hier ist der Code zu Deiner Erklärung:

MySQL definiert in ./include/mysql_com.h:

38 #define LOCAL_HOST "localhost"
39 #define LOCAL_HOST_NAMEDPIPE "."

Die Namen "localhost" und "." sind also magisch.

In client/client.c:CLI_MYSQL_REAL_CONNECT() findest Du dann

1743 #if defined(HAVE_SMEM)
1744 if ((!mysql->options.protocol ||
1745 mysql->options.protocol == MYSQL_PROTOCOL_MEMORY) &&
1746 (!host || !strcmp(host,LOCAL_HOST)))
1747 {


Wenn also der shared memory Transport existiert und der Host angegeben ist
und er genau gleich dem String "localhost" ist, dann wird der shared memory
Transport statt des TCP/IP Transport verwendet. Beachte, daß das vor der
Auflösung von Hostnamen passiert, auch dann, wenn die Auflösung von
Hostnamen in MySQL abgeschaltet ist und ein von 127.0.0.1 unterschiedliches
Verhalten erzeugt.

Weiter unten:

1772 #if defined(HAVE_SYS_UN_H)
1773 if (!net->vio &&
1774 (!mysql->options.protocol ||
1775 mysql->options.protocol == MYSQL_PROTOCOL_SOCKET) &&
1776 (unix_socket || mysql_unix_port) &&
1777 (!host || !strcmp(host,LOCAL_HOST)))
1778 {
1779 host=LOCAL_HOST;
1780 if (!unix_socket)
1781 unix_socket=mysql_unix_port;

Wenn also der Unix Domain Socket Transport existiert und der Host angegeben
ist und der Hostname genau gleich "localhost" ist, dann wird der Unix
Domain Socket Transport verwendet. Wie oben ist das auch bei abgeschalteter
Auflösung von Hostnamen der Fall, und wie oben ist das Verhalten nur für
"localhost", nicht jedoch für 127.0.0.1 definiert.

Weiter unten:

1810 #elif defined(__WIN__)
1811 if (!net->vio &&
1812 (mysql->options.protocol == MYSQL_PROTOCOL_PIPE ||
1813 (host && !strcmp(host,LOCAL_HOST_NAMEDPIPE)) ||
1814 (! have_tcpip && (unix_socket || !host && is_NT()))))
1815 {

Wenn wir in Windows sind, und der Host angegeben ist und der Host genau
gleich "." ist, dann wird der Windows Named Pipe Transport verwendet. Auch
dieser Hostname ist magisch, und wird nicht aufgelöst.

Weiter unten:

1847 if (!host)
1848 host=LOCAL_HOST;

Wenn also host leer ist, wird unmittelbar vor dem Aufbau einer Verbindung
mit dem TCP/IP Transport der host mit "localhost" initialisiert.

> Das ist der Grund warum ihm das passiert ist. Eben weil er für die
> Verbindung "127.0.0.1" (bzw. eine andere IP) genommen hat und nicht
> "localhost" (als Wort). Nur warum schreibt er dann nicht "127.0.0.1" in
> seinem Post, sondern "die IP des 'localhost'"? Wenn er z.B. 192.168.0.1
> genommen hat, dann hat er natürlich den selben Effekt (nur ist es dann die
> LAN-IP des Rechners).

Nebenbei: 127.0.0.1 ist auch von 192.168.0.1 verschieden, wenn (falls)
bind-address= in der Konfiguration verwendet wird.

Kris