Estoy migrando un servidor linux debian 8 a un debian 10 y por supuesto las versiones de php y postgresql son superiores. Estaba utilizando postgresql 9.4 y migre a postgresql 12. El problema es que en psql 12 sacaron un atributo invisible de las tablas llamado OIDS.
El asunto es el siguiente:
En muchos programas php (mas de 100) tengo generalmente la misma secuencia:
1) un statement que dice: insert into tabla (campo1,campo2,
..CampoX) values (variable, variable, .----, Variable)
2) Una variable que almacena el resultado del insert (un result set pero siempre vacio)
3) Una sentencia php: $oid=pg_getlastoid(resultado 2)
4) Por ultimo obtiene el id de la tabla buscando por el $oid (select id from tabla where oid=$oid)
Con este cambio de version de pgsql el pg_getlastoid devuelve vacio por consecuencia el punto 4 devuelve vacio y el programa rompe por todos lados.
La solución que tengo es:
1) Al statement insert hay que agregarle al final de la sentencia antes del punto y coma la siguiente palabra "RETURNING *" (todos arrancan con insert into y terminan con );
2) La linea 2 queda igual pero habria que obtener el nombre de la variable que almacena el resultado
3) La linea 3 habria que eliminarla
4) La linea 4 tiene que tener el nombre de la variable que almacena el resultado y deberia llamar a la variable de la linea 2 y agregarle [0]. Ejemplo:
Archivo original:
1) $q="insert into pais (p_nombre) values ($nompais);";
2) $descriptor=PgDoQuery($q);
3) $oid=pg_getlastoid($descriptor);
4) $pais_id=UserQuery("select id from pais where oid=$oid",0);
Como deberia quedar luego de correr el shell:
1) $q="insert into pais (p_nombre) values ($nompais) RETURNING *;";
2) $descriptor=PgDoQuery($q);
3) $pais_id=$descriptor[0];
Por logica los programas son muchisimos los que hay que eliminar y el shell deberia recorrer supongo con un find todos los -type f que contengan -name "*.php"
ACTUALIZACION: Puede ser que entre las lineas 1 y 4 haya lineas extras sin texto (espacios en blanco), por lo que habria que eliminar tambien esas lineas en blanco. Tambien puede ser que las lineas 1 y 2 esten unificadas, es decir que el $q ya este dentro del $descriptor, lo que hay que buscar es el PgDoQuery y ver si llama a una variable o a un texto
Plazo de Entrega: 11 Diciembre, 2019