Problemas con bases de datos

Esta sección contiene preguntas comunes sobre la relación entre PHP y bases de datos. Sí, PHP puede acceder a prácticamente cualquier base de datos disponible hoy en día.

He escuchado que es posible acceder a Microsoft SQL Server desde PHP. ¿Cómo?

En máquinas Windows, puede simplemente usar el soporte ODBC incluido y el controlador ODBC apropiado.

En máquinas Unix, es posible usar el controlador Sybase-CT para acceder a Servidores Microsoft SQL ya que son compatibles (en su mayoría) al nivel del protocolo. Sybase ha creado una » versión gratuita de las bibliotecas necesarias para sistemas Linux. Para otros sistemas operativos Unix, necesita ponerse en contacto con Sybase para obtener las bibliotecas correctas. Consulte también la respuesta a la siguiente pregunta.

¿Puedo acceder a bases de datos Microsoft Access?

Si. Usted ya dispone de todas las herramientas necesarias si está corriendo enteramente bajo Windows 9x/Me, o NT/2000, en donde es posible utilizar ODBC y los controladores ODBC para bases de datos Microsoft Access.

Si está corriendo PHP en una máquina Unix y desea comunicarse con MS Access en una máquina Windows, necesitará controladores ODBC para Unix. » OpenLink Software tiene controladores ODBC basados en Unix que tienen esa capacidad.

Otra alternativa consiste en usar un servidor SQL que tenga controladores ODBC Windows y usarlo para almacenar los datos, a los cuales puede acceder desde Microsoft Access (usando ODBC) y PHP (usando los controladores incorporados), o usar un formato de archivo intermedio que Access y PHP entiendan, como archivos planos o bases de datos dBase. Sobre este punto, Tim Hayes de OpenLink Software escribe:

Usar otra base de datos como intermediario no es una buena idea, cuando es posible usar ODBC desde PHP directamente a su base de datos - es decir, con los controladores de OpenLink. Si realmente necesita usar un formato de archivo intermedio, OpenLink ha lanzado ahora Virtuoso (un motor de bases de datos virtual) para NT, Linux y otras plataformas Unix. Por favor visite nuestro » sitio web para una descarga gratuita.

Una opción que ha sido probada con éxito es usar MySQL y sus controladores MyODBC en Windows y sincronizar las bases de datos. Steve Lawrence escribe:

  • Instale MySQL en su plataforma de acuerdo a las instrucciones de MySQL. La última versión disponible se encuentra en » http://www.mysql.com/. No se requiere ninguna configuración especial, exceptuando al momento de configurar una base de datos, y al configurar la cuenta de usuario, debe poner % en el campo de host, o el nombre del host del equipo Windows desde el que desea acceder a MySQL. Anote su nombre de servidor, nombre de usuario y contraseña.
  • Descargue el controlador MyODBC para Windows desde el sitio de MySQL. Instálelo en su equipo Windows. Es posible probar su operación con las utilidades incluidas con este programa.
  • Cree un usuario o dsn de sistema en su administrador de ODBC, ubicado en el panel de control. Cree un nombre dsn, ingrese su nombre de host, nombre de usuario, contraseña, puerto, etc. para su base de datos MySQL configurada en el paso 1.
  • Instale Access usando la instalación completa, esto asegura que tenga las elementos adicionales apropiados... por lo menos requerirá el soporte ODBC y el gestor de tablas enlazadas.
  • ¡Ahora la parte divertida! Cree una nueva base de datos Access. En la ventana de tabla use el clic derecho y seleccione Enlazar Tablas, o bajo la opción del menú de archivo, seleccione Obtener Datos Externos y luego Enlazar Tablas. Cuando el cuadro de navegación de archivos aparezca, seleccione archivos de tipo: ODBC. Seleccione dsn de Sistema y el nombre de su dsn creado en el paso 3. Seleccione la tabla a enlazar, presione Aceptar, y ¡listo! ¡Ahora es posible abrir la tabla y agregar/eliminar/editar datos en su servidor MySQL! También es posible construir consultas, importar/exportar tablas a MySQL, construir formularios y reportes, etc.

