miércoles, 8 de octubre de 2014

Conexión de PHP a FoxPro con ODBC

Lo primero que debemos tener claro son los conceptos. ODBC es un estándar de acceso a Base de Datos de Microsoft permitiendo acceder a cualquier dato de cualquier aplicación sin importar el gestor de base de datos que almacene dichos datos. 
Para poder utilizarlo este tipo de conexión necesitamos un controlador ODBC para VFP que nos permita ejecutar la consulta y conectar a la BD de Fox sin ningún problema;
Microsof dejo de dar soporte y de generar actualizaciones de los controlador ODBC para Fox las únicas actualizaciones que sigue creando fueron para OLDB pero el tipo de conexión es diferente. También se puede utilizar ADO pero por ahora yo recomiendo ODBC.

Si tiene algún problema para encontrar el controlador de 32 bits acá les dejo el link de descarga:

A continuación les muestro el código de conexión de PHP a una BD en FoxPro

$ODBCdriver = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=D:Ruta_donde_se_encuentra_la_BD\BaseDatos.dbc;Exclusive=No"; 
$user = ""; 
$pwd = ""; 

if( !($conID = odbc_connect($ODBCdriver,$user,$pwd)) ){ 
print("No se pudo establecer la conexión!"); 
exit(); 
} else{
 echo "hay conexion";
 }
$result=odbc_exec($conID,"select * from tabla where campo = 1234;");
echo "Result is ".odbc_result_all($result);



Mas información: 
http://support2.microsoft.com/kb/277772/es

