problema con insert_record()

problema con insert_record()

de Santiago Nieto Carrera -
Número de respuestas: 17
Hola:
He creado una tabla desde server->administrar base de datos llamada mdl_perfil.
He creado con 3 campos el id, el userid y perfil
El caso es que al hacer:
insert_record("mdl_perfil",$operfil);
No me inserta nada. Me aparece que la tabla esta vacia.
Querría saber que estoy haceindo mal porque me sobrepasa, ya que he probado bastantes cosas pero ante algo que parece tan simple ya no se que hacer.


Promedio de valoraciones: -
En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Santiago Nieto Carrera -
He visto en otros temas que el campo id que sirve como clave primaria ha de ser de tipo unsigned y autoincrement. Ya lo he realizado pero aún así sigue sin funcionarme.
En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Xavier Paz -
El primer posible fallo es que estás añadiendo el prefijo de la tabla, cuando en el insert record no es necesario (lo hace automáticamente). Es decir si todas las tablas de la BD de moodle empiezan por mdl_, ese es el prefijo.

El siguiente escollo es saber si estás pasando los parámetros adecuados a la función insert_record. El primero es el nombre de la tabla sin prefijo y el segundo un instancia del objeto StdClass cuyos atributos han de corresponderse con algunos de los campos de la tabla donde quieres insertar el registro.

Como ya te han comentado en otro lado, el campo id es autoincremental, por tanto ese valor lo asigna Moodle de forma automática, y tú no lo deberías establecer.

En resumen, para insertar los datos en esa tabla, puedes probar lo siguiente:

$registro = new stdClass();
$registro->userid = 155;
$registro->perfil = "bajo";

$resultado = insert_record('perfil',$registro);

La función devuelve true si la inserción se ha realizado con éxito, y algun tipo de cadena de error en caso contrario. Si te da problemas, no tienes más que añadir esta otra instruccion: var_dump($resultado) para saber cual es el problema.
En respuesta a Xavier Paz

Re: problema con insert_record()

de Santiago Nieto Carrera -
Al realizar todo esto me sale que el resultado del insert_record() es bool(false).
¿Es necesario asignar derechos (GRANT) sobre la tabla para que los usarios puedan realizar el insert record, y demás?
Si as aasí como se haría, es que yo he creado la tabla desde phpMyAdmin. Se que cuando se hace a través del install.xml existen unas sentencias en ella, que no entiendo muy bien pero bueno, y que además en access.php se ponen tambien privilegios.

En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Antonio Piedras -
Hola Santiago,
además de lo que te ha dicho Xavier, en principio no has de dar permisos sobre la tabla ya que en el config.php, donde está el código del usuario con el que se accede a la tabla, acostumbra a ser el del propio administrador de la base de datos, y por lo tanto no necesita que nádie le de los permisos, pero si tu accedes con un usuario diferente, entonces sí deberias hacer el GRANT correspondiente.

Saludos.
En respuesta a Antonio Piedras

Re: problema con insert_record()

de Santiago Nieto Carrera -
Y como le doy permisos a esta tabla a todos los usuarios registrados de moodle.
Es que va ser una tabla donde los alumnos ingresen sus perfiles una vez entren.
En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Santiago Nieto Carrera -
Este es el php que tengo.

<?php

require_once("../../config.php");

require_once("func_gperfil.php");
//require_once("perfilclass.php");


//echo $_FILES['uploadedfile']['name'];
$file=$_FILES['uploadedfile']['tmp_name'];
$xml=loadXML($file);
//print_object($xml);
$fich_xml=$xml->asXML();//fichero xml tal cual esta escrito con sus tags
//echo $fich_xml;

//recojo el id del usuario
global $USER;
$id=$USER->id;

//Creo una standard class en la que tendre tantos campos como tenga la tabla en la base de datos excepto el id
$operfil= new stdClass();
$operfil->userid = $id;
$operfil->perfilxml = $fich_xml;


//print $operfil->perfil;
$resul=insert_record('perfil',$operfil);
//$resul=gperfil_insert_record_perfil($id,$fich_xml);
var_dump($resul);

//print mysql_query("SHOW GRANTS FOR CURRENT_USER()");
?>
En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Santiago Nieto Carrera -
He probado ya de mucha formas y me sigue saliendo el error bool(false).
Hay alguien que haya creado alguna tabla además de las tipicas de los modulos para el formulario que me puedan explicar los pasos que hay que seguir.
Necesito que cualquier alumno pueda insertar datos en ella.
Existe alguna forma de saber el porque no esta insertando los datos, si es por tema de permisos, o de que no encuentra la tabla o algo así.

En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda

La mejor forma de saber porque está fallando es activando los mensajes de depuración de Moodle (por si falla algo dentro de Moodle) consultando los logs de la base de datos (por si falla en el momento de hacer la inserción en la base de datos en sí).

Para lo primero puedes ir a Administración >> Servidor >> Depurando y escoger la opción "DESARROLLADOR: mensajes extra de depuración Moodle para desarrolladores" para el ajuste 'Depurar mensajes', y marcar la casilla de 'Mostrar mensajes de depuración'.

Para lo segundo tendrás que habilitar la generación de logs en MySQL (o el motor de base de datos que estés usando).

De otra forma es difícil averiguar lo que está pasando.

Y, por favor, no habrás más hilos nuevos al respecto de este problema. Es muy difícil seguir la conversación a través de tantos mensajes dispersos guiño

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: problema con insert_record()

de Santiago Nieto Carrera -
si quereis podeis eliminar el tema.
El problema ya esta solucionado, lo de siempre una tonteri vamos.
Al poner activado los mensajes de depuracion me decia que no habia tanto sitio para el archivo del perfil por lo cual daba el error.
Lo solucione poniendo tipo text y listo.
En respuesta a Santiago Nieto Carrera

