3 enero, 2026

Terminal ejecutando consulta SQL en Moodle con mensaje de error.

🐘 Moodle y PHP: el error común con get_recordset_sql()

En el día a día con Moodle, uno de los errores más frecuentes al trabajar con la base de datos es usar mal get_recordset_sql().

Muchos piensan que si la consulta no devuelve resultados, el recordset será null o false. Pero en realidad… ¡no es así!

🔎 Veamos un ejemplo real:

$adatos = $DB->get_recordset_sql($sql);
if($adatos){
  print "No hay datos en fase 12"; exit;
}

A primera vista parece correcto, pero en la práctica get_recordset_sql() siempre devuelve un objeto iterador, aunque la consulta esté vacía.
Por lo tanto, la condición if($adatos) siempre se cumple… y el código no hace lo que esperábamos.


✅ La solución: verificar si hay resultados

Existen dos enfoques recomendados:

1. Usando valid() para comprobar si hay registros

$adatos = $DB->get_recordset_sql($sql);

if (!$adatos->valid()) {
    echo "No hay datos en fase 12";
    $adatos->close();
    exit;
}

foreach ($adatos as $dato) {
    // procesar registros
}
$adatos->close();

2. Usando record_exists_sql() para mayor eficiencia

Si lo único que necesitas es saber si hay resultados o no:

if (!$DB->record_exists_sql($sql)) {
    echo "No hay datos en fase 12";
    exit;
}

🎯 Conclusión

  • get_recordset_sql() es ideal para recorrer grandes cantidades de datos, pero recuerda: no devuelve false, sino un objeto iterador.
  • Si solo quieres verificar existencia, la opción más limpia es record_exists_sql().
  • Cerrar siempre el recordset con $adatos->close(); es buena práctica para liberar recursos.

💡 Tip para tu día a día con Moodle: pequeños detalles como este marcan la diferencia entre un código que “funciona” y un código que es eficiente y seguro.


👉 ¿Te ha pasado este error en Moodle? ¿Cuál es tu forma favorita de verificar si existen registros antes de procesarlos?

author avatar
blogdecomputo.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *