Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/04/2009, 00:57
Avatar de PatomaS
PatomaS
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: En alguna otra parte
Mensajes: 4.656
Antigüedad: 20 años, 1 mes
Puntos: 63
Respuesta: Pregunta sobre el funcionamiento de mysql_connect

Hola gente

Bueno, curioso tema este.

La verdad es que yo no puedo aportar mucho al respecto de las preguntas específicas ya que no tengo claro el funcionamiento interno del procesador de consultas.

Pero veamos.

De los ejemplos expuestos y algunas pruebas que he hecho, veo varios elementos a destacar.

Desde el punto de vista de seguridad, creo que es bastante irresponsable rellenar un usuario por defecto, más aun que dicho usuario sea root, entrar en los detalles escapa al ámbito de este tema, pero definitivamente deja puertas abiertas que no deberían estarlo.

Desde el punto de vista de la relación MySQL - PHP, si tomamos en cuenta que la instalación de MySQL configura un usuario por defecto y que este usuario es root, PHP debería forzar valores inocuos hacia la API de MySQL, es decir, no debería confiar en la seguridad del servidor o el gestor de base de datos para la seguridad. Valores que se me ocurre podrían ser usados, tenemos: false, true, phphost (valor inventado). Y valores a ser omitidos serían: NULL, localhost, root, ''.

Hablando solo del funcionamiento de PHP, vemos que este hace una transformación de valores internamente, así la llamada
Código PHP:
mysql_connectfalsefalsefalse 
se convierte en:
Código PHP:
mysql_connect(''''''
Si revisamos la documentación de PHP sobre tipos booleanos, vemos que la empty string, osea '' equivale a false, sin embargo, la relación no es recíproca, es decir

Código PHP:
false != '' 
Por lo tanto, que PHP convierta false a '' y envie eso a la API, es receta segura para que la API sustituya los valores vacíos por los valores por defecto.

Otro elemento curioso es lo que ocurre si en vez de false usamos true
Código PHP:
var_dumpmysql_connecttruetruetrue ) ); 
se convierte en:

Código PHP:
var_dumpmysql_connect'1''1''1' ) ); 
lo que genera como error lo siguiente

Código PHP:
Warningmysql_connect(): Can't connect to MySQL server on '(22
¿qué es lo que ha ocurrido aquí?

Pues el conocido type cast de PHP, el cual es útil si hacemos algo como echo( $a ); y ese $a puede ser true o false; pero definitivamente no es lo mismo en casos como mysql_connect().

Finalmente, un detalle a mi parecer muy importante; mysql_connect() es una función que realiza o intenta realizar una conexión con la base de datos de mysql, si revisamos la documentación de dicho comando, vemos que como valores devueltos especifica esto: Returns a MySQL link identifier on success, or FALSE on failure., es decir, si se conecta, devuelve un recurso y si falla, devuelve false, sin embargo, por la forma en la que PHP se conecta con MySQL, al ejecutar la secuencia mencionada por Acron_0248 en su primer ejemplo, el resultado es un puntero si se ejecuta en el navegador y false si se ejecuta en la consola.

Ejemplificado queda así:
Navegador:
comando: var_dump( mysql_connect( false, false, false ) );
respuesta: resource(2, mysql link)

Consola:
Código PHP:
php prueba_2.php

Warning
mysql_connect(): Access denied for user 'root'@'localhost' (using passwordNOin prueba_2.php on line 2

Call Stack
:
    
0.0003      96624   1. {main}() prueba_2.php:0
    0.0003      96704   2. mysql_connect
(''''''prueba_2.php:2


bool
(false
Espero que todos estos desbarruntos hayan sido de alguna utilidad, aunque seguramente no han ayudado mucho a responder las dudas planteadas.

Felicidad
__________________
¡ hey, hou, hou, hey !