Ejecutar consulta

Ejecutar consulta

de Jorge Zarzosa -
Número de respuestas: 6

Hola a todos amigos!! (esto suena a saludo de bugs bunny jaj)

Antes de nada me presento. Soy un estudiante de Valladolid a punto de terminar el proyecto y con el que llevo trabajando 4 meses desarrollando 2 nuevos módulos de moodle (caray esta palabra me suena).

Hay una última cosa que me han pedido y el problema es muy sencillo: dejar una pantalla con un textarea para que un alumno meta una consulta "a pelo" sobre una base dedatos nueva que ya hemos creado y se supone que con un simple execute_sql("") podriamos ejecutar la consulta. Esto rompe un poco con la forma de trabajar y parece muy arriesgado puesto que podria intentar meter un delete o un drop table o drop database. Y ademasest método no saca la consulta sino k indica si la ejecucion ha sido correcta o no. Mi pregunta es la siguiente:

¿Existe alguna manera de sacar los resultados de la consulta con la API de moodle siendo el alumno kien meta toda la consulta como en el prompt de una pantalla de unix o msdos?

Muxax gracias por la atencion

JJ

Promedio de valoraciones: -
En respuesta a Jorge Zarzosa

consulta

de yvert revollo -
hola Jorge
como tu ya sabes como integrar modulos a moodle me podrias enseñarme como
puedo empezar a construir un modulo para esta plataforma para que pueda
enviar mensajes sms a celulares

gracias.
En respuesta a yvert revollo

Re: consulta

de Jorge Zarzosa -

Hola rebollo, pues para empezar a crear un módulo lo mejor que puedes hacer es descargarte un zip en el siguiente enlace:

http://download.moodle.org/download.php/modules/NEWMODULE.zip 

Descomprímelo y sige las instrucciones que hay en el documento "README".  

Tendrás que escoger un nombre para tu módulo que sustituirás en cada palabra donde ponga NEWMODULE y deberás crear una tabla en la carpeta db en el fichero mysql.sql a modo

También vete leyéndote este debate donde puedes encontrar info muy valiosa

http://moodle.org/mod/forum/discuss.php?d=56072#255777

Espero que te sir va un saludo

CREATE TABLE prefix_NEWMODULE (...)

en la que deberás meter 3 campos obligatorios como el id el name y description ademas de otros campos que te puedan servir para tu modulo de sms que podrian ser numero maximo de sms por persona al dia 'maxsmsperday' , no se lo que vayas viendo que necesitas .

En respuesta a Jorge Zarzosa

Re: Ejecutar consulta

de Antonio Pérez-Aranda Alcaide -
Yo lo que haría sería:
  1. tener una base de datos independiente de moodle, para que no pudiera ver información confidencial
  2. Crear un usuario diferente del que administra la base de datos de moodle. (preferiblemente uno por usuario) En postgresql por ejemplo, se pueden crear mediante una consulta.
  3. Impedir que este usuario lea/modifique las bases de datos moodle usando un GRANT apropiado.
  4. Habilitar el acceso a la base de datos que tu elijas, cada usuarios independientemente, perteneciendo a un grupo de usuarios.
  5. Revisar la consulta siempre para evitar problemas de segurida.
  6. realizar el execute_sql siempre sobre la base de datos que tu asignas, es decir, esta acción la realizar el servidor, y el usuario no tiene modo de modificarla.
Veo que llevas 4 meses trabajando en esto, es decir, más tiempo que yo, así que mi consejo es humilde en todo solo posible.
En respuesta a Jorge Zarzosa

Re: Ejecutar consulta

de Raul Garcia Canet -
Hola Jorge,

Inetentaré responderte:

¿Existe alguna manera de sacar los resultados de la consulta con la API de moodle siendo el alumno kien meta toda la consulta como en el prompt de una pantalla de unix o msdos?

Como no se de que versión de Moodle estamos hablando no te puedo decir si existe o no. Se que en versiones anteriores a la 1.7 existía una función get_record() que hacía exactamente eso, pero por lo que hepodido ver, en la versión 1.8 no existe (oyo no la he encontrado). Desconozco si existe en las versiones 1.7. De todas maneras tendrías el mismo problema, si un alumno quisiese hacer un DROP o un DELETE.

Lo se me ocurre que podrías hacerte una pequeña función para filtrar la cadena SQL buscando palabras clave. Me explico:

En PseudoCodigo:

Busca Orden(DELETE, DROP) en la cadena.
Si existe (Orden) entonces
Busca Nombre_Tabla_Prohibida;
Si Existe (Nombre_Tabla_Prohibida) entonces
Cancela Consulta y muestra mensaje
Sino
Ejecuta Consulta;

sino
Ejecuta consulta;

Para ejecutar la consulta puedes usar alguna de las funciones(modificada para tus propósitos) de moodle, por ejemplo, la función get_users (line 213) se encuentra en el fichero moodle/lib/weblib.php

De esa manera puedes proteger la integridad de las consultas.

Referencias:

API de Moodle 1.8: http://moodle.org/mod/resource/view.php?id=1267
API de Moodle1.7: http://xref.moodle.org/nav.html?index.html
Cadenas en PHP: http://www.phpbuilder.com/manual2/manual/es/function.stristr.php

Espero que esto te sirva.
Hasta pronto.
Salu2.
J. Raul (juagarc4) guay
En respuesta a Raul Garcia Canet

Re: Ejecutar consulta

de Jorge Zarzosa -

Muchas gracias por vuestro tiempo,

la cuestión es que la parte de la seguridad de datos al ejecutar las consultas estoy de acuerdo cno vosotros y mas o menos la tengo terminada. El problema es al imprimir los resultados de la consulta, puesto que no se que campos tengo que sacar por pantalla hasta que no los meta el alumno.

Si conozco la select puedo referirme a los campos con $record->nombre del campo vease este ejemplo  

$query = 'SELECT field, primaryfield from mdl_dataform_answers where dataformid=1';

   $records = get_records_sql($query);
      foreach ($records as $record) {
                echo '<tr><td class="dato">'.$record->field.$record->primaryfield.'</td><td ><td class="dato">';

}

PEro en mi caso no se los campos que querrá sacar. QUe hago veo cuales son los campos y los meto en un array para luego llamarlo

$nombrearray[0] = field; //en el caso de k un campo del select fuera field

   $record->$nombrearray[0];    

Esto me suena bastante mal y espero que me hayais entendido y no esté dando vuelta s a un caso tonto que tiene fácil solución

Muchas gracias

Un saludo           

JJ