Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/04/2009, 11:56
Avatar de Acron_0248
Acron_0248
 
Fecha de Ingreso: junio-2005
Ubicación: 127.0.0.1
Mensajes: 1.648
Antigüedad: 18 años, 10 meses
Puntos: 18
Pregunta sobre el funcionamiento de mysql_connect

Hola, qué tal :)


Recientemente estuve hablando con un amigo acerca del funcionamiento de esta función (mysql_connect()), de forma más concreta, su funcionamiento cuando dicha función es llamada con parámetros como FALSE o vacío, para que quede claro, me refiero a cosas como estas:

ejemplo 1:
Código PHP:
<?php

mysql_connect
(FALSEFALSEFALSE);

?>
ejemplo 2:
Código PHP:
<?php

mysql_connect
('''''');

?>
ejemplo 3:
Código PHP:
<?php

mysql_connect
();

?>

Lo que se me ha hecho interesante y de donde vienen mis dudas es que hay cosas en las diferentes referencias en la documentación de la función que no parecen cuadrar.


La documentación de la API de mysql (tanto para mysql_connect() como para mysql_real_connect()) dice:
Cita:
- The value of host may be either a hostname or an IP address. If host is NULL or the string "localhost", a connection to the local host is assumed. If the OS supports sockets (Unix) or named pipes (Windows), they are used instead of TCP/IP to connect to the server.

- The user parameter contains the user's MySQL login ID. If user is NULL or the empty string "", the current user is assumed. Under Unix, this is the current login name.
La documentación de PHP para mysql_connect() dice:
Cita:
- The MySQL server. It can also include a port number. e.g. "hostname:port" or a path to a local socket e.g. ":/path/to/socket" for the localhost.

If the PHP directive mysql.default_host is undefined (default), then the default value is 'localhost:3306'. In SQL safe mode, this parameter is ignored and value 'localhost:3306' is always used.

- The username. Default value is defined by mysql.default_user. In SQL safe mode, this parameter is ignored and the name of the user that owns the server process is used.

Hasta todo bien, o eso parece.

En mi servidor local root (de mysql) tiene su clave lo que significa que ese es un parámetro que deberé pasar o php dará error indiciando que el usuario X no tiene permiso para conectarse a mysql, para facilitar el entendimiento de los próximos ejemplos, digamos que la clave del root de mysql es "asdfg"

Bien, para probar el funcionamiento de esta función uso este código:
Código PHP:
<?php

var_dump 
(mysql_connect(FALSEFALSE'asdfg'));

?>
O bien este otro:
Código PHP:
<?php

var_dump 
(mysql_connect('''''asdfg'));

?>
Si ejecuto cualquiera de los dos códigos desde una cónsola (como root) con el servidor mysql activo, el resultado será:
Código:
resource(4) of type (mysql link)
Eso indica que la conexión ha sido exitosa.

Si ejecuto el mismo código como usuario normal desde una cónsola dará el siguiente error
Código:
Warning: mysql_connect(): Access denied for user 'uid0'@'localhost' 
(using password: YES) in /var/www/localhost/htdocs/test.php on line 3
Y si ejecuto el mismo código desde un navegador el error será
Código:
Warning: mysql_connect(): Access denied for user 'apache'@'localhost' 
(using password: YES) in /var/www/localhost/htdocs/test.php on line 3
Hasta acá todo parece indicar que lo que dice la documentación de la API de mysql es correcto, con la excepción tal vez del usuario Apache porque involucra la forma de trabajo de la SAPI de php, pero el punto es que el usuario activo (el que inició sesión) está siendo usado como parámetro del nombre del usuario de la función mysql_connect ya que lo se pasó fue FALSE o vacío.

Ahora bien, si activo sql.safe_mode en el php.ini y ejecuto el código desde una cónsola como root dará el siguiente error:
Código:
Warning: mysql_connect(): Access denied for user 'root'@'localhost' 
(using password: YES) in /var/www/localhost/htdocs/test.php on line 3
Una de mis preguntas es ¿por qué ocurre esto?

Para empezar, según lo que dice la documentación de PHP, si sql.safe_mode está activo, se usará el nombre del usuario que sea dueño del proceso del servidor, sin embargo, estoy ejecutando el script desde una cónsola directamente con PHP, no estoy llamando el script desde apache, y si safe_mode "ignora" el parámetro que se pasó y envía el nombre del usuario dueño del proceso del servidor, ¿por qué el usuario que se pasa es root?

Se puede pensar que es una especie de fallback, no se pudo obtener el nombre del usuario dueño del proceso del servidor (porque tal proceso no está en ejecución) y se pasó simplemente 'root', pero de ser así, ¿por qué la conexión falla?

Teniendo aún sql.safe_mode activo en el php.ini y ejecutando el mismo script desde una cónsola pero como usuario "normal" dará el mismo error con root:
Código:
Warning: mysql_connect(): Access denied for user 'root'@'localhost'
(using password: NO) in /var/www/localhost/htdocs/test.php on line 3
Esto me hace pensar que obviamente sql.safe_mode no funciona de la forma que lo hace la librería de mysql, al menos en lo que se documenta en la API ya que sin importar el nombre del usuario activo (el que inició sesión) se está enviando 'root', pero ¿cuál root?

Se puede decir también que debido al sql.safe_mode se está enviando el usuario root "del sistema", linux en este caso, que no es el mismo root "de mysql", sin embargo, la librería de mysql (si sql.safe_mode estuviera inactivo) usará el nombre del usuario que inició sesión cuando no se especifica dicho parámetro en la llamada a la función y como ya indiqué, teniendo sql.safe_mode desactivado y ejecutando el script desde una cónsola como root (root de linux) la conexión se establece correctamente, entonces ¿qué diferencia hay entre el 'root' que se envía cuando sql.safe_mode está activo y el 'root' que se envía cuando sql.safe_mode NO está activo?


Dicho esto, si alguien conoce más detalles sobre el funcionamiento de esta función más allá de lo que hay en la documentación o alguien conoce algún enlace que pueda proveer tal información, se lo agradeceré si me lo comenta :)



Salu2
__________________
Usuario Reigistrado de linux #399288

Última edición por Acron_0248; 13/04/2009 a las 19:22