Bienvenido a los foros %s

Foro comunidad hispana Dolibarr

Identificarse Registrarse

Error al utilizar métodos de acceso a tablas en MYSQL

Cuestiones,problemas sobre la instalción Dolibarr con windows(DoliWamp) , MacOS (DoliMamp), Gnu/linux, una web externa que proporciona alojamiento ....
soca
Novato
Mensajes: 15
Registrado: Mar, 19/06/2012, 17:12

Error al utilizar métodos de acceso a tablas en MYSQL

Mensaje por soca »

Muy buenas tardes.
Junto con saludar y felicitar por el avance de este ERP quisiera por favor si me pudieran ayudar con un desarrollo que estoy realizando.
En el siguiente código, la tercera línea no me devuelve la cantidad de campos.
$query = 'select * from ' . $tabla . ' ' . $filtro;
$result = $db->query($query);
$cant_campos = $result->field_count;


Y en la siguiente linea de código:
$info_campo = $result->fetch_field_direct(1);

Me arroja el error : Fatal error: Call to a member function fetch_field_direct() on resource

Lo extraño, es que de forma local tengo funcionando Dolibarr 3.8 con Xampp en las siguientes versiones y las instrucciones funcionan correctamente:
PHP 5.6.11
MYSQL 5.6.25

El problema surge en un hosting que tenía versiones anteriores a lo que pedí cambio de servidor con versiones mas actuales pensando que podría solucionarse pero el error persiste, en el hosting tengo las siguientes versiones con Dolibarr 3.8:
PHP 5.6.13
MYSQL 5.5.42

A que se podría deber la diferencia en su funcionamiento?, porque en el primer caso funciona bien y en el segundo no?, faltará habilitar algo?,
he buscado información en internet pero no he hallado nada aún para dar solución.

La idea del código, es capturar dinamicamente los campos que contemplan una tabla, y las características de estos campos (tipo, largo, etc).
Pensaba ya tenía listo el desarrollo pero al subirlo al hosting me encontré con esta sorpresa y he quedado entrampado.

Agradecería sugerencias, experiencias para intentar llegar a una solución.

Que tengan un excelente dia y muchas gracias.

Saludos cordiales,

Juan

Avatar de Usuario
aduart
Yoda
Mensajes: 1065
Registrado: Mié, 06/06/2012, 19:37

Mensaje por aduart »

Hola,

Yo tambien hago desarrollo. Busque un poco en internet por el mensaje de error.
Creo que no paree ser tema de version de PHP. Esta pasando algo con el codigo,
puede que alguna variable no esta bien en su valor, por ejemplo $result, como que
en esa parte, u otra, no esta pasando lo mismo en los dos ambientes.

Podes usar dol_syslog() y enviar informacion al archivo de log, tenes que habilitar
el modulo de log, y listo.

Espero sea util y saludos,

Eduardo.

soca
Novato
Mensajes: 15
Registrado: Mar, 19/06/2012, 17:12

Mensaje por soca »

Muchas gracias Aduart por tu respuesta.
Ya había utilizado el log y tambien dol_print_error($db) y no arroja nada.
Compruebo que la consulta asigna un recurso pero en la primera instrucción no devuelve la cantidad de campos y en la segunda instrucción arroja el error indicado. Y como indiqué, lo extraño es que de forma local con xampp si me funciona bien, pero en el hosting tengo problemas. Que será?,
algún valor o parámetro que habilitar?.
Aduart, si implementaras este código de prueba en tu desarrollo te funciona?, al menos para salir de duda, ya que en hosting me funciona bien la query y la cantidad de registros capturados.
Agradecería mucho tu ayuda.

$tabla = 'llx_categorie';
$filtro = ' ORDER BY rowid DESC';
$query = 'select * from ' . $tabla . ' ' . $filtro;
$qtabla2 = $db->query($query);
if (!$qtabla2) throw new Exception(dol_print_error($db));

if (isset($qtabla2) && $db->num_rows($qtabla2) >= 0) {
$num = $db->num_rows($qtabla2);
$cant_campos = $qtabla2->field_count;
print '<br>CANT. REGISTROS : '.$num.' CANT.CAMPOS : '.$cant_campos;
for ($linea = 0; $linea < $cant_campos; $linea++) {
$info_campo = $qtabla2->fetch_field_direct($linea);
$fieldname = $info_campo->name;
$fieldtype = $info_campo->type;
print '<br>NOMBRE CAMPO : '.$fieldname.' TIPO CAMPO : '.$fieldtype;
}
}

Avatar de Usuario
aduart
Yoda
Mensajes: 1065
Registrado: Mié, 06/06/2012, 19:37

Mensaje por aduart »

Hola,

Probe el codigo y funciona, es una clase que tengo puse esto:
solo reemplace $db por $this->db por como uso la variable de la base.

function prueba($limit1=0 ) {

$tabla = 'llx_categorie';
$filtro = ' ORDER BY rowid DESC';
$query = 'select * from ' . $tabla . ' ' . $filtro;
$qtabla2 = $this->db->query($query);
if (!$qtabla2) throw new Exception(dol_print_error($db));

if (isset($qtabla2) && $this->db->num_rows($qtabla2) >= 0) {
$num = $this->db->num_rows($qtabla2);
$cant_campos = $qtabla2->field_count;
print '<br>CANT. REGISTROS : '.$num.' CANT.CAMPOS : '.$cant_campos;
for ($linea = 0; $linea < $cant_campos; $linea++) {
$info_campo = $qtabla2->fetch_field_direct($linea);
$fieldname = $info_campo->name;
$fieldtype = $info_campo->type;
print '<br>NOMBRE CAMPO : '.$fieldname.' TIPO CAMPO : '.$fieldtype;
}
}
}


la salida es esta

CANT. REGISTROS : 0 CANT.CAMPOS : 8
NOMBRE CAMPO : rowid TIPO CAMPO : 3
NOMBRE CAMPO : label TIPO CAMPO : 253
NOMBRE CAMPO : type TIPO CAMPO : 1
NOMBRE CAMPO : entity TIPO CAMPO : 3
NOMBRE CAMPO : description TIPO CAMPO : 252
NOMBRE CAMPO : fk_soc TIPO CAMPO : 3
NOMBRE CAMPO : visible TIPO CAMPO : 1
NOMBRE CAMPO : import_key TIPO CAMPO : 253

Espero te sea util y exitos.

Eduardo.

soca
Novato
Mensajes: 15
Registrado: Mar, 19/06/2012, 17:12

Mensaje por soca »

Muchas gracias Eduardo.
No logro entender a que se debe, tu prueba fue local o hosting?.
Tendré que seguir investigando, sino, ver otra forma.
Muchas gracias por haberte tomado el tiempo y por la ayuda.