Está en la página 1de 21

MANUAL DE ESTILO DE CDIGO

Reglas Generales
1. 2. 3. 4.
Todos los ARCHIVOS DE CDIGO deberan utilizar la extensin .php. Todas las PLANTILLAS deberan utilizar la extensin .html.

Todos los ARCHIVOS DE TEXTO deberan utilizar el formato de texto Unix (la mayora de los editores de texto tienen esto como una opcin). Todas las ETIQUETAS php deben ser 'completas' como <?php ?> ... no 'reducidas' como <? ?>. 5. Todos los AVISOS DE COPYRIGHT deben ser mantenidos. Puede incluir los suyos propios si resulta necesario.

6. 7. 8. 9.

Todos los ARCHIVOS deben incluir el archivo principal config.php.

Cualquier otro include/require debera utilizar una RUTA absoluta que comience por $CFG->dirroot o $CFG->libdir, nunca relativos, ya que estos en algunas ocasiones funcionan de forma extraa en PHP. Cada archivo debera comprobar que el usuario est AUTENTICADO correctamente, utilizando las funciones require_login() y isadmin(), isteacher(), iscreator() o isstudent(). Todos los ACCESOS A LA BASE DE DATOS deberan utilizar las funciones definidas en lib/datalib.php cuando sea posible - esto permite la compatibilidad con un gran nmero de bases de datos. Debera encontrar que prcticamente todo es posible utilizando estas funciones. Si quiere escribir cdigo SQL entonces deber comprobar que: funciona en cualquier plataforma; restringido a funciones especficas de su cdigo (normalmente un archivo lib.php); y claramente comentado. 10. No cree o utilice VARIABLES globales distintas de las estndar $CFG, $SESSION, $THEME, $SITE, $COURSE y $USER.

11.

Todas las VARIABLES deberan ser inicializadas o, al menos, comprobada su existencia utilizando isset() o empty() antes de ser utilizadas. 12. Todas las CADENAS deberan ser traducibles - cree nuevos textos en los archivos "lang/es_utf8" con palabras reducidas en ingls y su traduccin completa al Espaol y recuprelas en su cdigo utilizando las funciones get_string() or print_string().

13.

Todos los ERRORES deberan ser visualizados utilizando la funcin print_error() para maximizar la traduccin y ayudar a los usuarios (Automticamente se enlaza con Moodle Docs).

14.

Todos los FICHEROS DE AYUDA deben ser traducibles - cree nuevos textos en el directorio "lang/es_utf8/help" y llmelos utilizando la funcin helpbutton(). Si necesita actualizar un fichero de ayuda:

para un pequeo CAMBIO, donde la traduccin antigua del fichero podra

tener todava sentido, est permitido que haga el cambio, pero debera notificrselo a translation@moodle.org

para un CAMBIO importante tendr que crear un nuevo fichero aadindole

en el nombre un nmero incrementado (p.ej. filename2.html) para que los traductores puedan ver fcilmente que se trata de una nueva versin del archivo. Obviamente el nuevo cdigo y los ndices de las pginas de ayuda deben ser modificados para apuntar a las versiones ms recientes.

15.

La INFORMACIN que llega desde el navegador (enviada con los mtodos GET o POST) automticamente tiene las "magic_quotes" aplicadas (sin importar la configuracin de PHP) por lo que puedes insertarla con total seguridad en la base de

datos. El resto de la informacin(obtenida desde los archivos, o desde la base de datos) debe ser escapada con la funcin addslashes() antes de insertarla en la base de datos. 16. MUY IMPORTANTE: Todos los textos dentro de Moodle, especialmente aquellos que han sido introducidos por los usuarios, deben ser mostrados utilizando la FUNCINformat_text(). Esto asegura que el texto es filtrado y limpiado correctamente.

17. 18.

Las ACCIONES DE LOS USUARIOS deberan ser grabadas utilizando la funcin add_to_log(). Estos registros son utilizados para la generacin de los "Informes de Actividad" y los Registros. Al generar ENLACES HTML, hgalos siempre relativos a la raz del sitio Moodle, por ejemplo, enlace a $CFG->wwwroot/mod/blonk/view.php?id=99 en lugar de nicamente view.php?id=99. Esto causa que su cdigo funcionar aunque sea llamado por un script que se encuentre en otra carpeta diferente.

Estilo del Cdigo


