Собрать настоящий HTML-каталог по проверенным колонкам

Ответы получены от MySQL через X Protocol. Созданные программой учебные объекты после чтения удалены.

Наблюдаемый результат программы
НаблюдениеРезультат
Товаров в HTML2
Название первого товараЛампа <script> & свет
Цена без float12,30
Нулевая цена0,00
Нулевой остаток0
SQL NULL— (нет значения)
Пустой текст(пустая строка)
HTML-символы выведены текстомда
Полезный файлreport.html
Строки и дополнительные наблюдения
{
    "metadata": [
        {
            "class": "mysql_xdevapi\\ColumnResult",
            "label": "product_name",
            "name": "name",
            "table_label": "p",
            "table_name": "mysql142_report_8cfda5edb490",
            "schema": "php_manual_x139",
            "type": 21,
            "length": 320,
            "fractional_digits": 0,
            "signed": false,
            "padded": false,
            "charset": "utf8mb4",
            "collation": "utf8mb4_bin"
        },
        {
            "class": "mysql_xdevapi\\ColumnResult",
            "label": "unit_price",
            "name": "price",
            "table_label": "p",
            "table_name": "mysql142_report_8cfda5edb490",
            "schema": "php_manual_x139",
            "type": 0,
            "length": 12,
            "fractional_digits": 2,
            "signed": true,
            "padded": false,
            "charset": null,
            "collation": null
        },
        {
            "class": "mysql_xdevapi\\ColumnResult",
            "label": "stock",
            "name": "stock",
            "table_label": "p",
            "table_name": "mysql142_report_8cfda5edb490",
            "schema": "php_manual_x139",
            "type": 19,
            "length": 10,
            "fractional_digits": 0,
            "signed": false,
            "padded": false,
            "charset": null,
            "collation": null
        },
        {
            "class": "mysql_xdevapi\\ColumnResult",
            "label": "note",
            "name": "note",
            "table_label": "p",
            "table_name": "mysql142_report_8cfda5edb490",
            "schema": "php_manual_x139",
            "type": 21,
            "length": 160,
            "fractional_digits": 0,
            "signed": false,
            "padded": false,
            "charset": "utf8mb4",
            "collation": "utf8mb4_0900_ai_ci"
        }
    ],
    "column_names": [
        "product_name",
        "unit_price",
        "stock",
        "note"
    ],
    "raw_rows": [
        {
            "product_name": "Лампа <script> & свет",
            "unit_price": "12.30",
            "stock": 4,
            "note": null
        },
        {
            "product_name": "Кабель",
            "unit_price": "0.00",
            "stock": 0,
            "note": ""
        }
    ],
    "report_columns": [
        "Товар",
        "Цена, руб.",
        "Остаток",
        "Примечание"
    ],
    "report_rows": [
        [
            "Лампа <script> & свет",
            "12,30",
            "4",
            "— (нет значения)"
        ],
        [
            "Кабель",
            "0,00",
            "0",
            "(пустая строка)"
        ]
    ],
    "report_file": "report.html"
}

Полный JSON результата, включая реальные идентификаторы, сохранён рядом в result.json.