34 comentarios:

  1. hola amigo tengo una pregunta si deseo tener dos conexiones dsn para interactuar entre si en una consulta es posible?

    ResponderEliminar
    Respuestas
    1. Si es posible traer datos de dos conexiones diferentes, para que interactúen entre sí; deben compartir una llave en común para que puedas cruzar los resultados.

      Eliminar
  2. Buenos Días, tengo un error al momento de conectarme al ODBC con le driver de Visual Foxpro, trato desde php el código de ejemplo (el públicado) y en los campos tipos caracter y los imprime en blanco cuando si tienen valor y los otros campos si los imprime, que podría ser?. cuando imprimo usando odbc_result($result,'nombres'), imprime solo caracteres especiales, por favor necesito de su ayuda alguna idea una sugerencia de lo que sucede, gracias de antemano

    ResponderEliminar
    Respuestas
    1. Muéstreme lo que le imprime.
      A veces la codificación de la base de datos entra en conflicto con la codificación de la página, lo ideal sería que la codificación de la base de datos, la conexión y la página fueran una sola. (Recomiendo utf8, ya que soporta caracteres especiales).

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Si el tipo de campo es carácter binario o memo binario, el ODBC no los puede interpretar. Cambiar los campos solo a carácter o memo

      Eliminar
    4. Cualquiera de los dos debería poder servirte.

      Eliminar
  3. Hola,me aparece este error cuando corro el programa, que podra ser?

    Warning: odbc_connect(): SQL error: [Microsoft][ODBC Visual FoxPro Driver]Cannot open file d:c:\wamp\www\data\datos.dbc., SQL state S1000 in SQLConnect in

    ResponderEliminar
    Respuestas
    1. Para conectarse a una base de datos o una tabla de Fox, lo primero debe ir a panel de control, herramientas administrativas, Orígenes de datos (ODBC) , se ubica en la pestaña de DSN sistema y agrega el driver correspondiente si es para visual fox "divers para visual fox" (VFP) luego ubique la base de datos y coloque un nombre en data source, y listo. Este link a continuación son algunas funciones que puede que le sirvan. http://us2.php.net/manual/en/ref.uodbc.php

      Eliminar
  4. Si mal no recuerdo la extension de foxpro es .dbf no .dbc y me surge esa duda seria lo mismo ?????

    ResponderEliminar
    Respuestas
    1. hola, disculpa la tardanza hasta ahora pude leer tu mensaje.
      Mira las dos extensiones son válidas ya que Visual FoxPro usa tablas para almacenar datos que definen distintos tipos de archivos. Los tipos de archivos que se guardan como archivos de tabla son:

      Tabla (.dbf)
      Base de datos (.dbc)

      Los que que quiere decir que cuando necesites llamar una Tabla la debes llamar como extension .dbf y cuando necesites llamar la Base de Datos en una conexión lo debes hacer por extensión .dbc

      Eliminar
  5. Hola hay forma de actualizar desde php un campo fecha en foxpro?
    No logro hacerlo este es el código:

    $sqlUpdate = "Update bdat1705 set felip = ({2017/06/30}) where nsub =35187116"; No funciona y he probado de muchas formas.

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola mira puedes guiarte con el siguiente link: http://programadoressinoficio.blogspot.com.co/2015/06/fechas-en-foxpro-para-select-y-update.html

      El ejemplo del update es el siguiente UPDATE clientes SET fecha_apertura_cli = {".$fechaaperturacliente."} ";
      procura incluir la fecha que necesitas actualizar en una variable de lo contrario debes colocar la fecha tal cual esta registrada en foxpro.

      Tu ejemplo quedaria de la siguiente manera: Update Tabla SET campofecha = {.$variablefecha.} WHERE nsub =35187116"
      También puedes revisar si la fecha se encuentra de la siguiente manera: {06/30/2017}, debes tener cuidado de la forma en la que enívas la fecha a actualizar ya que fox es un poco delicado con los formatos de fecha.

      Nota: cuéntame como te fue, como lo resolviste, recuerda que estamos para ayudar a otros.

      Eliminar
    2. Ok gracias por tú ayuda, voy a probar y te cuento

      Eliminar
  6. Excelente ahora funciono aquí va el código:

    $datetest = "06/25/2017";
    $sqlUpdate = "UPDATE bdat1705 SET felip = {".$datetest."} where nsub = 35187116";
    $dsn = "XXXXXX";
    $usuario = "";
    $clave="";
    $cid=odbc_connect($dsn, $usuario, $clave);
    if (!$cid){
    exit("Ya ocurrido un error tratando de conectarse con el origen de datos.");
    } else {
    $result=odbc_exec($cid,$sqlUpdate)or die(exit("Error en odbc_exec"));
    }

    Gracias te pasaste!!!!1

    ResponderEliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Hola, como estas, muy buen ejemplo. Tengo el siguiente problema: tengo una aplicación php la cual se conecta perfectamente con tu ejemplo a una base de datos de una aplicación fox, ahora cuando la aplicación fox está activa me tira el siguiente error:

    Warning: odbc_exec(): SQL error: [Microsoft][ODBC Visual FoxPro Driver]Cannot open file c:\aplicacionFox\db\tabla.dbf., SQL state S1000 in SQLExecDirect

    Cuando la aplicación fox está cerrada anda lo mas bien, que puedo hacer para que funcione?
    Este es el string de conexión que uso:

    Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=c:\aplicacionFox\DB\Bade_de_Datos.dbc;Exclusive=No (probé con Exclusiv=Yes y tampoco anduvo)

    Muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola, mira pueden ser dos cosas que no hayas configurado bien la base de datos de Fox en los orígenes de datos ODBC o la otra opción es que tengas un controlador desactualizado, se sabe bien que Microsoft dejo de dar soporte a ese tipo de drivers pero puedo pasarte un versión que a mi me sigue funcionando. Cuando tenga listo el Link donde puedas descargarlo lo publicaré.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Hola Vanessa, encontré el problema, las tablas en visual fox tienen que estar en modo "SHARED", con eso se arregló y no tuve mas problemas. Tambien tuve el problema de la fecha como en unos comentarios mas arriba y me sirvió tu solución, muchas gracias por la buena onda!

      Eliminar
    4. Me alegra que puedas ayudar a encontrar soluciones. Gracias por tu aporte.

      Eliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Hola, gracias por tu ayuda. Ya me había funcionado tu ejemplo en PHP 5.3.3 pero actualicé a PHP 7.1.27 y me marca el siguiente error al conectarse.
    $Res ="temp";
    $DBQ ="c:\\{$Res}\\";
    $DSN ="DRIVER={Microsoft Visual FoxPro Driver};SourceDB=$DBQ;SourceType=DBF;Eclusive=No
    $conn=odbc_connect($DSN,"","");

    Y arroja el siguiente error:
    odbc_connect(): SQL error: [Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especific� ning�n controlador predeterminado, SQL state IM002 in SQLConnect
    Tengo instalado instalado el controlador de 32 bits
    ¿Me puedes ayudar?

    ResponderEliminar
  11. Hola yo tambien estoy recibiendo el siguiente error:
    Warning: odbc_connect(): SQL error: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified, SQL state IM002 in SQLConnect in C:\laragon\www\foxphp\index.php on line 12

    Cual seria la solucion o que otro driver puede usar para conectarme a la base de datos de fox pro

    ResponderEliminar
    Respuestas
    1. tengo el mismo problema en php 7+ alguna solucion ?

      Eliminar
    2. El driver ya no funciona para esa version de php ya que fox pro es un programa muy viejo y dejo de darse soporte. Intente descargar librerias odbc q me permita leer ese tipo de extension. Debido a eso si se actualiza el oho comienza a fallar.

      Eliminar
  12. warning:odbc_connect ... estoy con php5.5...

    ResponderEliminar
  13. $DBQ ="M:\\DATOS\\dbc_sismed.dbc\\";
    $DSN ="DRIVER={Microsoft Visual FoxPro Driver};SourceDB=$DBQ;SourceType=DBF;Eclusive=No";
    $conn=odbc_connect($DSN,"","");

    ResponderEliminar
  14. Amigo buenas tardes y si quiero que no se muestren los registros eliminados o marcados en la consulta. Como hago... Te agradezco mucho

    ResponderEliminar
    Respuestas
    1. podrías usar esta consulta si es lo que te entendi bien: SELECT * from tabla where idCampo not in(select idCampo from tabla where campo = 1234

      Eliminar
    2. Filtrar el Campo dónde los marca como eliminado

      Eliminar