<?php
// sitemap.php - 在庫中の商品をDBから読み出してXMLサイトマップを出力する
// PHP 8.x 対応。$dbh が PDO / mysqli のどちらでも動作する。

ob_start();
require_once('/home/hybridguitar/hybridguitars.com/include/setup.php');

$base = 'https://www.hybridguitars.com';

$static_pages = [
    '/',
    '/products.php',
    '/riyou.html',
    '/shop-infomation.html',
    '/mail/mailform/question',
    '/kaitori.html',
];

$sql = "SELECT DISTINCT item_code FROM item
        WHERE amount <> '9'
        ORDER BY item_code DESC
        LIMIT 49000";

function sm_fail($msg) {
    while (ob_get_level() > 0) { ob_end_clean(); }
    http_response_code(500);
    header('Content-Type: text/plain; charset=UTF-8');
    error_log('sitemap.php: ' . $msg);
    echo 'sitemap error';
    exit;
}

$codes = [];
try {
    if (isset($dbh) && $dbh instanceof PDO) {
        $codes = $dbh->query($sql)->fetchAll(PDO::FETCH_COLUMN);
    } elseif (isset($dbh) && $dbh instanceof mysqli) {
        $res = $dbh->query($sql);
        if ($res === false) { throw new Exception($dbh->error); }
        while ($row = $res->fetch_row()) { $codes[] = $row[0]; }
        $res->free();
    } else {
        throw new Exception('Unsupported or missing $dbh');
    }
} catch (Throwable $e) {
    sm_fail($e->getMessage());
}

function sm_loc($url) {
    return "<url>\n  <loc>" . htmlspecialchars($url, ENT_XML1 | ENT_QUOTES, 'UTF-8') . "</loc>\n</url>\n";
}

$xml  = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($static_pages as $path) { $xml .= sm_loc($base . $path); }
foreach ($codes as $code)        { $xml .= sm_loc($base . '/item.php?code=' . rawurlencode((string)$code)); }
$xml .= "</urlset>\n";

// setup.php が出力した内容やバッファを全て破棄してから、XMLだけを出力する
while (ob_get_level() > 0) { ob_end_clean(); }
header_remove('Content-Type');
header('Content-Type: application/xml; charset=UTF-8');
echo $xml;
exit;