Hello Alfredo,
Just as a small practical tip:
Using many ?? calls works,
but once the HTML grows, it quickly becomes hard to read and maintain.
A cleaner alternative is to
build the HTML block as a whole using TEXT … ENDTEXT
and output it once at the end.
This way:
the logic remains easy to debug
the HTML reads like HTML
and the code becomes much more maintainable over time
It’s not a requirement and not a dogma,
just an approach that tends to pay off very quickly in web code.
Best regards,
Otto
<?prg
LOCAL o
LOCAL cHtml
LOCAL cTitulo := 'Test MySQL Connection'
LOCAL nAnio := Year( Date() )
LOCAL cEstadoHtml
// Header laden
?? ULoadHtml( 'examples/sql/header.html', cTitulo )
// --- Logik: MySQL-Verbindung ---
o := WDO_MYSQL():New( ;
'localhost', ;
'fivetech_test', ;
'fivewin2026', ;
'dbharbour', ;
3306 )
IF o:lConnect
TEXT INTO cEstadoHtml
<div class="mensaje-exito">
<div class="titulo-mensaje">âś“ ConexiĂłn Exitosa</div>
<div class="detalle-mensaje">
Se ha establecido correctamente la conexiĂłn con la base de datos MySQL.<br>
Estado: <strong>Conectado</strong><br>
Base de datos: <strong>dbharbour</strong>
</div>
</div>
ENDTEXT
ELSE
TEXT INTO cEstadoHtml
<div class="mensaje-error">
<div class="titulo-mensaje">âś— Error de ConexiĂłn</div>
<div class="detalle-mensaje">
<strong>No se pudo establecer la conexiĂłn con MySQL</strong><br><br>
Detalles del error:<br>
<code>${ o:cError }</code><br><br>
Posibles soluciones:
<ul>
<li>Verifica que el servidor MySQL esté ejecutándose</li>
<li>Confirma que las credenciales sean correctas</li>
<li>Revisa que la base de datos "dbharbour" exista</li>
<li>Asegúrate de que el puerto 3306 esté disponible</li>
<li>Verifica los permisos del usuario en MySQL</li>
</ul>
</div>
</div>
ENDTEXT
ENDIF
IF o != NIL
o:Close()
ENDIF
// --- HTML Template ---
TEXT INTO cHtml
<style>
.contenedor { max-width: 800px; margin: 50px auto; padding: 20px; }
.mensaje-error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb;
padding: 20px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); margin: 20px 0; }
.mensaje-exito { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb;
padding: 20px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); margin: 20px 0; }
.titulo-mensaje { font-size: 20px; font-weight: bold; margin-bottom: 10px; }
.detalle-mensaje { font-size: 16px; line-height: 1.6; }
.footer { margin-top: 50px; padding: 20px; border-top: 1px solid #ddd;
text-align: right; color: #666; font-size: 12px; }
.info-conexion { background-color: #e7f3ff; border-left: 4px solid #2196F3;
padding: 15px; margin: 20px 0; border-radius: 4px; }
</style>
<div class="contenedor">
<div class="info-conexion">
<strong>Intentando conectar a MySQL...</strong><br>
Servidor: localhost<br>
Base de datos: dbharbour<br>
Usuario: fivetech_test<br>
Puerto: 3306
</div>
${ cEstadoHtml }
</div>
<div class="footer">
<strong>Hix is Harbourix</strong><br>
Harbour Web Server<br>
Copyright ${ AllTrim( Str( nAnio ) ) } Charly Aubia
</div>
ENDTEXT
// Ausgabe
?? cHtml
RETURN NIL
?>