Comprendo que puede ser un poco frustrante modificar su estilo de programacin si ha trabajado en otras cosas, pero compara esa frustracin con la frustracin de toda la gente que intente, ms adelante, encontrar el sentido del cdigo de Moodle si es una mezcla de estilos. Obviamente, hay muchos puntos a favor y en contra de cada estilo que la gente utiliza, pero el que se detalla aqu es el que deber utilizar. 1. El sangrado del texto debe ser siempre de 4 espacios. No utilices los tabuladosres NUNCA. 2. Los nombres de las variables tienen que ser siempre fciles de leer, procurando que sean palabras en minsculas con significado en Ingls. Si realmente necesita ms de una palabra, pngalas juntas, pero procure mantenerlas tan breves como sea posible. Utilize nombres en plural para las matrices de objetos. BIEN: $quiz BIEN: $errorstring BIEN: $assignments (for an array of objects) BIEN: $i (but only in little loops) MAL: $Quiz MAL: $aReallyLongVariableNameWithoutAGoodReason MAL: $error_string 3. Las constantes tienen que definirse siempre en maysculas, y empezar siempre por el nombre del mdulo al que pertenecen. Deberan tener las palabras separadas por guiones bajos. define("FORUM_MODE_FLATOLDEST", 1); 4. Los nombres de las funciones tienen que ser palabras sencillas en minsculas y en Ingls, y empezar con el nombre del mdulo al que pertenecen para evitar conflictos entre mdulos. Las palabras deberan separarse por guiones bajos. Los parmetros, si es posible, tendrn valores por defecto. Compruebe que no haya espacio entre el nombre de la funcin y lo siguiente (parntesis). function forum_set_display_mode($mode=0) { global $USER, $CFG;

if ($mode) { $USER->mode = $mode; } else if (empty($USER->mode)) { $USER->mode = $CFG->forum_displaymode; } } 5. Los bloques de cdigo siempre deben estar encerrados por llaves (incluso si solo constan de una lnea). Moodle utiliza este estilo: if ($quiz->attempts) { if ($numattempts > $quiz->attempts) { error($strtoomanyattempts, "view.php?id=$cm->id"); } } 6. Las cadenas tienen que ser definidas utilizando comillas simples siempre que sea posible, para obtener un mejor rendimiento. $var $var $var $var = = = = 'some text without any variables'; "with special characters like a new line \n"; 'a very, very long string with a '.$single.' variable in it'; "some $text with $many variables $within it";

7. Los comentarios deben ser aadidos de forma que resulten prcticos, para explicar el flujo del cdigo y el propsito de las funciones y variables. Cada funcin (y cada clase) debera utilizar el popular formato phpDoc. Esto permite que la documentacin sea generada automticamente.

Los comentarios en lnea deberan utilizar los caracteres //, alineados con cuidado por encima de las lneas de cdigo que comenta.

