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.
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.
¿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.
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.
Es que va ser una tabla donde los alumnos ingresen sus perfiles una vez entren.
<?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()");
?>
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í.
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
Saludos. Iñaki.
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.
Re: problema con insert_record()
¿Qué diferencia hay entre usar "new object" o "new stdClass" para insertar registros?.
Un saludo.
¿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?:
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.
Por lo que yo he visto a lo largo y ancho de Moodle, lo habitual es es usar new stdClass.
Con respecto a get_record tengo la siguiente función que elimina un registro a partir de un 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:
Fatal error: Call to a member function get_record() on a non-object in /var/www/moodle/mod/newmodule/lib.php on line 112
Sin $DB->, me sale el siguiente error:
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
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()
Re: problema con insert_record()
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.
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.
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.