Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Problemas al migrar servidor con PHP y Postgres

Estas en el tema de Problemas al migrar servidor con PHP y Postgres en el foro de PostgreSQL en Foros del Web. Tengo una web funcionando Ok con PHP 4.3.3 y Postgres 7.3.4 (lo sé, antediluvianos ) Estoy migrando a PHP 5.2.0 y Postgres 8.1.11. Una vez ...
  #1 (permalink)  
Antiguo 12/05/2009, 13:15
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Problemas al migrar servidor con PHP y Postgres

Tengo una web funcionando Ok con PHP 4.3.3 y Postgres 7.3.4 (lo sé, antediluvianos )

Estoy migrando a PHP 5.2.0 y Postgres 8.1.11.

Una vez volcada la BBDD, el front-end se visualiza bien, pero en el backoffice, los script de edición y creación de registros -páginas web- están fallando. Parece que se deba a un problema con comillas simples y dobles ( ' y " ). Lo más curioso es que me da un error parecido, incluso si creo registros que no contienen comillas:

Código PHP:
pg_query() [function.pg-query]: query failederrorsyntax error at or near "\" at character 
¿Existe alguna solución sencilla? No soy programador, sólo un "aporrea teclas avanzado"

Copio la parte del script que da problemas:

Código PHP:
<?php

//iniciamos sesión
require 'libreria.php';
require 
'cabecera.php';
// cabecera común de página

$conid=$HTTP_POST_VARS['conid'];

// echo "<pre>";
// print_r($HTTP_POST_VARS);
// echo "</pre>";

// array idiomas START
$sql="SELECT idiid, descr FROM idiomas ORDER BY idiid;";
$res=pg_query($conn$sql);
$numidi=pg_numrows($res);
    if (
$res && $numidi>0) {
        
$tidi=array();
        for (
$i=0$i $numidi$i++) {
            
$r pg_fetch_row($res$i);
            
$tidi[$i]=array($r[0] , $r[1]);
        }
    }
// array idiomas END



// inicializamos variables
$crear    =false;
$modificar=false;
$guardar  =false;
$borrar   =false;

// seleccionamos la opción
$boton=$HTTP_POST_VARS['submit'];

    if (
$boton == 'Modificar') { $modificar=true;}
elseif (
$boton == 'Guardar')   { $guardar  =true;}
elseif (
$boton == 'Crear')     { $crear    =true;}
elseif (
$boton == 'Borrar')    { $borrar   =true;}



if     (
$borrar){
    
$sql="DELETE FROM contenidos WHERE conid=$conid;";
    
$res=pg_query($conn,$sql);
}elseif(
$guardar){
    
$huboerror=0;
    
// iniciamos la transacción
    
pg_query("BEGIN WORK");
    
$descr =$HTTP_POST_VARS['descr'];
    
$secid =$HTTP_POST_VARS['secid'];
    
$conor =(int)$HTTP_POST_VARS['conor'];
    
$plaid =(int)$HTTP_POST_VARS['plaid'];

    
$sql="UPDATE contenidos SET secid=$secid, descr='$descr', conor=$conor, plaid=$plaid WHERE conid=$conid;";
    
$res=pg_query($conn,$sql);
    if (!
$res) {
        echo 
pg_errormessage($conn);
        echo 
' Error - en la primera sentencia';
        
pg_query($conn,'ROLLBACK');
        
$huboerror=1;
        exit;
    } else {
        
$postdata=array();

        foreach(
$HTTP_POST_VARS['tipag'] as $idiid => $valor){ $postdata[$idiid]['tipag']=$valor;}
        foreach(
$HTTP_POST_VARS['titxt'] as $idiid => $valor){ $postdata[$idiid]['titxt']=$valor;}
        foreach(
$HTTP_POST_VARS['texto'] as $idiid => $valor){ $postdata[$idiid]['texto']=$valor;}
        foreach(
$HTTP_POST_VARS['titiz'] as $idiid => $valor){ $postdata[$idiid]['titiz']=$valor;}
        foreach(
$HTTP_POST_VARS['titdr'] as $idiid => $valor){ $postdata[$idiid]['titdr']=$valor;}

        foreach(
$postdata as $idiid => $misvalores){
            
$tipag=$misvalores['tipag'];
            
$titxt=$misvalores['titxt'];
            
$texto=$misvalores['texto'];
            
$titiz=$misvalores['titiz'];
            
$titdr=$misvalores['titdr'];
            
$sql="UPDATE conidiomas SET ";
            
$sql.=" tipag='$tipag', ";
            
$sql.=" titxt='$titxt', ";
            
$sql.=" texto='$texto', ";
            
$sql.=" titiz='$titiz', ";
            
$sql.=" titdr='$titdr'  ";
            
$sql.="WHERE conid=$conid AND idiid=$idiid;";

            
$res=pg_query($conn,$sql);
            if (!
$res) {
                echo 
pg_errormessage($conn);
                echo 
' Error - en la sengunda sentencia';
                
pg_query($conn,'ROLLBACK');
                
$huboerror=true;
                exit;
            }
        }
        if (!
$huboerror) {
            
pg_query($conn,'COMMIT');
        }
    }
    
$modificar=true;

}elseif (
$crear){

    
$huboerror=false;
    
// iniciamos la transacción
    
pg_query("BEGIN WORK");
    
$res=pg_query($conn"SELECT nextval('public.contenidos_conid_seq');");
    if (
$res$num pg_num_rows($res);
    if (!
$res || $num<|| $num>1) {
        
$huboerror=1;
        exit;
    } else {
        
$r pg_fetch_row($res0);
        
// nos guardamos el id que depués usaremos para guardar el registro
        
$conid $r[0];
    }
    
$descr =$HTTP_POST_VARS['descr'];
    
$secid =$HTTP_POST_VARS['secid'];
    
$conor =(int)$HTTP_POST_VARS['conor'];
    
$plaid =(int)$HTTP_POST_VARS['plaid'];


    
$sql="INSERT INTO contenidos (conid,secid,descr,conor, plaid) ";
    
$sql.="VALUES ($conid, $secid, '$descr', $conor, $plaid);";

    
$res=pg_query($conn,$sql);
    
// check for errors
    
if (!$res) {
        echo 
pg_errormessage($conn);
        echo 
' Error - en la primera sentencia';
        
pg_query($conn,'ROLLBACK');
        
$huboerror=true;
        exit;
    } else {
        
$postdata=array();

        foreach(
$HTTP_POST_VARS['tipag'] as $idiid => $valor){ $postdata[$idiid]['tipag']=$valor;}
        foreach(
$HTTP_POST_VARS['titxt'] as $idiid => $valor){ $postdata[$idiid]['titxt']=$valor;}
        foreach(
$HTTP_POST_VARS['texto'] as $idiid => $valor){ $postdata[$idiid]['texto']=$valor;}
        foreach(
$HTTP_POST_VARS['titiz'] as $idiid => $valor){ $postdata[$idiid]['titiz']=$valor;}
        foreach(
$HTTP_POST_VARS['titdr'] as $idiid => $valor){ $postdata[$idiid]['titdr']=$valor;}

        foreach(
$postdata as $idiid => $misvalores){
            
$tipag=$misvalores['tipag'];
            
$titxt=$misvalores['titxt'];
            
$texto=$misvalores['texto'];
            
$titiz=$misvalores['titiz'];
            
$titdr=$misvalores['titdr'];
            
$sql="INSERT INTO conidiomas (conid,idiid,tipag,titxt,texto,titiz,titdr)";
            
$sql.="VALUES ($conid, $idiid, '$tipag', '$titxt', '$texto', '$titiz', '$titdr');";

            
$res=pg_query($conn,$sql);
            if (!
$res) {
                echo 
pg_errormessage($conn);
                echo 
' Error - en la sengunda sentencia';
                
pg_query($conn,'ROLLBACK');
                
$huboerror=true;
                exit;
            }
        }
        if (!
$huboerror) {
            
pg_query($conn,'COMMIT');
        }
    }
    
$modificar=true;
}



$valores=array();
if(
$conid>0){
    
$sql=" SELECT co.conid, ci.idiid, ci.tipag, ci.titxt, ci.texto, ci.titiz, ci.titdr, co.conor, co.descr, co.secid, co.plaid FROM conidiomas as ci, contenidos as co WHERE co.conid=$conid AND ci.conid=co.conid ORDER BY ci.idiid;";

    
$res=pg_query($conn$sql);
    
$num=pg_numrows($res);
        if (
$res && $num>0) {

            for (
$i=0$i $num$i++) {
                
$r pg_fetch_row($res$i);
                
$conid=$r[0];
                
$idiid=$r[1];
                
$tipag=$r[2];
                
$titxt=$r[3];
                
$texto=$r[4];
                
$titiz=$r[5];
                
$titdr=$r[6];
                
$conor=$r[7];
                
$descr=$r[8];
                
$secid=$r[9];
                
$plaid=$r[10];
                
$valores['conid']=$conid;
                
$valores['descr']=$descr;
                
$valores['tipag'][$idiid]=$tipag;
                
$valores['titxt'][$idiid]=$titxt;
                
$valores['texto'][$idiid]=$texto;
                
$valores['titiz'][$idiid]=$titiz;
                
$valores['titdr'][$idiid]=$titdr;
            }
        }
}
?>
Cualquier ayuda será bienvenida.
  #2 (permalink)  
Antiguo 12/05/2009, 14:12
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 3 meses
Puntos: 102
Respuesta: Problemas al migrar servidor con PHP y Postgres

De entrada, cambia todos los $HTTP_POST_VARS por $_POST

Código php:
Ver original
  1. // Antes
  2. $HTTP_POST_VARS['algo'];
  3. // Debe quedar
  4. $_POST['algo'];

Luego, el error es de una query, quizá se solucione con esto, sino identifica la query que está fallando y muestrala en pantalla paraver cómo se está armando y ver con claridad cuál es el error.

Suerte
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #3 (permalink)  
Antiguo 13/05/2009, 03:21
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: Problemas al migrar servidor con PHP y Postgres

Gracias Jam1138; he realizado el cambio, pero el problema persiste.

Cuando imprimo en pantalla las variables, veo dónde está la diferencia: en el servidor el identificador de idioma (1 o 2) se almacena correcto, mientras que en el nuevo, en todos los arrays, la comilla se precede de la barra invertida; copio parte del debug:

SERVIDOR VIEJO (PHP 4, PGSQL 7):

[conid] => 46
[secid] => 7
[plaid] => 1
[descr] => ENCUESTA
[conor] => 6
[tipag] => Array
(
['1'] => Encuesta sobre ...
['2'] => Survey about ...
)


SERVIDOR NUEVO (PHP 5, PGSQL 8):

[conid] => 46
[secid] => 7
[plaid] => 1
[descr] => ENCUESTA
[conor] => 6
[tipag] => Array
(
[\'1\'] => Encuesta sobre ...
[\'2\'] => Survey about ...
)

Fijaros que tipag pasa de '1' y '2' a \'1\' y \'2\'

¿Alguna ayuda, por favor?
  #4 (permalink)  
Antiguo 13/05/2009, 04:36
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: Problemas al migrar servidor con PHP y Postgres

El problema ha quedado solucionado: tirando de documentación sobre PHP5, el problema estaba efectivamente en los valores numéricos de Array y la barra invertida que le colocaba PHP delante de la comilla.

Copio las 2 líneas moficadas:

LINEA ORIGINAL 1
$sql.="WHERE conid=$conid AND idiid=$idiid";

LINEA MODIFICADA 1
$sql.="WHERE conid=$conid AND idiid=" . stripslashes($idiid);

LINEA ORIGINAL 2
$sql.="VALUES ($conid, $idiid, '$tipag', '$titxt', '$texto', '$titiz', '$titdr');";

LINEA MODIFICADA 2
$sql.="VALUES ($conid, " . stripslashes($idiid) . ", '$tipag', '$titxt', '$texto', '$titiz', '$titdr');";

Gracias.
  #5 (permalink)  
Antiguo 13/05/2009, 10:45
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 3 meses
Puntos: 102
Respuesta: Problemas al migrar servidor con PHP y Postgres

Ve en el php.ini el valor para la directiva magic_quotes_gpc, debe estar en Off.

http://www.php.net//info.configurati...gic-quotes-gpc
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #6 (permalink)  
Antiguo 13/05/2009, 11:07
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: Problemas al migrar servidor con PHP y Postgres

Muchas gracias Jam1138; problema resuelto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:12.