Consejos y Trucos:

  • Es posible construir sus tablas en Access y exportarlas a MySQL, y luego enlazarlas de vuelta. Esto facilita la rápida creación de tablas.
  • Cuando se crean tablas en Access, es necesario tener una clave primaria definida para tener acceso de escritura a la tabla en Access. Asegúrese de crear una clave primaria en MySQL antes de enlazar en Access.
  • Si modifica una tabla en MySQL, es necesario re-enlazarla en Access. Diríjase a Herramientas>Adiciones>Gestor de Tablas Enlazadas, vaya a su DSN ODBC, y seleccione la tabla a re-enlazar desde allí. También es posible transladar su fuente dsn allí, simplemente active el cuadro de verificación "siempre preguntar por una ubicación nueva" antes de presionar Aceptar.

¿Por qué el uso de la extensión MySQL (ext/mysql), que he utilizado durante más de 10 años, está desaconsejado? ¿Está obsoleta? ¿Qué utilizo en su lugar? ¿Cómo puedo migrar?

Existen tres extensiones de MySQL, como está descrito en la sección Elegir una API de MySQL API. No se debería usar la API antigua, ya que un día será obsoleta y eliminada eventualmente de PHP. Es una extensión popular, por lo que éste será un proceso lento, pero se recomienda encarecidamente escribir todo el código nuevo con mysqli o PDO_MySQL.

La migración de los scripts no está disponible por el momento, aunque la API mysqli API contiene tanto una API procedimental como una API POO, siendo la versión procedimental similar a ext/mysql.

No es posible mezclar extensiones. Así, por ejemplo, pasar una conexión mysqli a PDO_MySQL o ext/mysql no funcionará.

PHP 5 ya no incluye bibliotecas cliente de MySQL, ¿qué representa esto para mí? ¿Aun puedo usar MySQL con PHP? Intento usar MySQL y obtengo errores de tipo "function undefined", ¿qué pasa?

Si. Siempre habrá soporte MySQL en PHP de una u otra forma. El único cambio en PHP 5 es que ya no distribuimos la biblioteca cliente como tal. Algunas razones, sin orden alguno en particular:

  • La mayoría de sistemas en la actualidad ya tienen la biblioteca cliente instalada.

  • Dado lo anterior, tener versiones múltiples de la biblioteca puede causar problemas. Por ejemplo, si enlaza mod_auth_mysql contra una versión y PHP contra otra, y luego habilita ambos en Apache, obtendrá un bonito y gordo fallo. Asimismo, la biblioteca distribuida no siempre interactuaba bien con la versión del servidor instalada. El síntoma más obvio de esta situación es el desacuerdo sobre el lugar en donde encontrar el archivo de sockets de dominio Unix mysql.socket.

  • Su mantenimiento era un poco laxo y estaba quedándose cada vez más atrás de la versiones lanzadas.

  • Las versiones futuras de la biblioteca están bajo la GPL y por lo tanto no contamos con una ruta de actualización, ya que no podemos distribuir una biblioteca GPL en un proyecto con licencia tipo BSD/Apache. Un corte limpio en PHP 5 parecía la mejor opción.

Esto en realidad no afectará a muchos. Los usuarios de Unix, por lo menos aquellos que saben lo que están haciendo, tienden a compilar siempre PHP contra sus bibliotecas de sistema libmysqlclient agregando la opción --with-mysql=/usr cuando se compila PHP. Los usuarios de Windows pueden habilitar la extensión php_mysql.dll dentro de php.ini. Para más detalles, vea la Referencia de MySQL sobre las instrucciones de instalación. También, asegúrese de que libmysql.dll se encuentre disponible en el PATH del sistema. Para más detalles sobre el cómo, lea el FAQ sobre configurar el valor PATH en sistemas Windows. Dado que libmysql.dll (y varios otros archivos de PHP relacionados) existen en la carpeta de PHP, usted querrá agregar la carpeta de PHP al PATH del sistema.

