差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
48th_8j1ham_rs [2026/08/25 20:55] Tana JH1HST48th_8j1ham_rs [2026/08/27 03:54] (現在) Tana JH1HST
行 1: 行 1:
 +~~NOCACHE~~
 +
 ====== 8J1HAM 会場公開運用 当選確認 ====== ====== 8J1HAM 会場公開運用 当選確認 ======
 +
 +第48回アマチュア無線フェスティバル ハムフェア2026
  
 特別記念局 **8J1HAM 会場公開運用**へ多数のお申し込みをいただき、ありがとうございました。 特別記念局 **8J1HAM 会場公開運用**へ多数のお申し込みをいただき、ありがとうございました。
  
-下の入力欄に、**お申し込み時に登録したコールサインまたはメールアドレス**を入力して、選結果をご確認ください。+下の入力欄に、**お申し込み時に登録したコールサインまたはメールアドレス**を入力して、選結果をご確認ください。
  
 体験運用でお申し込みの方など、コールサインを登録していない場合は、**お申し込み時のメールアドレス**を入力してください。 体験運用でお申し込みの方など、コールサインを登録していない場合は、**お申し込み時のメールアドレス**を入力してください。
行 34: 行 38:
     max-width: 760px;     max-width: 760px;
     margin: 20px 0;     margin: 20px 0;
-    padding: 0 0 0 12px;+    padding: 0 0 0 16px;
     box-sizing: border-box;     box-sizing: border-box;
     clear: both;     clear: both;
行 45: 行 49:
     border: 1px solid #d8dce2;     border: 1px solid #d8dce2;
     border-radius: 10px;     border-radius: 10px;
-    padding: 20px;+    padding: 20px 20px 20px 24px;
     margin: 20px 0;     margin: 20px 0;
 } }
  
-/* DokuWiki側のフォーム装飾を強制解除 */ 
 #hf-search-form { #hf-search-form {
     display: block !important;     display: block !important;
行 70: 行 73:
 #hf-search-form label { #hf-search-form label {
     display: block !important;     display: block !important;
-    margin: 0 0 8px 4px !important;+    margin: 0 0 8px 6px !important;
     padding: 0 !important;     padding: 0 !important;
     font-weight: bold !important;     font-weight: bold !important;
行 77: 行 80:
 #hf-search-form input[type="text"] { #hf-search-form input[type="text"] {
     display: block !important;     display: block !important;
-    width: calc(100% - 8px) !important; +    width: calc(100% - 12px) !important; 
-    max-width: calc(100% - 8px) !important;+    max-width: calc(100% - 12px) !important;
     height: auto !important;     height: auto !important;
     box-sizing: border-box !important;     box-sizing: border-box !important;
-    margin: 0 4px 12px 4px !important;+    margin: 0 6px 12px 6px !important;
     padding: 11px 12px !important;     padding: 11px 12px !important;
     border: 1px solid #999 !important;     border: 1px solid #999 !important;
行 92: 行 95:
     display: inline-block !important;     display: inline-block !important;
     width: auto !important;     width: auto !important;
-    margin: 0 0 0 4px !important;+    margin: 0 0 0 6px !important;
     padding: 11px 20px !important;     padding: 11px 20px !important;
     border: 0 !important;     border: 0 !important;
行 109: 行 112:
 #hf-search-help { #hf-search-help {
     display: block !important;     display: block !important;
-    margin: 10px 4px 4px !important;+    margin: 10px 6px 6px !important;
     padding: 0 !important;     padding: 0 !important;
     color: #666 !important;     color: #666 !important;
行 180: 行 183:
     color: #555;     color: #555;
     font-size: 1.15em;     font-size: 1.15em;
 +    font-weight: bold;
 +    margin-bottom: 12px;
 +}
 +
 +.hf-cancelled {
 +    width: 100%;
 +    box-sizing: border-box;
 +    margin: 24px 0;
 +    padding: 22px;
 +    background: #fff4e5;
 +    border: 2px solid #e0a24a;
 +    border-radius: 10px;
 +}
 +
 +.hf-cancelled-title {
 +    color: #b06000;
 +    font-size: 1.25em;
     font-weight: bold;     font-weight: bold;
     margin-bottom: 12px;     margin-bottom: 12px;
行 188: 行 208:
     box-sizing: border-box;     box-sizing: border-box;
     margin: 24px 0;     margin: 24px 0;
-    padding: 18px 18px 18px 22px;+    padding: 18px 18px 18px 24px;
     background: #fff8df;     background: #fff8df;
     border-left: 5px solid #d9a800;     border-left: 5px solid #d9a800;
行 197: 行 217:
     box-sizing: border-box;     box-sizing: border-box;
     margin: 24px 0;     margin: 24px 0;
-    padding: 18px 18px 18px 22px;+    padding: 18px 18px 18px 24px;
     background: #fff0f0;     background: #fff0f0;
     border-left: 5px solid #c62828;     border-left: 5px solid #c62828;
行 205: 行 225:
  
     #hf-result-wrap {     #hf-result-wrap {
-        padding-left: 6px;+        padding-left: 8px;
     }     }
  
     #hf-search-panel,     #hf-search-panel,
     .hf-winner,     .hf-winner,