/** * The description should be first, with asterisks laid out exactly * like this example. If you want to refer to a another function, * do it like this: {@link clean_param()}. Then, add descriptions * for each parameter as follows. * * @param int $postid The PHP type is followed by the variable name * @param array $scale The PHP type is followed by the variable name * @param array $ratings The PHP type is followed by the variable name * @return mixed */ function forum_get_ratings_mean($postid, $scale, $ratings=NULL) { if (!$ratings) { $ratings = array(); // Initialize the empty array if ($rates = get_records("forum_ratings", "post", $postid)) { // Process each rating in turn foreach ($rates as $rate) {

....etc 8. El espacio en blanco se puede utilizar con bastante libertad - no se preocupe por separar las cosas un poco para ganar en claridad. Generalmente, debera haber un espacio entre llaves y lneas normales y ninguno entre llaves y variables o funciones: foreach ($objects as $key => $thing) { process($thing); } if ($x $a } else $a } else $a } == $y) { = $b; if ($x == $z) { = $c; { = $d;

9. Cuando est realizando una COPIA de un objeto, utilice siempre la funcin clone() originalmente slo disponible en php5 (en caso contrario simplemente tendr una referencia al primer objeto). Moodle le garantiza que este mtodo funcionar tambin bajo php4. MAL: BIEN: $b = $a; $b = clone($a);

Si la "cosa" que quiere copiar no es un objeto, pero puede contener objetos (p.ej. un array de objetos) utilice la funcin fullclone() en su lugar.

Estructuras de la base de datos


1. Cada tabla debe tener un campo autonumrico id (INT10) como clave primaria. 2. La tabla principal que contiene instancias de cada mdulo debe tener el mismo nombre que el mdulo y contener, por lo menos, los siguientes campos:

id - descrito arriba course - el identificador del curso al que la instancia pertenece

name - el nombre completo de la instancia 3. El resto de las tablas asociadas con un mdulo que contiene informacin sobre 'cosas', deberan ser llamandas modulo_cosas (fjese en el plural!). 4. Los nombres de las tablas y de los campos tienen que evitar el uso de palabras reservadas por las Bases de Datos. Por favor, comprubelo antes de crearlas. 5. Los nombres de los campos (columnas) deberan ser sencillos y cortos, siguiendo las mismas reglas que los nombres de las variables. 6. Cuando sea posible, las columnas que contengan una referencia al campo id de otra tabla (por ejemplo, modulo) debera ser llamado moduloid. (fjate que esta norma es nueva y no es seguida por algunas tablas antiguas).

7. Los campos booleanos sern implementados como enteros cortos (por ejemplo, INT4) con los valores 0 o 1, para permitir la futura expansin de los valores si fuera necesario. 8. La mayora de las tablas tienen que tener un campo timemodified (INT10) que ser actualizado con la fecha actual (timestamp de UNIX) obtenida con la funcin time() de PHP. 9. Defina siempre un valor por defecto para cada campo (y haga que tenga sentido). 10. Cada tabla debe comenzar con el prefijo de la base de datos ($CFG->prefix). En muchos casos esto es gestionado automticamente. Adems, bajo PostgreSQL, el nombre de cada ndice debe empezar tambin con el prefijo. 11. Para garantizar la compatibilidad entre bases de datos, por favor, siga las reglas siguientes sobre el uso del comando AS (solo si necesita alias en tablas/campos, por supuesto):

No utilice el comando AS para alias de tablas.

Utilice el comando AS para alias de campos (columnas). Nunca cree UNIQUE KEYs (restricciones) para nada. En su lugar utilice UNIQUE INDEXes. En el futuro, si se decide aadir integridad referencial a Moodle y si se necesitan UNIQUE KEYs, sern utilizadas, pero no por ahora. Por favor, fjese que el Editor XMLDB permite especificar tanto restricciones UNIQUE y FOREIGN (y eso es bueno, teniendo el XML bien definido), pero solo los ndices subyacentes sern realmente generados en la DB.

12.

13.

Esas UNIQUE KEYs creadas en el Editor XMLDB (lea el punto anterior) solo debe ser definida si el campo/campos van a ser el objetivo para alguna FOREIGN KEY (a nivel de Editor). En caso contrario, creelas como UNIQUE INDEXes.

14.

Las tablas asociadas con un bloque deben seguir las siguientes convenciones en sus nombres: $CFG->prefix + "block_" + nombre del bloque + aadidos. Por ejemplo, asumiendo que $CFG->prefix es 'mdl_', todas las tablas para el bloque "rss_client" debern empezar por 'mdl_block_rss_client' (siendo posible aadir ms palabras al final, p.ej. 'mdl_block_rss_client_anothertable'...). Esta regla ser completamente forzada con Moodle 2.0, dando algo de tiempo a los desarrolladores hasta entonces. Vea laTarea 6786 para ms informacin sobre esto.

15.

Nunca realice cambios a la base de datos en ramas ESTABLES. Si hacemos eso, entonces los sitios actualizando de una versin estable a la siguiente pueden encontrarse con cambios por duplicado, lo cual puede producir errores serios.

16.

Cuando haga referencia a una variable entera en consultas SQL, no entrecomille el valor. Por ejemplo, get_records_select('question', "category=$catid") es correcto. get_records_select('question', "category='$catid'") es incorrecto. Ese uso oculta posibles errores cuando $catid est sin definir. (Esta discusin lo explica.)

Normas de Seguridad (y control de la informacin de formularios y URLs)


1. No se base en 'register_globals'. Cada variable debe ser correctamente inicializada en cada fichero de cdigo. Debe ser obvia la procedencia de cada variable.

2.

Inicialice todos los arrays y objetos aunque estn vacos. $a = array() o $obj = new stdClass();. 3. No utilice la funcin optional_variable(). En su lugar, utilice la funcin optional_param(). Seleccione la opcin PARAM_XXXX apropiada al tipo de parmetro que espera. Para comprobar y definir un valor opcional para una variable, utilice la funcin set_default().

4. No utilice la funcin require_variable(). En su lugar, utilice la funcin required_param(). Seleccione la opcin PARAM_XXXX apropiada al tipo de parmetro que espera. 5. Utilice data_submitted(), con cuidado. La informacin todava debe ser limpiada antes de utilizarla. 6. No utilice $_GET, $_POST o $_REQUEST. En su lugar, utilice las funciones required_param() o optional_param() apropiadas. 7. No compruebe las acciones con cdigo como: if (isset($_GET['algo'])). Utilice, por ejemplo, $algo = optional_param( algo, -1, PARAM_INT ) y entonces compruebe que est dentro de los valores esperados, por ejemplo, if ($something>=0) {.... 8. Cuando sea posible agrupe todas sus llamadas a required_param(), optional_param() y el resto de inicializacin de variables en el principio de cada fichero (o funcin) para que sea fcilmenente localizable. 9. Utilice el mecanismo 'sesskey' para proteger el envo de formularios de ataques. Un ejemplo de uso: cuando el formulario es generado, incluya <input type="hidden" name="sesskey" value="<?php echo sesskey(); ?>" />. Cuando el formulario es procesado, compruebe if (!confirm_sesskey()) {error('Bad Session Key');}. 10. Todos los nombres de ficheros deben ser 'limpiados' utilizando la funcin clean_filename(), si esto no ha sido realizado con el uso de las funciones required_param() o optional_param() con anterioridad. 11. Cualquier informacin leda desde la base de datos debe tener la funcin addslashes() aplicada antes de volver a enviar la informacin a la base de datos. Un objeto completo puede ser procesado con la funcin addslashes_object(). 12. Cuando sea posible, la informacin que se almacenar en la base de datos debe venir de peticiones POST (por ejemplo, informacin de un formulario) en lugar de utilizar peticiones GET (por ejemplo, informacin de la URL). 13. No utilice informacin obtenida de $_SERVER si puede evitarlo. Presenta algunos problemas de portabilidad. 14. Si no ha sido realizado en ningn otro lugar, asegurese de que la informacin enviada a la base de datos ha sido filtrada mediante la funcin clean_param() utilizando la opcin PARAM_XXXX apropiada. 15. Si escribe cdigo SQL, asegurese completamente de que es correcto. En particular, compruebe la falta de comillas en las variables utilizadas. Es un punto de entrada para ataques de tipo 'SQL injection'. 16. Compruebe toda la informacin (especialmente la que es enviada a la base de datos) en cada archivo que es utilizada. Nunca confe en que otro cdigo estar haciendo ese trabajo. 17. Los bloques de cdigo que se incluyan deben presentar una estructura PHP correcta (por ejemplo, con una declaracin de una clase, de funcines, etc.) - los bloques de cdigo lineales ("espagueti") suelen tender a utilizar variables sin inicializar (y son menos legibles). 18. Si necesita usar shell_exec() (o cualquier otra funcin que invoque un shell), asegrese de que ha limpiado los parmetros anteriormente con escapeshellcmd()/escapeshellarg() (de lo contrario abrimos la puerta a ataques de inyeccin de shell).

Desarrollo: Las funciones de DML


(Redirigido desde las funciones de DML )

Plantilla: Moodle 2.0 Esta pgina describe las funciones disponibles para acceder a los datos en la base de datos de Moodle. Usted debe exclusivamente a utilizar estas funciones con el fin de recuperar o modificar el contenido de la base de datos debido a que estas funciones

proporcionan un alto nivel de abstraccin y garantizar que su manipulacin de la base de datos trabajar en contra de RDBMSes diferentes. Siempre que sea posible, trucos y ejemplos se documentan aqu con el fin de mejorar la vida de los desarrolladores un poco ms fcil. Por supuesto, no dude en aclarar, completar y aadir ms informacin a esta documentacin. Ser bienvenido, por supuesto!

Contenido
[ ocultar ]

o o o o

1 Informacin principal 2 Las funciones 2.1 Al ver cuntos registros coinciden con el criterio 2.2 Ver si existe un registro 2.3 Obtencin de un registro nico 2.4 Obtencin de un conjunto de registros

o o o o o o o o o

2.4.1 Ejemplos 2.4.1.1 moodle_database :: get_records () 2.4.1.2 moodle_database :: get_records_select () 2.4.1.3 moodle_database :: get_records_sql () 2.4.1.4 moodle_database :: get_records_list () 2.4.1.5 moodle_database :: get_records_menu () 2.4.1.6 moodle_database :: get_records_select_menu () 2.4.1.7 moodle_database :: get_records_sql_menu ()

2.5 Obtencin de un valor determinado campo de un registro 2.6 Obtencin de un valor determinado campo de varios registros 2.7 Configuracin de un campo determinado en la base de datos 2.8 Eliminacin de registros 2.9 Insercin de registros 2.9.1 Ejemplo (s) 2.10 Actualizacin de los Registros 2.11 Uso de registros 2.12 transacciones delegados 2.12.1 Ejemplo (s) 2.13 Funciones auxiliares 3 Vase tambin

Informacin principal

Nota importante: Todas las funciones se muestran en esta pgina son para su uso en Moodle 2.0 hacia arriba , donde hemos cambiado la capa de base de datos para apoyar algunas de las caractersticas nuevas. Si necesita ms informacin de la versin de Moodle anterior, echar un vistazo a las funciones de DML - 2,0 pre pgina. Para una referencia detallada de los cambios, consulte la documentacin de la migracin .

Todas las llamadas de funcin en esta pgina son los mtodos pblicos del objeto $

DB global, por lo que tendr que "importar" que dentro de sus funciones (no es necesario en los scripts globales) con un simple:

global $DB;
Todos los parmetros de la tabla dlares en las funciones estn destinadas a ser el

nombre de la tabla , sin prefijos.

$user = $DB->get_record('user', array('id'=>'1');


Cuando se utiliza el xxx_sql () funciones, los nombres de tabla deben escribirse entre

llaves.

$user = $DB->get_record_sql('SELECT * FROM {user} WHERE id = ?',


array(1));

Todos los parmetros $ condiciones en las funciones son las matrices de

nombredecampo => ValorDelCampo elementos.

$user = $DB->get_record('user', array('firstname'=>'Martin',


'lastname'=>'Dougiamas'));

Todos los parmetros $ params en las funciones son las matrices de valores que se

utilizan para rellenar los marcadores de posicin en las sentencias SQL. Tanto el signo de interrogacin y marcadores de posicin nombrados pueden ser utilizados. Tenga en cuenta que params nombre debe ser nico , incluso si el valor pasado es el mismo.

/// Question mark placeholders:


$DB->get_record_sql('SELECT * FROM {user} WHERE firstname = ? AND lastname = ?', array('Martin', 'Dougiamas')); /// Named placeholders: $DB->get_record_sql('SELECT * FROM {user} WHERE firstname = :firstname AND lastname = :lastname', array('firstname'=>'Martin', 'lastname'=>'Dougiamas'));

Las funciones

Al ver cuntos registros coinciden con el criterio


o $DB->get_record($table, array $conditions, $fields='*', $strictness=IGNORE_MISSING) /// Get a single database record as an object where all the given conditions met. /// @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found; /// IGNORE_MULTIPLE means return first, ignore multiple records found(not recommended); /// MUST_EXIST means throw exception if no record or multiple records found o $DB->get_record_select($table, $select, array $params=null, $fields='*', $strictness=IGNORE_MISSING) /// Get a single database record as an object which match a particular WHERE clause. o $DB->get_record_sql($sql, array $params=null, $strictness=IGNORE_MISSING) /// Get a single database record as an object using a SQL statement.

Ver si existe un registro


o $ DB -> record_exists ( $ tabla , matriz de $ condiciones = null )

. / / / prueba si existe un registro en una tabla donde todas las condiciones dadas se reuni o $ DB -> record_exists_select ( $ tabla , params = null ) / / / Comprobar si existe algn registro en una tabla que se ajustan a una determinada clusula WHERE. o $ DB -> record_exists_sql ( $ sql , matriz de $ params = null ) $ select , matriz de $

/ / / prueba si una sentencia SELECT devuelve ningn registro.

Obtencin de un registro nico


o $ DB -> get_record ( $ tabla , '*' , $ ignoremultiple = false ) matriz de $ condiciones , $ campos =

. / / / Obtener un registro de base de datos nica como un objeto en todas las condiciones dadas se reuni o $ DB -> get_record_select ( $ tabla , = null , los campos $ = '*' , $ select , matriz de $ params

$ ignoremultiple = false )

/ / / Obtener un registro de base de datos nica como un objeto particular, que coinciden con una clusula WHERE. o $ DB -> get_record_sql ( $ sql , matriz de $ params = null )

/ / / Obtener un registro de base de datos nica, como un objeto mediante una sentencia SQL.

Obtencin de una tabla de registros


Cada uno de los siguientes mtodos devuelve un array de objetos. La tabla est indexada por la primera columna de los campos devueltos por la consulta. Por lo tanto para asegurar los datos consistentes, que parece ser la mejor prctica para asegurar que la consulta incluir una "columna id" como el primer campo. (En el desarrollo de tablas personalizadas, asegrese de hacer tu ID de la primera columna por esta razn!)

o $ DB -> get_records ( $ tabla , sort = pulgadas , los )

matriz de

$ condiciones = null ,

campos $ = '*' ,

$ limitfrom = 0 ,

$ limitnum = 0

/ / / Obtener un nmero de registros como un array de los objetos donde todas las condiciones dadas Obtener un nmero de registros como un array de objetos que se ajustan a una determinada clusula WHERE. o $ DB -> get_records_sql ( $ sql , matriz de $ params = null , $ limitfrom = 0 , $ limitnum = 0 ) / / / Obtener un nmero de registros como un array de objetos utilizando una sentencia SQL Obtener un nmero de registros como un array de objetos en los que un campo coincidan con una lista de valores.

Los mtodos siguientes devuelven los datos como pares clave / valor en una matriz asociativa.

Obtener las primeras dos columnas de una serie de registros como un array asociativo donde todas las condiciones dadas Obtener las primeras dos columnas de una serie de registros como un array asociativo que se ajustan a una determinada clusula WHERE. o $ DB -> get_records_sql_menu ( $ sql , matriz $ params = null , $ limitfrom = 0 , $ limitnum = 0 ) / / / Obtener las primeras dos columnas de una serie de registros como un array asociativo con una instruccin SQL.

Ejemplos
moodle_database :: get_records () Obtener un nmero de registros como un array de objetos en todas las condiciones dadas se reunieron.

/ / / Obtener todos los registros donde foo = bar $ resultado ) ) ; = $ DB -> get_records ( $ tabla , matriz ( 'foo' => 'bar'

/ / / Obtener todos los registros donde foo = bar y jon doe = $ resultado Y' , 'Jon' = => $ DB -> get_records ( $ tabla , matriz ( 'foo' 'Doe' ) ) ; => 'bar

/ / / Obtener todos los registros donde foo = bar, pero slo volver a los campos foo, bar, jon, gama $ resultado = $ DB -> get_records ( $ tabla , matriz ( 'foo' => 'bar' )

, null , 'Doe foo, bar, Jon,' ) ; / / / En el ejemplo anterior podra causar problemas de datos a menos que el campo 'foo' pasa a tener valores nicos.

moodle_database :: get_records_select () Obtener un nmero de registros como un array de objetos que se ajustan a una determinada clusula WHERE.

/ / / Obtener todos los registros en los que Jon = 'cierva' y Bob no es = 'Tom' / / / El 'select' parmetro es (si no est vaco) se cae directamente en la clusula WHERE sin alteracin. $ tabla = 'foo' ; = "jon = ' cierva 'y bob = "Tom"!' ; / / se pone en la

$ seleccione clusula where $ resultado =

$ DB -> get_records_select ( $ tabla , $ select ) ;

moodle_database :: get_records_sql () Obtener un nmero de registros como un array de objetos utilizando una sentencia SQL. Se define como una funcin de resumen en moodle_database, este mtodo se lleva a cabo segn el tipo de base de datos.

/ / / Obtener todos los registros de la "mesa" donde foo = bar $ resultado = $ DB -> get_records ( "SELECT * FROM tabla WHERE foo =? '

, array ( 'bar' ) ;

/ / / Obtener todos los registros de la "mesa "donde foo = 'bar' y bob = 'Tom' / / / Esto es algo similar a la forma en Drupal hace sus consultas $ result bob' , = $ DB -> get_records ( '? SELECT * FROM tabla WHERE foo = Y = 'bar' , 'Tom' ) ;

serie (

moodle_database :: get_records_list () Obtener un nmero de registros como un array de objetos en los que un campo coincidan con una lista de valores.

/ / / Obtener todos los registros donde los valores ('bar', un 'elefante', 'moodle') se encuentran en 'foo' en el campo $ result 1 , = $ DB -> get_records ( $ tabla , 'moodle' ) ) ; "foo" , matriz ( 'bar' ,

'elefante' ,

/ / / Obtener todos los registros donde los valores ('bar', un 'elefante', 'moodle') se encuentran en 'foo' en el campo / / / Slo volviendo los id 'de los campos,' prueba 'y' tacos ' $ resultado , ) ; 1 , = $ DB -> get_records ( $ tabla , 'moodle' ) nula , "foo" , matriz ( 'bar'

'elefante' ,

"Identificacin, ensayo, tacos '

moodle_database :: get_records_menu () Obtener las primeras dos columnas de una serie de registros como un array asociativo, donde todas las condiciones dadas se reuni. Usted puede elegir los dos campos, o deje en blanco el parmetro y el mtodo devolver las dos primeras columnas de la tabla. Devuelve una matriz asociativa.

/ / / Obtener todos los registros de 'foo' mesa donde "foo" columna es igual a 'bar' el valor de la tabla $ = 'foo' ; = / / / nombre de la tabla / / / el nombre del campo

$ condiciones

array ( 'foo' => 'bar' ) ;

(clave) y el valor deseado

$ resultado

$ DB -> get_records_menu ( $ tabla , $ condiciones ) ) ;

/ / / Obtener todos los registros de 'foo' mesa donde "foo" la columna es igual a 'bar' el valor / / / Volviendo a los valores de los id 'las columnas y los tacos de $ tabla = 'foo' ; = / / / nombre de la tabla / / / el nombre del campo

$ condiciones

array ( 'foo' => 'bar' ) ;

(clave) y el valor deseado de $ campos = "id, tacos ' ; / / / lista de campos para devolver

$ resultado

$ DB -> get_records_menu ( $ tabla , $ condiciones ) ) ;

El resultado de este ltimo ejemplo se ver algo como:

/ / / El valor del campo id es 909 y el valor de la columna 'tacos' es 6 matriz ( 1 ) { [ 909 ] = 6 }

moodle_database :: get_records_select_menu () Obtener las primeras dos columnas de una serie de registros como un array asociativo que se ajustan a una determinada clusula WHERE.

/ / / Obtener todos los registros en los que Jon = 'cierva' y Bob no es = 'Tom' / / / El 'select' parmetro es (si no est vaco) se cae directamente en la clusula WHERE sin alteracin. $ tabla = 'foo' ; = "jon =" cierva "y Bob =" Tom "! ' ; / / se pone en la

$ seleccione clusula where $ resultado =

$ DB -> get_records_select_menu ( $ tabla , $ select ) ;

$ tabla

'foo' ; = "jon =" cierva "y Bob =" Tom "! ' ; / / se pone en la

$ seleccione clusula WHERE

los campos $ $ resultado =

'id, tacos de ; / / devuelve estos campos $ DB -> get_records_select_menu ( $ de mesa , los $ select

, los nulos , los campos $ ) ;

El resultado de este ltimo ejemplo se ver algo como:

/ / / El valor del campo id es 909 y el valor de la columna 'tacos' es 6 matriz ( 1 ) { [ 909 ] = 6 }

moodle_database :: get_records_sql_menu () Obtener las primeras dos columnas de una serie de registros como un array asociativo con una instruccin SQL.

/ / / Obtener todos los registros de la tabla, donde foo bar = 6 $ sql = "SELECT * FROM foo DONDE bar =? ' ; = array ( 6 ) ;

$ params

$ resultado

$ DB -> get_records_sql_menu ( $ sql , $ params ) ;

/ / / Obtener todos los registros de la tabla, donde foo bar = 6 $ sql = "SELECT id, tacos de foo bar = DNDE?" ; = array ( 6 ) ;

$ params

$ resultado

$ DB -> get_records_sql_menu ( $ sql , $ params ) ;

El resultado de este ltimo ejemplo se ver algo como:

/ / / El valor del campo id es 909 y el valor de la columna 'tacos' es 6 matriz ( 1 ) { [ 909 ] = 6 }

Obtencin de un valor determinado campo de un registro


o $ DB -> get_field ( $ tabla , $ retorno , array $ condiciones )

. / / / Obtiene un valor nico campo de un registro de la tabla, donde todas las condiciones dadas se reuni o $ DB -> get_field_select ( $ tabla , matriz $ params = null ) $ retorno , $ seleccione ,

/ / / Obtiene un valor nico campo de un registro de la tabla que se

ajustan a una determinada clusula WHERE. o $ DB -> get_field_sql ( $ sql , matriz de $ params = null )

/ / / Obtener un solo campo valor (primer campo), utilizando una sentencia SQL.

Obtener un valor de campo particular de varios registros


o $ DB -> get_fieldset_select ( $ tabla , de $ params = null ) / / / selecciona los registros y valores de retorno de campo elegido como una matriz que se ajustan a una determinada clusula WHERE. o $ DB -> get_fieldset_sql ( $ sql , matriz de $ params = null ) $ retorno , $ select , matriz

/ / / Selecciona los registros y valores de retorno (primer campo) como una matriz mediante una sentencia SQL.

Configuracin de un campo determinado en la base de datos


o $ DB -> set_field ( $ tabla , condiciones = null ) / / / Establecer un solo campo en cada registro de la tabla, donde todas las condiciones dadas se reuni. o $ DB -> set_field_select ( $ tabla , select , matriz de $ params = null ) $ Newfield , $ nuevovalor , $ $ Newfield , $ nuevovalor , array $

/ / / Establecer un solo campo en cada registro de la tabla que se ajustan a una determinada clusula WHERE.

Eliminacin de registros
o $ DB -> delete_records ( $ tabla , matriz de $ condiciones = null )

/ / / Eliminar los registros de una tabla en donde todas las condiciones dadas se reuni. o $ DB -> delete_records_select ( $ tabla , params = null ) / / / Eliminar uno o ms registros de una tabla que se ajustan a una determinada clusula WHERE. $ select , matriz de $

La insercin de registros
El mtodo para insertar los registros que se llama con acierto suficiente, insert_record (). El mtodo acepta 4 parmetros, pero el cuarto, "a granel", en la mayora de las implementaciones no se utiliza.

o $ DB -> insert_record ( $ tabla , a granel $ = false )

$ DataObject ,

$ returnid = cierto ,

/ / / Insertar un registro en una tabla y devolver el campo "id" si es necesario.

Ejemplo (s)
$record = new stdClass(); $record->name = 'overview';

$record->displayorder = '10000'; $DB->insert_record('quiz_report', $record, false); $record = new stdClass(); $record->name = 'overview';

$record->displayorder = '10000'; $lastinsertid = $DB->insert_record('quiz_report', $record);

Actualizacin de registros
o $ DB -> update_record ( $ tabla , $ DataObject , $ mayor = false )

/ / / actualizar un registro en una tabla.

Utilizar conjuntos de registros


Cuando el nmero de registros que se recuperan de base de datos es alta, los get_records_xxx () por encima de las funciones estn muy lejos de ser ptima, debido a que se carguen todos los registros de la memoria, al mismo tiempo. En estas circunstancias, se recomienda utilizar estos get_recordset_xxx () en lugar de funciones, que utilizan un mecanismo de bonita para iterar sobre todos los registros de destino y guardar una gran cantidad de memoria. Slo una cosa es absolutamente importante : No te olvides de cerrar los registros despus de usarlos! (Esto va a liberar una gran cantidad de recursos en el RDBMS). Esta es la forma general para iterar sobre los registros utilizando el get_recordset_xxx () funciones:

$ Rs

$ DB -> get_recordset ( .... ) ( $ rs como $ registro ) {

foreach

/ / Haga lo que quiera con este disco } $ rs -> cerrar ( ) ; registros! / / No se olvide de cerrar el conjunto de

Y esta es la lista de funciones disponibles (100% sincronizado con el get_records_xxx () ms arriba):

o $ DB -> get_recordset ( $ tabla , sort = pulgadas , los )

matriz de

$ condiciones = null ,

campos $ = '*' ,

$ limitfrom = 0 ,

$ limitnum = 0

/ / / Obtener un nmero de registros como un moodle_recordset donde todas las condiciones dadas Obtener un nmero de registros como un moodle_recordset que se ajustan a una determinada clusula WHERE. o $ DB -> get_recordset_sql ( $ sql , matriz de $ params = null , $ limitfrom = 0 , $ limitnum = 0 ) ; / / / Obtener un nmero de registros como un moodle_recordset utilizando un SQL Obtener un nmero de registros como un moodle_recordset en un campo coincide con una lista de valores.

Las transacciones de delegados

Por favor, tenga en cuenta algunas bases de datos no admiten transacciones (por

ejemplo, el motor de base de datos MySQL MyISAM), sin embargo, todos los administradores de los servidores estn fuertemente estimulados a emigrar a las bases de datos que las operaciones de apoyo (tales como el motor de base de datos InnoDB MySQL).

Las versiones anteriores admite slo un nivel de transaccin. Desde Moodle 2.0, la

capa de LMD emula las operaciones delegadas que permiten el anidamiento de transacciones.

Las transacciones no se debe utilizar tanto en el ncleo de Moodle, sino que estn

destinados a varios plugins como los servicios web, inscribirse y plugins autenticacin.

Algunos subsistemas (como la mensajera) no son compatibles con las transacciones,

porque es que no es posible revertir en sistemas externos. Una transaccin se inicia por:

$ Transaction

$ DB -> start_delegated_transaction ( ) ;

y termin por:

$ Transaction -> allow_commit ( ) ;

Por lo general, una transaccin se revierte cuando se produce una excepcin. $ transaction-> rollback ($ ex); se debe utilizar con mucho cuidado, ya que podra romper la compatibilidad con bases de datos que no soportan las transacciones. Las transacciones no pueden ser utilizados como parte del flujo de cdigo esperado, sino que slo se puede utilizar como una proteccin de emergencia de la consistencia de datos. Ver ms detalles en el desarrollo: la capa de base de datos 2.0 operaciones delegadas o MDL-20625 .

Ejemplo (s)
global de tratar { transaccin de US $ = $ DB -> start_delegated_transaction ( ) ; $ DB ,

/ / Insertar un registro $ DB -> insertar ( "foo" , $ DB -> insert ( 'bar' , $ objeto ) ; $ otherobject ) ;

/ / Suponiendo que el trabajo se inserta tanto, llegamos a la siguiente lnea. $ transaction -> allow_commit ( ) ; } catch ( Exception $ e ) {

$ transaction -> rollback ( $ e ) ; }

Funciones auxiliares
Con el fin de tener verdadera cruz-db compatibilidad, hay algunas funciones auxiliares utilizados para construir fragmentos de SQL sobre la base de Moodle es la base de datos en funcionamiento. Con ellas vamos a evitar las preguntas condicionales aqu y all y tener esas "incompatibilidades" fijado de una vez y para siempre.

o $ DB -> sql_bitand ( $ INT1 ,

INT2 $ )

/ / Devoluciones y el texto de SQL que se utilizar para llevar a cabo un AND bit a bit . / / / operacin entre 2 enteros o $ DB -> sql_bitnot ( $ int1 ) / / / Devuelve el texto de SQL que se utilizar para llevar a cabo un bit a bit NO / / / operacin con un nmero entero. o $ DB -> sql_bitor ( $ INT1 , INT2 $ )

/ / Devoluciones y el texto de SQL que se utilizar para llevar a cabo un bit a bit O / / / operacin entre 2 enteros. o $ DB -> sql_bitxor ( $ INT1 , INT2 $ )

/ / Devoluciones y el texto de SQL que se utilizar para realizar un XOR bit a bit . / / / operacin entre 2 enteros

o $ DB -> sql_null_from_clause ( ) / / / Devuelve la clusula FROM requerido por algunos DB en todas las sentencias SELECT.

o $ DB -> sql_ceil ( $ nombre de campo ) . / / / Devuelve la expresin correcta CEIL aplicado a fieldName o $ DB -> sql_ilike ( ) / / / Devuelve el SQL adecuado para hacer, como de un modo de maysculas y minsculas. o $ DB -> sql_length ( $ nombre de campo ) / / / devuelve el texto SQL que se utiliza para calcular la longitud en caracteres de una expresin. o $ DB -> sql_modulo ( $ INT1 , INT2 $ )

/ / / devuelve el texto SQL que se utilizar para el clculo del mdulo - el resto despus de la divisin o $ DB -> sql_position ( $ aguja , $ pajar )

/ / / Devuelve los . SQL para el retorno de buscar una cadena para la ubicacin de otro / / / Nota: Si utiliza marcadores de posicin en TANTO $ $ pajar la aguja y, que debe ser nombrado marcadores de posicin. o $ DB -> sql_substr ( expr $ , $ inicio , $ longitud = falsa )

/ / / Devuelve el substr adecuado () el texto SQL utilizada para extraer subcadenas de base de datos.

/ / / Nota: Este fuction ha cambiado en Moodle 2.0 y ahora por lo menos 2 parametros son obligatorios. / / / Nota: Ahora devuelve la texto de SQL entera que se usa en lugar de slo el nombre de la funcin.

o $ DB -> sql_cast_char2int ( $ nombre de campo ,

$ texto = false )

/ / / Devuelve el SQL que se utilizarn para emitir una columna CHAR a INTEGER. o $ DB -> sql_cast_char2real ( $ nombre de campo , $ texto = false )

/ / / Devuelve el SQL que se utilizarn para emitir una columna CHAR en nmero real.

o $ DB -> sql_compare_text ( $ nombre de campo ,

$ numchars = 32 )

/ / / Devuelve el texto SQL que se utiliza para comparar un texto (CLOB) de la columna. / / / con una columna VARCHAR. o $ DB -> sql_order_by_text ( $ nombre de campo , $ numchars = 32 )

/ / / devuelve el texto SQL que se utilizar para ordenar por un texto (CLOB) de la columna.

o $ DB -> sql_concat ( ) / / / Devuelve el SQL apropiado para hacer CONCAT entre los elementos pasados. o $ DB -> sql_concat_join ( $ separador = "" "" , ) ) / / / Devuelve el SQL apropiado para hacer CONCAT entre los elementos pasan mediante un separador. o $ DB -> sql_fullname ( $ primera = 'Nombre' , ltimos $ = 'apellido' ) $ elementos = matriz (

/ / / Devuelve la correcta SQL para concatenar $ nombre y $ apellido.

o $ DB -> sql_isempty ( $ nombretabla , nullablefield , $ campo de texto )

$ nombre de campo ,

/ / / Devuelve el SQL adecuado para saber si un campo est vaco. o $ DB -> sql_isnotempty ( $ nombre de tabla , nullablefield , $ campo de texto ) $ nombre de campo , $

. / / / Devuelve el SQL adecuado para saber si un campo no est vaco o $ DB -> sql_empty ( ) / / / Devuelve la cadena vaca char utilizados por cada base de datos compatible.

Vase tambin

Excepciones DML : Nuevo cdigo DML est lanzando excepciones en lugar de

devolver false si algo sale mal DML conductores : los conductores de bases de datos para la nueva capa de LMD Las funciones de pre - DML 2.0 : (deprecated!) Para obtener informacin vlida

antes de Moodle 2.0. Funciones DDL : Cuando todas las funciones que se utilizan para manipular objetos

DB ( DDL ) se definen. DB capa de ejemplos 2.0 : Para ver algunos ejemplos de cdigo que utilizan las

diversas funciones DML. DB capa de 2,0 migracin de documentos : la informacin acerca de cmo modificar

el cdigo para trabajar con la nueva capa de Moodle 2.0 DB. Funciones DTL : exportacin, importacin y traslado de los datos almacenados en

bases de datos SQL