Re: problema con insert_record()

de Alejandro Michavila Pallarés -
Hola,

¿Qué diferencia hay entre usar "new object" o "new stdClass" para insertar registros?.

Un saludo.
En respuesta a Alejandro Michavila Pallarés

Re: problema con insert_record()

de Xavier Paz -
En principio, new stdClass se suele usar para crear un objeto vacío cuya clase no está definida. Después le puedes ir añadiendo atributos.
En respuesta a Xavier Paz

Re: problema con insert_record()

de Alejandro Michavila Pallarés -
Con new object también se puede crear un objeto vacío para posteriormente ir añadiendo atributos.

¿Es mejor usar new stdClass, que new object, a la hora de insertar registros?.

¿Qué otras diferencias hay?.

Otra pregunta, ¿a qué puede ser debido este error?:

Fatal error: Call to a member function get_record() on a non-object in /var/www/moodle/mod/newmodule/lib.php on line 107

La linea 107 del archivo lib.php, corresponde a:

104 function newmodule_delete_instance($id) {
105 global $DB;
106
107 if (! $newmodule = $DB->get_record('newmodule', array('id' => $id))) {
108 return false;
109 }
110 $DB->delete_records('newmodule', array('id' => $newmodule->id));
111
112 return true;
113 }

Muchas gracias Xavier, un saludo.
En respuesta a Alejandro Michavila Pallarés

Re: problema con insert_record()

de Xavier Paz -
get_record() no es un método, es una función estandar, por eso el mensaje de error te dice que estás intentado invocar un método de algo que no es un objeto. $DB es una variable global, no una instancia de un clase. Tengo curiosidad por saber por qué usas esa variable, si las funciones de insert, delete y get de registros de tablas están definidas en las librerías estandar de Moodle (moodlelib.hp o weblib.php, no me acuerdo con precisión)

Por lo que yo he visto a lo largo y ancho de Moodle, lo habitual es es usar new stdClass.
En respuesta a Xavier Paz

Re: problema con insert_record()

de Alejandro Michavila Pallarés -
Gracias Xavier, por lo que respecta a usar new object o new stdClass, utilizaré esta segunda opción por ser más estándar.

Con respecto a get_record tengo la siguiente función que elimina un registro a partir de un id:

106 function newmodule_delete_instance($id) {
107 global $DB;
108
109 printf("ID a borrar: %d", $id); // Debuging
110
111 $newmodule = new stdClass();
112 if (! $newmodule = $DB->get_record('newmodule', array('id' => $id))) {
113 return false;
114 }
115 }

Y si borro un instancia de este módulo, me sale el siguiente mensaje de error:

ID a borrar: 11
Fatal error: Call to a member function get_record() on a non-object in /var/www/moodle/mod/newmodule/lib.php on line 112

Si modifico el código en la linea 112 a:

if(! $newmodule = get_record('newmodule', array('id' => $id))) {

Sin $DB->, me sale el siguiente error:

ID a borrar: 11
Warning: Missing argument 3 for get_record(), called in /var/www/moodle/mod/newmodule/lib.php on line 112 and defined in /var/www/moodle/lib/dmllib.php on line 404

Notice: Undefined variable: value1 in /var/www/moodle/lib/dmllib.php on line 419
Unknown column 'Array' in 'where clause'

SELECT * FROM mdl_newmodule WHERE Array IS NULL
  • line 686 of lib/dmllib.php: call to debugging()
  • line 481 of lib/dmllib.php: call to get_recordset_sql()
  • line 421 of lib/dmllib.php: call to get_record_sql()
  • line 112 of mod/newmodule/lib.php: call to get_record()
  • line 236 of course/mod.php: call to newmodule_delete_instance()
 
Could not delete the newmodule (instance)
 


En respuesta a Alejandro Michavila Pallarés

Re: problema con insert_record()

de Alejandro Michavila Pallarés -
Sin embargo viendo el código de otros módulos, como el de chat:

 chat_delete_instance   ;

    = >get_record, =>   false;  


O el de quiz:


 quiz_delete_instance   ;

   = >get_record,  =>    false;
 

Usan la función estándar get_record de la misma forma. También he probado quitando la linea 111 de mi código:

$newmodule = new stdClass(); 

Y haciendo las mismas pruebas me dan los mismos errores. La verdad, no sé qué es lo que puede estar mal, llevo tiempo dándole vueltas y espero que alguien me pueda ayudar.

Gracias, un saludo.

En respuesta a Alejandro Michavila Pallarés

Re: problema con insert_record()

de Xavier Paz -
Puede ser que te falte incluir alguna librería donde se definan los métodos de la clase $DB.

Revisando las partes de código que has puesto, esto es lo que aparece como a porqué se usa $DB o $db en vez de usar la función directamente (/mod/chat/lib.php)

427 /// Efficient way to extract just the latest message
428 /// Uses ADOdb directly instead of get_record_sql()
429 /// because the LIMIT command causes problems with
430 /// the developer debugging in there.


Dice que se usa ADOdb directamente en vez de las funciones habituales porque en ciertos casos excepcionales es más eficiente. En este caso concreto, porque el comando LIMIT da problemas al depurar el código.
En respuesta a Xavier Paz

Re: problema con insert_record()

de Alejandro Michavila Pallarés -
Muchas gracias por tu respuesta Xavier.

He conseguido resolver mi problema, gracias a Iñaki, que comenta:

http://moodle.org/mod/forum/discuss.php?d=154010


Que el objeto $DB se usa en la versión 2.0 de Moodle y sin embargo, yo estoy desarrollando bajo la versión 1.9.9.

De todas formas, esto que comentas también me interesa, voy a hecharle un vistazo y a investigarlo.

Un saludo.