-    .hf-not-selected {+    .hf-not-selected
 +    .hf-cancelled {
         padding: 16px;         padding: 16px;
     }     }
行 216: 行 237:
     #hf-search-form button {     #hf-search-form button {
         display: block !important;         display: block !important;
-        width: calc(100% - 8px) !important; +        width: calc(100% - 12px) !important; 
-        margin: 0 4px !important;+        margin: 0 6px !important;
     }     }
  
行 265: 行 286:
         </form>         </form>
  
-    </div>+        <script> 
 +        document.addEventListener("DOMContentLoaded", function () { 
 + 
 +            var input = document.getElementById("hf_lookup"); 
 + 
 +            if (!input) { 
 +                return; 
 +            } 
 + 
 +            input.addEventListener("input", function () { 
 + 
 +                this.value = this.value.normalize("NFKC"); 
 + 
 +            }); 
 + 
 +        }); 
 +        </script>
 '; ';
  
行 274: 行 311:
         : '';         : '';
  
-    /* +    if (function_exists('mb_convert_kana')) { 
-     * 許可する文字: +        $input = mb_convert_kana($input, 'as', 'UTF-8'); 
-     * 半角英数字 +    } 
-     * @ . _ % + - / + 
-     */ +    $input = strtr( 
-    if ( +        $input, 
-        $input !== '' +        array( 
-        && +            '@' => '@', 
-        !preg_match('/\A[A-Za-z0-9@._%+\/-]+\z/', $input+            '.' => '.', 
-    ) {+            '_' => '_', 
 +            '%' => '%', 
 +            '+' => '+', 
 +            '-' => '-', 
 +            'ー' => '-', 
 +            '/' => '/' 
 +        
 +    ); 
 + 
 +    if ($input === '') {
  
         echo '         echo '
         <div class="hf-not-found">         <div class="hf-not-found">
-            <strong>使用できない文字が含まれています。</strong><br> +            コールサインまたはメールアドレスを入力してください。
-            コールサインまたはメールアドレスを半角で入力してください。<br> +
-            使用できる記号は +
-            <strong>@ . _ % + - /</strong> +
-            です+
         </div>         </div>
         ';         ';
  
-    } elseif ($input === '') {+    } elseif (preg_match('/[^A-Za-z0-9@._%+\/-]/', $input=== 1) {
  
         echo '         echo '
         <div class="hf-not-found">         <div class="hf-not-found">
-            コールサインまたはメールアドレスを入力してください。+            <strong>使用できない文字が含まれています。</strong><br> 
 +            コールサインまたはメールアドレスを半角英数字で入力してください。
         </div>         </div>
         ';         ';
行 307: 行 350:
         echo '         echo '
         <div class="hf-error">         <div class="hf-error">
-            現在、選結果データを読み込むことができません。+            現在、選結果データを読み込むことができません。
             しばらくしてから再度お試しください。             しばらくしてから再度お試しください。
         </div>         </div>
行 326: 行 369:
             );             );
  
-            /* 
-             * コールサインは大文字小文字を区別しない。 
-             * メールアドレスも大文字小文字を区別しない。 
-             * どちらも完全一致。 
-             */ 
             $callsign_norm = strtoupper($input);             $callsign_norm = strtoupper($input);
             $email_norm    = strtolower($input);             $email_norm    = strtolower($input);
  
-            /* 
-             * まず申込情報が存在するか確認。 
-             */ 
             $stmt = $pdo->prepare(             $stmt = $pdo->prepare(
                 'SELECT applicant_id, callsign, email                 'SELECT applicant_id, callsign, email
行 344: 行 379:
             );             );
  
-            $stmt->execute(array( +            $stmt->execute( 
-                ':callsign' => $callsign_norm, +                array( 
-                ':email'    => $email_norm +                    ':callsign' => $callsign_norm, 
-            ));+                    ':email'    => $email_norm 
 +                ) 
 +            );
  
             $applicants = $stmt->fetchAll();             $applicants = $stmt->fetchAll();
行 368: 行 405:
                 }                 }
  
-                /* 
-                 * 一致した申込情報の中から当選結果を検索。 
-                 * 同じメールアドレスで複数申込がある場合にも対応。 
-                 */ 
                 $placeholders = implode(                 $placeholders = implode(
                     ',',                     ',',
行 387: 行 420:
                         band,                         band,
                         operation_type,                         operation_type,
-                        slot_type+                        slot_type
 +                        status
                      FROM results                      FROM results
                      WHERE applicant_id IN (' . $placeholders . ')                      WHERE applicant_id IN (' . $placeholders . ')
行 400: 行 434:
  
                     foreach ($results as $result) {                     foreach ($results as $result) {
 +
 +                        /*
 +                         * キャンセル済み
 +                         */
 +                        if (
 +                            isset($result['status'])
 +                            && $result['status'] === 'cancelled'
 +                        ) {
 +
 +                            $date_text = hf_date_jp($result['date']);
 +
 +                            $time_text =
 +                                $result['start_time']
 +                                . '~'
 +                                . $result['end_time'];
 +
 +                            echo '
 +                            <div class="hf-cancelled">
 +
 +                                <div class="hf-cancelled-title">
 +                                    この運用枠はキャンセル済みです。
 +                                </div>
 +
 +                                <table class="hf-result-table">
 +
 +                                    <tr>
 +                                        <th>日付</th>
 +                                        <th>時間</th>
 +                                        <th>バンド</th>
 +                                        <th>状態</th>
 +                                    </tr>
 +
 +                                    <tr>
 +
 +                                        <td>'
 +                                        . hf_h($date_text)
 +                                        . '</td>
 +
 +                                        <td>'
 +                                        . hf_h($time_text)
 +                                        . '</td>
 +
 +                                        <td>
 +                                            <strong>'
 +                                            . hf_h($result['band'])
 +                                            . '</strong>
 +                                        </td>
 +
 +                                        <td>
 +                                            <strong>キャンセル済み</strong>
 +                                        </td>
 +
 +                                    </tr>
 +
 +                                </table>
 +
 +                                <p>
 +                                    キャンセルとして受け付けています。
 +                                </p>
 +
 +                            </div>
 +                            ';
 +
 +                            continue;
 +                        }
  
                         $date_text = hf_date_jp($result['date']);                         $date_text = hf_date_jp($result['date']);
行 412: 行 511:
  
                             <div class="hf-winner-title">                             <div class="hf-winner-title">
-                                おめでとうございます。選の結果、当選しました。+                                おめでとうございます。選の結果、当選しました。
                             </div>                             </div>
  
                             <table class="hf-result-table">                             <table class="hf-result-table">
 +
                                 <tr>                                 <tr>
                                     <th>日付</th>                                     <th>日付</th>
行 424: 行 524:
  
                                 <tr>                                 <tr>
 +
                                     <td>'                                     <td>'
                                     . hf_h($date_text)                                     . hf_h($date_text)
行 441: 行 542:
                                         当選                                         当選
                                     </td>                                     </td>
 +
                                 </tr>                                 </tr>
 +
                             </table>                             </table>
                         ';                         ';
  
-                        /* 
-                         * 通常運用者はコールサインを表示。 
-                         */ 
                         if (!empty($result['callsign'])) {                         if (!empty($result['callsign'])) {
  
行 461: 行 561:
                         } else {                         } else {
  
-                            /* +                            $email = $result['email']; 
-                             * 体験運用などコールサインがない場合。 + 
-                             メールアドレスそのものは再表示しない。 +                            $parts = explode('@', $email, 2); 
-                             */+ 
 +                            if (count($parts) === 2) { 
 + 
 +                                $local  = $parts[0]; 
 +                                $domain = $parts[1]; 
 + 
 +                                if ($local !== '') { 
 +                                    $masked = 
 +                                        substr($local, 0, 1) 
 +                                        . '***@' 
 +                                        . $domain; 
 +                                } else { 
 +                                    $masked = '***@' . $domain; 
 +                                } 
 + 
 +                            } else { 
 + 
 +                                $masked = $email; 
 +                            } 
                             echo '                             echo '
                             <p>                             <p>
-                                お申し込み時のメールアドレスで確認しました。+                                登録メールアドレス: 
 +                                <strong>' 
 +                                . hf_h($masked) 
 +                                . '</strong>
                             </p>                             </p>
                             ';                             ';
                         }                         }
  
-                        /* 
-                         * 体験運用扱いの場合だけ表示。 
-                         */ 
                         if (                         if (
                             $result['operation_type'] === '体験運用'                             $result['operation_type'] === '体験運用'
行 491: 行 610:
                         echo '                         echo '
                             <div class="hf-guide">                             <div class="hf-guide">
 +
                                 <strong>                                 <strong>
                                     当選された方は、当日までに必ず以下のガイドをご確認ください。                                     当選された方は、当日までに必ず以下のガイドをご確認ください。
行 504: 行 624:
                                     8J1HAM 会場公開運用 当選者向けガイド                                     8J1HAM 会場公開運用 当選者向けガイド
                                 </a>                                 </a>
 +
                             </div>                             </div>
  
行 516: 行 637:
  
                         <div class="hf-not-selected-title">                         <div class="hf-not-selected-title">
-                            厳正なる選の結果、今回は残念ながら運用枠をご用意することができませんでした。+                            厳正なる選の結果、今回は残念ながら運用枠をご用意することができませんでした。
                         </div>                         </div>
  
行 530: 行 651:
         } catch (Exception $e) {         } catch (Exception $e) {
  
-            /* 
-             * DB内部の情報は公開画面には表示しない。 
-             */ 
             echo '             echo '
             <div class="hf-error">             <div class="hf-error">
-                選結果の確認中にエラーが発生しました。+                選結果の確認中にエラーが発生しました。
                 しばらくしてから再度お試しください。                 しばらくしてから再度お試しください。
             </div>             </div>
  • 48th_8j1ham_rs.1787658911.txt.gz
  • 最終更新: 2026/08/25 20:55
  • by Tana JH1HST