Después de instalar el soporte de MySQL compartido, Apache produce un volcado de memoria tan pronto libphp4.so se carga. ¿Puede solucionarse esto?

Si sus bibliotecas de MySQL están enlazadas contra pthreads ocurrirá esto. Verifique usando ldd. Si lo están, obtenga las fuentes de MySQL y compile desde allí, o re-compile desde la fuente rpm y elimine el conmutador en el archivo spec que habilita el código de cliente con hilos. Cualquiera de estas sugerencias solucionará el problema. Luego recompile PHP con las nuevas bibliotecas MySQL.

¿Porqué recibo un error que luce algo así: "Warning: 0 is not a MySQL result index in <archivo> on line <x>" o "Warning: Supplied argument is not a valid MySQL result resource in <archivo> on line <x>"?

Está intentando usar un identificador de resultado que es 0. El 0 indica que su consulta falló por alguna razón. Necesita verificar errores después de enviar una consulta y antes de que intente usar el identificador de resultado devuelto. La manera apropiada de hacerlo es con un código similar al siguiente:

<?php

$resultado 
mysql_query("SELECT * FROM tablas_priv");
if (!
$resultado) {
    echo 
mysql_error();
    exit;
}
?>
o
<?php

$resultado 
mysql_query("SELECT * FROM tablas_priv")
    or die(
"Consulta fallida: " mysql_error());
?>

add a note add a note

User Contributed Notes 5 notes

up
3
knb at gfz-potsdam dot de
9 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
 then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
0
plandis98 at yahoo dot com
8 years ago
If one is using PHP on Windows to connection to MS SQL Server and does not want to pass credentials via the mssql_connect but instead use MS Connectionless NT Authentication, what is the proper syntax/usage? 

I believe you want to turn on secure_connection in php.ini file:
; Use NT authentication when connecting to the server
mssql.secure_connection = On
up
0
djlopez at gmx dot de
8 years ago
How to compile PHP5 when you have installed mysql, but
- you can't find the "mysql header files" or
- get this error: Cannot find MySQL header files under /usr/

If you want to use mysql 4.0 (*not* 4.1 or even higher!) just download & extract the latest mysql4.0 binary distribution to e.g.
/root/mysql40/

but don't start it (it even should not work, if you have a mysql server already running)

Then use --with-mysql=/root/mysql4 within your php5 configuration.

After compiling/installing (make, make install), you may delete the /root/mysql40/ directory, or keep it for later versions of php5.
up
-1
Anonymous
9 years ago
Just a quick note which may help Windows users setting up PHP/Apache/MySQL.  I was receiving these two error messages on Apache startup: 1) "The procedure entry point mysql_thread_end could not be located in the dynamic link library LIBMYSQL.dll" and 2) "PHP Startup: Unable to load dynamic library '<my php installation dir>/ext/php_mysql.dll' - The specified procedure could not be found".  After checking that libmysql.dll did exist in my root PHP install dir, and that this dir was in my path, I determined that the problem was an older version of libmysql.dll.  My solution was to search all harddrives for this file (I found 6 copies of 5 different versions), and rename all of them except my PHP install dir copy.  PHP, Apache and MySQL all function as expected after making this change.
up
-4
ashay dot chaudhary at microsoft dot com
3 years ago
Q: I heard it's possible to access Microsoft SQL Server from PHP. How?

"On Windows machines, you can simply use the included ODBC support and the correct ODBC driver."
There is a better solution now, download the SQL Server Driver for PHP from Microsoft's Download Center, it is officially supported by Microsoft.

Source code: sqlsrvphp.codeplex.com
To Top