Initial commit: 교육 프로젝트 배포

This commit is contained in:
송대일
2026-07-01 18:32:42 +09:00
commit be6dccd120
1483 changed files with 5082202 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
<?php
$pdo = new PDO('mysql:host=baroncs.co.kr;port=3306;dbname=baronhomep;charset=utf8mb4','baronhomep','baron3840!!');
echo "=== edu_contents category_code 현황 ===\n";
$rows = $pdo->query("SELECT content_id, category_code, category_group, title FROM edu_contents ORDER BY content_id")->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $r) {
echo $r['content_id'].' | cat='.$r['category_code'].' | grp='.$r['category_group'].' | '.$r['title']."\n";
}
echo "\n=== edu_content_keywords 현황 (첫 20개) ===\n";
$rows2 = $pdo->query("SELECT content_id, keyword_code FROM edu_content_keywords ORDER BY content_id LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
foreach($rows2 as $r) echo $r['content_id'].' | '.$r['keyword_code']."\n";
+9
View File
@@ -0,0 +1,9 @@
<?php
$pdo = new PDO('mysql:host=baroncs.co.kr;port=3306;dbname=baronhomep;charset=utf8mb4','baronhomep','baron3840!!');
echo "=== content_url & thumbnail_url 현황 ===\n";
$rows = $pdo->query("SELECT content_id, content_url, thumbnail_url, is_active, is_offer FROM edu_contents ORDER BY content_id")->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $r) {
echo sprintf("%-20s | is_offer=%-2s | is_active=%-2s | url=%-40s | thumb=%s\n",
$r['content_id'], $r['is_offer'], $r['is_active'], $r['content_url'], $r['thumbnail_url']
);
}
+28
View File
@@ -0,0 +1,28 @@
<?php
try {
$pdo = new PDO('mysql:host=baroncs.co.kr;port=3306;dbname=baronhomep;charset=utf8mb4', 'baronhomep', 'baron3840!!', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
echo "=== edu_contents ===" . PHP_EOL;
$rows = $pdo->query('SELECT content_id, category_code, title, is_active, is_offer FROM edu_contents ORDER BY content_id')->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) echo implode(' | ', $r) . PHP_EOL;
echo PHP_EOL . "=== edu_codes (KW100) ===" . PHP_EOL;
$kws = $pdo->query("SELECT code, code_name FROM edu_codes WHERE group_code='KW100' ORDER BY code")->fetchAll(PDO::FETCH_ASSOC);
foreach ($kws as $r) echo implode(' | ', $r) . PHP_EOL;
echo PHP_EOL . "=== edu_content_keywords (현재) ===" . PHP_EOL;
$ck = $pdo->query('SELECT content_id, keyword_code FROM edu_content_keywords ORDER BY content_id, keyword_code')->fetchAll(PDO::FETCH_ASSOC);
echo count($ck) . ' rows' . PHP_EOL;
foreach ($ck as $r) echo implode(' | ', $r) . PHP_EOL;
echo PHP_EOL . "=== edu_user_keywords ===" . PHP_EOL;
$uk = $pdo->query('SELECT member_id, keyword_code, keyword_name FROM edu_user_keywords ORDER BY member_id')->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($uk, JSON_UNESCAPED_UNICODE) . PHP_EOL;
echo PHP_EOL . "=== edu_recommend_keywords ===" . PHP_EOL;
$rk = $pdo->query('SELECT sys_comp_code, keyword_code, is_active FROM edu_recommend_keywords')->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rk, JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . PHP_EOL;
}
@@ -0,0 +1,90 @@
<?php
/**
* 마이클래스 데이터 연결 진단
*/
header('Content-Type: text/html; charset=utf-8');
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
echo '<h1>마이클래스 데이터 연결 진단</h1>';
echo '<style>
body { font-family: Arial; margin: 20px; }
table { border-collapse: collapse; margin: 20px 0; width: 100%; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
th { background: #f0f0f0; }
.ok { color: green; }
.err { color: red; }
.warn { color: orange; }
</style>';
// 1. edu_learning_goals 현황
echo '<h2>1. 학습목표 현황 (edu_learning_goals)</h2>';
$goals = $pdo->query("SELECT * FROM edu_learning_goals ORDER BY goal_code")->fetchAll();
echo '<table><tr><th>goal_code</th><th>title</th><th>quarter</th><th>is_active</th></tr>';
foreach ($goals as $g) {
echo "<tr><td>{$g['goal_code']}</td><td>{$g['title']}</td><td>{$g['quarter']}</td><td>{$g['is_active']}</td></tr>";
}
echo '</table>';
echo "<p>총 {$goals} 개 목표</p>";
// 2. edu_contents 샘플 (영상 리스트)
echo '<h2>2. 콘텐츠 현황 (edu_contents)</h2>';
$contents = $pdo->query("SELECT * FROM edu_contents LIMIT 20")->fetchAll();
echo '<table><tr><th>content_id</th><th>title</th><th>category_group</th><th>content_url</th></tr>';
foreach ($contents as $c) {
echo "<tr><td>{$c['content_id']}</td><td>{$c['title']}</td><td>{$c['category_group']}</td><td>" . substr($c['content_url'], 0, 50) . "...</td></tr>";
}
echo '</table>';
echo "<p>총 " . $pdo->query("SELECT COUNT(*) FROM edu_contents")->fetchColumn() . " 개 영상</p>";
// 3. edu_goal_contents 현황
echo '<h2>3. 목표-콘텐츠 매핑 현황 (edu_goal_contents)</h2>';
$goalContents = $pdo->query("SELECT COUNT(*) FROM edu_goal_contents")->fetchColumn();
if ($goalContents > 0) {
$rows = $pdo->query("SELECT * FROM edu_goal_contents LIMIT 20")->fetchAll();
echo '<table><tr><th>goal_code</th><th>content_id</th><th>sort_order</th><th>is_active</th></tr>';
foreach ($rows as $r) {
echo "<tr><td>{$r['goal_code']}</td><td>{$r['content_id']}</td><td>{$r['sort_order']}</td><td>{$r['is_active']}</td></tr>";
}
echo '</table>';
} else {
echo '<p class="warn">⚠ 데이터 없음 - 맵핑이 필요합니다</p>';
}
// 4. edu_user_learning_goals 현황
echo '<h2>4. 사용자 목표 선택 (edu_user_learning_goals)</h2>';
$userGoals = $pdo->query("SELECT COUNT(*) FROM edu_user_learning_goals")->fetchColumn();
if ($userGoals > 0) {
$rows = $pdo->query("SELECT * FROM edu_user_learning_goals LIMIT 20")->fetchAll();
echo '<table><tr><th>member_id</th><th>goal_code</th><th>quarter</th><th>selected_at</th></tr>';
foreach ($rows as $r) {
echo "<tr><td>{$r['member_id']}</td><td>{$r['goal_code']}</td><td>{$r['quarter']}</td><td>{$r['selected_at']}</td></tr>";
}
echo '</table>';
} else {
echo '<p class="warn">⚠ 데이터 없음 - 사용자가 아직 목표를 선택하지 않았습니다</p>';
}
// 5. 액션 아이템
echo '<h2>5. 필요한 작업</h2>';
echo '<ol>';
echo '<li>✗ edu_goal_contents에 goal_code ↔ content_id 맵핑 데이터 INSERT</li>';
echo '<li>✓ myclass_list.php: 사용자 선택 목표 조회 로직</li>';
echo '<li>✓ myclass_list.php: edu_goal_contents에서 6개 영상 조회 로직</li>';
echo '<li>✓ goal-layer.php: 목표 선택 모달 이벤트 처리</li>';
echo '<li>✓ 새 API 또는 기존 API: 목표 선택 저장 (edu_user_learning_goals)</li>';
echo '</ol>';
// 6. 권장 맵핑 규칙
echo '<h2>6. 맵핑 규칙 (제안)</h2>';
echo '<pre>';
echo "각 goal_code마다 6개의 content_id 할당:
- 2026-001: content_id 1~6
- 2026-002: content_id 7~12
- 2026-003: content_id 13~18
- ...등등 (content_id가 있는 범위 내에서 균등 분배)
또는 현재 content_id 수에 따라 동적으로 분배
";
echo '</pre>';
?>
+14
View File
@@ -0,0 +1,14 @@
<?php
try {
$pdo = new PDO('mysql:host=baroncs.co.kr;port=3306;dbname=baronhomep;charset=utf8mb4', 'baronhomep', 'baron3840!!', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$rows = $pdo->query('SELECT group_code, code, code_name, is_active FROM edu_codes ORDER BY group_code, code')->fetchAll(PDO::FETCH_ASSOC);
echo count($rows) . ' rows' . PHP_EOL;
foreach ($rows as $r) {
echo implode(' | ', $r) . PHP_EOL;
}
echo PHP_EOL . '--- SHOW TABLES ---' . PHP_EOL;
$tables = $pdo->query('SHOW TABLES LIKE "edu_%"')->fetchAll(PDO::FETCH_COLUMN);
foreach ($tables as $t) echo $t . PHP_EOL;
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . PHP_EOL;
}
@@ -0,0 +1,28 @@
<?php
require_once __DIR__ . '/db_conn.php';
header('Content-Type: text/plain; charset=utf-8');
$pdo = db_conn();
$sql = "SELECT rg.goal_code,
rg.seq,
rg.title AS rg_title,
rg.description AS rg_desc,
c.sort_order,
c.title AS c_title,
c.description AS c_desc
FROM edu_recommended_goals rg
LEFT JOIN edu_contents c
ON c.goal_code = rg.goal_code
AND c.sort_order = rg.seq
AND c.is_active = '1'
WHERE rg.is_active = '1'
ORDER BY rg.goal_code ASC, rg.seq ASC";
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
echo ($r['goal_code'] ?? '') . '#' . ($r['seq'] ?? '')
. ' | rg_title=' . ($r['rg_title'] ?? '')
. ' | rg_desc=' . ($r['rg_desc'] ?? '')
. ' | c_title=' . ($r['c_title'] ?? '')
. ' | c_desc=' . ($r['c_desc'] ?? '')
. PHP_EOL;
}
@@ -0,0 +1,44 @@
<?php
require_once __DIR__ . '/db_conn.php';
header('Content-Type: text/plain; charset=utf-8');
$year = date('Y');
$pdo = db_conn();
$sql = "SELECT content_id, goal_code, title, description, description1, description2, sort_order, base_year, category_code, category_group, updated_at
FROM edu_contents
WHERE is_active = '1'
AND category_code = 'CA10001'
AND category_group = 'CA200Q01'
AND sort_order = 1
AND base_year = ?
ORDER BY goal_code ASC";
$st = $pdo->prepare($sql);
$st->execute([$year]);
$rows = $st->fetchAll(PDO::FETCH_ASSOC);
echo "[CURRENT QUERY ROWS] count=" . count($rows) . "\n";
foreach ($rows as $r) {
echo ($r['goal_code'] ?? '') . " | title=" . ($r['title'] ?? '')
. " | description=" . ($r['description'] ?? '')
. " | description1=" . ($r['description1'] ?? '')
. " | description2=" . ($r['description2'] ?? '')
. " | content_id=" . ($r['content_id'] ?? '')
. "\n";
}
echo "\n[ALL GOAL ROWS SAMPLE]\n";
$rows2 = $pdo->query("SELECT goal_code, sort_order, title, description, description1, description2, content_id
FROM edu_contents
WHERE is_active='1' AND category_code='CA10001' AND category_group='CA200Q01'
ORDER BY goal_code ASC, sort_order ASC, content_id ASC
LIMIT 40")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows2 as $r) {
echo ($r['goal_code'] ?? '') . "#" . ($r['sort_order'] ?? '')
. " | t=" . ($r['title'] ?? '')
. " | d=" . ($r['description'] ?? '')
. " | d1=" . ($r['description1'] ?? '')
. " | d2=" . ($r['description2'] ?? '')
. " | id=" . ($r['content_id'] ?? '')
. "\n";
}
+124
View File
@@ -0,0 +1,124 @@
<?php
/**
* _tmp_index_diag.php — index.php 영상 로딩 진단
* 확인 후 삭제할 임시 파일
*/
header('Content-Type: text/html; charset=utf-8');
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
echo '<h2>EDU 인덱스 영상 로딩 진단</h2>';
echo '<style>table{border-collapse:collapse;margin:10px 0} td,th{border:1px solid #ccc;padding:4px 8px} .ok{color:green} .err{color:red} .warn{color:orange}</style>';
// 1. 테이블 목록 확인
echo '<h3>1. 관련 테이블 존재 여부</h3>';
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
$checkTables = ['edu_contents','edu_content_keywords','edu_keywords','edu_users','edu_user_keywords','edu_codes'];
echo '<table><tr><th>테이블명</th><th>존재</th><th>레코드 수</th></tr>';
foreach ($checkTables as $tbl) {
$exists = in_array($tbl, $tables);
$count = 0;
if ($exists) {
$count = $pdo->query("SELECT COUNT(*) FROM `$tbl`")->fetchColumn();
}
$cls = $exists ? 'ok' : 'err';
echo "<tr><td>$tbl</td><td class='$cls'>" . ($exists ? '✔' : '✘ 없음') . "</td><td>$count</td></tr>";
}
echo '</table>';
// 2. edu_contents 컬럼 구조
echo '<h3>2. edu_contents 컬럼 구조</h3>';
if (in_array('edu_contents', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_contents")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th><th>Null</th><th>Key</th><th>Default</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td><td>{$c['Null']}</td><td>{$c['Key']}</td><td>{$c['Default']}</td></tr>";
}
echo '</table>';
// 샘플 데이터 3건
echo '<h3>2-1. edu_contents 샘플 (최대 5건)</h3>';
$rows = $pdo->query("SELECT * FROM edu_contents LIMIT 5")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="err">⚠ edu_contents 에 데이터가 없습니다 (DB 초기화됨)</p>';
}
} else {
echo '<p class="err">edu_contents 테이블이 존재하지 않습니다.</p>';
}
// 3. edu_content_keywords 구조 & 샘플
echo '<h3>3. edu_content_keywords (키워드-콘텐츠 매핑)</h3>';
if (in_array('edu_content_keywords', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_content_keywords")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
$rows = $pdo->query("SELECT * FROM edu_content_keywords LIMIT 5")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">edu_content_keywords 에 데이터가 없습니다.</p>';
}
} else {
echo '<p class="warn">edu_content_keywords 테이블이 없습니다.</p>';
}
// 4. edu_keywords 구조 & 샘플
echo '<h3>4. edu_keywords</h3>';
if (in_array('edu_keywords', $tables)) {
$rows = $pdo->query("SELECT * FROM edu_keywords LIMIT 10")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">edu_keywords 에 데이터가 없습니다.</p>';
}
} else {
echo '<p class="warn">edu_keywords 테이블이 없습니다.</p>';
}
// 5. edu_user_keywords (유저-키워드 연결)
echo '<h3>5. edu_user_keywords</h3>';
if (in_array('edu_user_keywords', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_user_keywords")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
$rows = $pdo->query("SELECT * FROM edu_user_keywords LIMIT 10")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">edu_user_keywords 에 데이터가 없습니다.</p>';
}
} else {
echo '<p class="warn">edu_user_keywords 테이블이 없습니다.</p>';
}
// 6. 전체 테이블 목록
echo '<h3>6. DB 전체 테이블 목록 (' . count($tables) . '개)</h3>';
echo '<ul>' . implode('', array_map(fn($t) => "<li>$t</li>", $tables)) . '</ul>';
+160
View File
@@ -0,0 +1,160 @@
<?php
/**
* _tmp_index_diag2.php — 키워드 상세 진단 (edu_keywords 복원용)
*/
header('Content-Type: text/html; charset=utf-8');
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
echo '<h2>EDU 키워드 상세 진단</h2>';
echo '<style>table{border-collapse:collapse;margin:10px 0} td,th{border:1px solid #ccc;padding:4px 8px} .ok{color:green} .err{color:red} .warn{color:orange} pre{background:#f5f5f5;padding:8px;font-size:12px}</style>';
// 1. edu_content_keywords 전체 unique keyword_code 목록
echo '<h3>1. edu_content_keywords - 전체 unique keyword_code</h3>';
$rows = $pdo->query("
SELECT keyword_code, COUNT(*) as cnt
FROM edu_content_keywords
WHERE is_active = '1' OR is_active IS NULL
GROUP BY keyword_code
ORDER BY keyword_code
")->fetchAll();
echo '<table><tr><th>keyword_code</th><th>연결 콘텐츠 수</th></tr>';
foreach ($rows as $r) {
echo "<tr><td>{$r['keyword_code']}</td><td>{$r['cnt']}</td></tr>";
}
echo '</table>';
// 2. edu_recommend_keywords 구조 및 데이터
echo '<h3>2. edu_recommend_keywords 구조 및 데이터</h3>';
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
if (in_array('edu_recommend_keywords', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_recommend_keywords")->fetchAll();
echo '<b>컬럼:</b><br><table><tr><th>Field</th><th>Type</th><th>Key</th><th>Default</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td><td>{$c['Key']}</td><td>{$c['Default']}</td></tr>";
}
echo '</table>';
$rows = $pdo->query("SELECT * FROM edu_recommend_keywords LIMIT 20")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">데이터 없음</p>';
}
} else {
echo '<p class="err">테이블 없음</p>';
}
// 3. edu_user_keywords 전체 데이터
echo '<h3>3. edu_user_keywords 전체</h3>';
$rows = $pdo->query("SELECT * FROM edu_user_keywords ORDER BY member_id, keyword_code")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">데이터 없음</p>';
}
// 4. edu_codes 에서 KW 계열 코드 확인
echo '<h3>4. edu_codes - KW 계열 코드 (keyword 관련)</h3>';
$rows = $pdo->query("
SELECT * FROM edu_codes
WHERE base_code LIKE 'KW%'
ORDER BY base_code
")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">KW 계열 코드 없음</p>';
// edu_codes 전체 구조 확인
$cols = $pdo->query("SHOW COLUMNS FROM edu_codes")->fetchAll();
echo '<b>edu_codes 컬럼:</b><table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
// 샘플 10건
$sample = $pdo->query("SELECT * FROM edu_codes LIMIT 20")->fetchAll();
if ($sample) {
$keys = array_keys($sample[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($sample as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
}
}
// 5. edu_code_group 구조 확인
echo '<h3>5. edu_code_group</h3>';
if (in_array('edu_code_group', $tables)) {
$rows = $pdo->query("SELECT * FROM edu_code_group LIMIT 20")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
}
}
// 6. edu_contents 에서 keyword 관련 컬럼 값 샘플
echo '<h3>6. edu_contents - category 관련 고유값</h3>';
$rows = $pdo->query("
SELECT category_code, category_group, COUNT(*) as cnt
FROM edu_contents
GROUP BY category_code, category_group
ORDER BY category_group, category_code
")->fetchAll();
echo '<table><tr><th>category_code</th><th>category_group</th><th>콘텐츠 수</th></tr>';
foreach ($rows as $r) {
echo "<tr><td>{$r['category_code']}</td><td>{$r['category_group']}</td><td>{$r['cnt']}</td></tr>";
}
echo '</table>';
// 7. edu_contents 중 keyword 연결된 영상 샘플 (edu_content_keywords join)
echo '<h3>7. edu_content_keywords ↔ edu_contents 조인 샘플</h3>';
$rows = $pdo->query("
SELECT ck.keyword_code, c.content_id, c.title, c.category_group, c.content_url
FROM edu_content_keywords ck
JOIN edu_contents c ON c.content_id = ck.content_id
WHERE ck.is_active = '1'
ORDER BY ck.keyword_code, c.content_id
LIMIT 20
")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="warn">결과 없음</p>';
}
// 8. index.php 에서 사용하는 main_data 관련 api 로그 (있으면)
echo '<h3>8. API 관련 파일 목록 확인</h3>';
$apiDir = __DIR__ . '/api/';
if (is_dir($apiDir)) {
foreach (scandir($apiDir) as $f) {
if ($f === '.' || $f === '..') continue;
$fpath = $apiDir . $f;
$size = filesize($fpath);
echo "<li><b>$f</b> ({$size}bytes)</li>";
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
/**
* _tmp_index_diag3.php — API 파일 내용 + main_data 구조 진단
*/
header('Content-Type: text/html; charset=utf-8');
echo '<h2>API 파일 내용 진단</h2>';
echo '<style>pre{background:#f5f5f5;padding:10px;font-size:11px;overflow:auto;white-space:pre-wrap;word-break:break-all;border:1px solid #ddd;max-height:600px} h3{margin-top:20px;color:#333}</style>';
$base = __DIR__;
$files = [
'api/videos_by_keywords.php',
'api/user_keywords.php',
'main_data.php',
'main_data_260316_1420.php',
'main_data_moon.php',
'../skin/index.php',
'../skin/index_over.php',
'../skin/index_moon.php',
'../skin/index_guide.php',
'../skin/_backup/index.php',
'../skin/_backup/keyword.php',
];
foreach ($files as $f) {
$full = realpath($base . '/' . $f);
echo "<h3>$f</h3>";
if (!$full || !file_exists($full)) {
echo '<p style="color:red">파일 없음 또는 접근 불가</p>';
continue;
}
$size = filesize($full);
if ($size === 0) {
echo '<p style="color:orange">파일 크기 0 (empty)</p>';
continue;
}
echo "<p>크기: {$size} bytes</p>";
echo '<pre>' . htmlspecialchars(file_get_contents($full)) . '</pre>';
}
+22
View File
@@ -0,0 +1,22 @@
<?php
try {
$pdo = new PDO('mysql:host=baroncs.co.kr;port=3306;dbname=baronhomep;charset=utf8mb4', 'baronhomep', 'baron3840!!', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec("SET NAMES utf8mb4");
$sql = file_get_contents(__DIR__ . '/../sample_content_keywords.sql');
$pdo->exec($sql);
$cnt = $pdo->query('SELECT COUNT(*) FROM edu_content_keywords')->fetchColumn();
echo json_encode(['status' => 'ok', 'inserted_total' => (int)$cnt], JSON_UNESCAPED_UNICODE) . PHP_EOL;
// 키워드별 매핑 건수 확인
$rows = $pdo->query('SELECT keyword_code, COUNT(*) as cnt FROM edu_content_keywords GROUP BY keyword_code ORDER BY cnt DESC')->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows, JSON_UNESCAPED_UNICODE) . PHP_EOL;
// recommend_keywords 확인
$rk = $pdo->query('SELECT * FROM edu_recommend_keywords')->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rk, JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Exception $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()], JSON_UNESCAPED_UNICODE) . PHP_EOL;
}
+26
View File
@@ -0,0 +1,26 @@
<?php
require __DIR__ . '/db_conn.php';
$pdo = db_conn();
$existsStmt = $pdo->prepare("SELECT base_code, code, code_name FROM edu_codes WHERE group_code='KW100' AND code_name = ? LIMIT 1");
$existsStmt->execute(['자기개발']);
$exists = $existsStmt->fetch(PDO::FETCH_ASSOC);
if ($exists) {
echo "EXISTS|{$exists['base_code']}|{$exists['code']}|{$exists['code_name']}\n";
} else {
$nextCode = (int)$pdo->query("SELECT COALESCE(MAX(CAST(code AS UNSIGNED)), 0) FROM edu_codes WHERE group_code='KW100'")->fetchColumn() + 1;
$code = str_pad((string)$nextCode, 2, '0', STR_PAD_LEFT);
$baseCode = 'KW100' . $code;
$ins = $pdo->prepare("INSERT INTO edu_codes (group_code, code, base_code, code_name, is_active, created_by, created_at, updated_by, updated_at) VALUES ('KW100', ?, ?, ?, '1', 'admin', NOW(), 'admin', NOW())");
$ins->execute([$code, $baseCode, '자기개발']);
echo "INSERTED|{$baseCode}|{$code}|자기개발\n";
}
$rows = $pdo->query("SELECT code, base_code, code_name FROM edu_codes WHERE group_code='KW100' ORDER BY CAST(code AS UNSIGNED)")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
echo "ROW|{$r['code']}|{$r['base_code']}|{$r['code_name']}\n";
}
@@ -0,0 +1,21 @@
<?php
require_once __DIR__ . '/db_conn.php';
header('Content-Type: text/plain; charset=utf-8');
$pdo = db_conn();
echo "[COLUMNS]\n";
$cols = $pdo->query('SHOW COLUMNS FROM edu_learning_goals')->fetchAll(PDO::FETCH_ASSOC);
foreach ($cols as $c) {
echo $c['Field'] . '|' . $c['Type'] . PHP_EOL;
}
echo "\n[SAMPLES]\n";
$rows = $pdo->query('SELECT * FROM edu_learning_goals ORDER BY 1 ASC LIMIT 20')->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
$pairs = [];
foreach ($r as $k => $v) {
$pairs[] = $k . '=' . str_replace(["\r", "\n"], ' ', (string)$v);
}
echo implode(' | ', $pairs) . PHP_EOL;
}
@@ -0,0 +1,29 @@
<?php
require_once __DIR__ . '/db_conn.php';
header('Content-Type: text/plain; charset=utf-8');
$pdo = db_conn();
echo "[COLUMNS]\n";
$cols = $pdo->query('SHOW COLUMNS FROM edu_contents')->fetchAll(PDO::FETCH_ASSOC);
foreach ($cols as $c) {
echo $c['Field'] . '|' . $c['Type'] . PHP_EOL;
}
echo "\n[SAMPLES_WITH_DESC]\n";
$rows = $pdo->query("SELECT content_id, title, description, goal_code, category_group, category_code, sort_order, is_active
FROM edu_contents
WHERE is_active = '1' AND CHAR_LENGTH(TRIM(COALESCE(description, ''))) >= 5
ORDER BY updated_at DESC, created_at DESC
LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
$id = isset($r['content_id']) ? (string)$r['content_id'] : '';
$title = isset($r['title']) ? (string)$r['title'] : '';
$desc = isset($r['description']) ? (string)$r['description'] : '';
$goal = isset($r['goal_code']) ? (string)$r['goal_code'] : '';
$group = isset($r['category_group']) ? (string)$r['category_group'] : '';
$cate = isset($r['category_code']) ? (string)$r['category_code'] : '';
$sort = isset($r['sort_order']) ? (string)$r['sort_order'] : '';
$active = isset($r['is_active']) ? (string)$r['is_active'] : '';
echo $id . '|' . $title . '|' . preg_replace('/\s+/', ' ', $desc) . '|goal=' . $goal . '|group=' . $group . '|cate=' . $cate . '|sort=' . $sort . '|active=' . $active . PHP_EOL;
}
+161
View File
@@ -0,0 +1,161 @@
<?php
/**
* 마이클래스 구조 진단 파일
* edu_learning_goals와 edu_goal_contents 구조 파악
*/
header('Content-Type: text/html; charset=utf-8');
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
echo '<h1>마이클래스 데이터베이스 구조</h1>';
echo '<style>
body { font-family: Arial; margin: 20px; }
table { border-collapse: collapse; margin: 20px 0; width: 100%; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
th { background: #f0f0f0; }
.ok { color: green; }
.err { color: red; }
h2 { margin-top: 30px; }
</style>';
// 1. 모든 테이블 목록
echo '<h2>1. 전체 테이블 목록</h2>';
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
echo '<table><tr><th>테이블명</th></tr>';
foreach ($tables as $t) {
echo "<tr><td>$t</td></tr>";
}
echo '</table>';
// 2. edu_learning_goals 확인
echo '<h2>2. edu_learning_goals 테이블</h2>';
if (in_array('edu_learning_goals', $tables)) {
echo '<b>컬럼 구조:</b>';
$cols = $pdo->query("SHOW COLUMNS FROM edu_learning_goals")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th><th>Null</th><th>Key</th><th>Default</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td><td>{$c['Null']}</td><td>{$c['Key']}</td><td>{$c['Default']}</td></tr>";
}
echo '</table>';
echo '<b>샘플 데이터:</b>';
$rows = $pdo->query("SELECT * FROM edu_learning_goals LIMIT 10")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
} else {
echo '<p class="err">데이터 없음</p>';
}
} else {
echo '<p class="err">테이블 없음</p>';
}
// 3. edu_goal_contents 확인
echo '<h2>3. edu_goal_contents 테이블</h2>';
if (in_array('edu_goal_contents', $tables)) {
echo '<b>컬럼 구조:</b>';
$cols = $pdo->query("SHOW COLUMNS FROM edu_goal_contents")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th><th>Null</th><th>Key</th><th>Default</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td><td>{$c['Null']}</td><td>{$c['Key']}</td><td>{$c['Default']}</td></tr>";
}
echo '</table>';
echo '<b>샘플 데이터:</b>';
$rows = $pdo->query("SELECT * FROM edu_goal_contents LIMIT 20")->fetchAll();
if ($rows) {
$keys = array_keys($rows[0]);
echo '<table><tr>' . implode('', array_map(fn($k) => "<th>$k</th>", $keys)) . '</tr>';
foreach ($rows as $r) {
echo '<tr>' . implode('', array_map(fn($v) => '<td>' . htmlspecialchars((string)$v) . '</td>', $r)) . '</tr>';
}
echo '</table>';
// 통계
echo '<b>통계:</b>';
$stats = $pdo->query("
SELECT
COUNT(DISTINCT goal_id) as goal_cnt,
COUNT(DISTINCT content_id) as content_cnt,
COUNT(*) as total_rows
FROM edu_goal_contents
")->fetch();
echo '<div><p>총 goal_id: ' . $stats['goal_cnt'] . '</p>';
echo '<p>총 content_id: ' . $stats['content_cnt'] . '</p>';
echo '<p>전체 행: ' . $stats['total_rows'] . '</p></div>';
} else {
echo '<p class="err">데이터 없음</p>';
}
} else {
echo '<p class="err">테이블 없음</p>';
}
// 4. 관계도 확인 (learning_goals ↔ goal_contents)
echo '<h2>4. edu_learning_goals ↔ edu_goal_contents 연결</h2>';
if (in_array('edu_learning_goals', $tables) && in_array('edu_goal_contents', $tables)) {
echo '<b>학습목표별 영상 수:</b>';
$rows = $pdo->query("
SELECT
g.goal_id,
g.goal_name,
COUNT(c.content_id) as video_count,
GROUP_CONCAT(c.content_id ORDER BY c.sort_order) as content_ids
FROM edu_learning_goals g
LEFT JOIN edu_goal_contents c ON g.goal_id = c.goal_id
GROUP BY g.goal_id, g.goal_name
ORDER BY g.goal_id
")->fetchAll();
if ($rows) {
echo '<table><tr><th>goal_id</th><th>goal_name</th><th>영상 수</th><th>content_ids</th></tr>';
foreach ($rows as $r) {
echo "<tr>";
echo "<td>{$r['goal_id']}</td>";
echo "<td>{$r['goal_name']}</td>";
echo "<td>{$r['video_count']}</td>";
echo "<td>" . htmlspecialchars($r['content_ids'] ?? '') . "</td>";
echo "</tr>";
}
echo '</table>';
}
}
// 5. 사용자 선택 목표 (if exists)
echo '<h2>5. 사용자별 선택된 학습목표</h2>';
if (in_array('edu_user_goals', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_user_goals")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
} else if (in_array('edu_goal_user_select', $tables)) {
$cols = $pdo->query("SHOW COLUMNS FROM edu_goal_user_select")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
} else {
echo '<p>사용자 선택 테이블을 찾을 수 없습니다.</p>';
}
// 6. 영상 시청 기록 (learning status)
echo '<h2>6. 사용자 학습 진행상황 관련 테이블</h2>';
$learningTables = ['edu_learning_progress', 'edu_user_learning', 'edu_learning_status'];
foreach ($learningTables as $tbl) {
if (in_array($tbl, $tables)) {
echo "<h3>$tbl</h3>";
$cols = $pdo->query("SHOW COLUMNS FROM $tbl")->fetchAll();
echo '<table><tr><th>Field</th><th>Type</th></tr>';
foreach ($cols as $c) {
echo "<tr><td>{$c['Field']}</td><td>{$c['Type']}</td></tr>";
}
echo '</table>';
}
}
?>
@@ -0,0 +1,21 @@
<?php
require_once __DIR__ . '/db_conn.php';
header('Content-Type: text/plain; charset=utf-8');
$pdo = db_conn();
echo "[COLUMNS]\n";
$cols = $pdo->query('SHOW COLUMNS FROM edu_recommended_goals')->fetchAll(PDO::FETCH_ASSOC);
foreach ($cols as $c) {
echo $c['Field'] . '|' . $c['Type'] . PHP_EOL;
}
echo "\n[SAMPLES]\n";
$rows = $pdo->query('SELECT * FROM edu_recommended_goals ORDER BY 1 ASC LIMIT 30')->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
$pairs = [];
foreach ($r as $k => $v) {
$pairs[] = $k . '=' . str_replace(["\r", "\n"], ' ', (string)$v);
}
echo implode(' | ', $pairs) . PHP_EOL;
}
+57
View File
@@ -0,0 +1,57 @@
<?php
require __DIR__ . '/db_conn.php';
$pdo = db_conn();
$pdo->beginTransaction();
// Map KW100xx codes in edu_content_keywords to Korean keyword names in edu_codes.code_name.
$sql = "
INSERT INTO edu_content_keywords (
content_id,
keyword_code,
is_active,
created_by,
created_at,
updated_by,
updated_at
)
SELECT
ck.content_id,
ec.code_name AS keyword_code,
'1' AS is_active,
'admin' AS created_by,
NOW() AS created_at,
'admin' AS updated_by,
NOW() AS updated_at
FROM edu_content_keywords ck
JOIN edu_codes ec
ON ec.base_code = ck.keyword_code
AND ec.group_code = 'KW100'
LEFT JOIN edu_content_keywords ck2
ON ck2.content_id = ck.content_id
AND ck2.keyword_code = ec.code_name
WHERE ck.keyword_code LIKE 'KW%'
AND ck.is_active = '1'
AND ec.code_name IS NOT NULL
AND ec.code_name <> ''
AND ck2.content_id IS NULL
";
$inserted = $pdo->exec($sql);
$pdo->commit();
echo "INSERTED_ROWS|" . (int)$inserted . "\n";
$checkKeywords = ['AI', '리더십', '자기개발', '온보딩', '중간관리자'];
$stmt = $pdo->prepare("SELECT keyword_code, COUNT(*) AS cnt FROM edu_content_keywords WHERE keyword_code = ? GROUP BY keyword_code");
foreach ($checkKeywords as $kw) {
$stmt->execute([$kw]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$cnt = $row ? (int)$row['cnt'] : 0;
echo "KW_COUNT|{$kw}|{$cnt}\n";
}
$sample = $pdo->query("SELECT content_id, keyword_code FROM edu_content_keywords WHERE keyword_code IN ('AI','리더십','자기개발') ORDER BY keyword_code, content_id LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
foreach ($sample as $r) {
echo "SAMPLE|{$r['content_id']}|{$r['keyword_code']}\n";
}
+23
View File
@@ -0,0 +1,23 @@
<?php
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
$tables = [
'edu_user_learning_goals',
'edu_learning_histories',
'edu_content_memos',
'edu_goal_contents',
'edu_learning_goals',
'edu_contents'
];
foreach ($tables as $t) {
echo '=== ' . $t . ' ===' . PHP_EOL;
$rows = $pdo->query('SHOW COLUMNS FROM ' . $t)->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
$def = $r['Default'];
if ($def === null) {
$def = 'NULL';
}
echo $r['Field'] . '|' . $r['Type'] . '|' . $r['Null'] . '|' . $r['Key'] . '|' . $def . PHP_EOL;
}
echo PHP_EOL;
}
+14
View File
@@ -0,0 +1,14 @@
<?php
require_once __DIR__ . '/db_conn.php';
$pdo = db_conn();
$cols = $pdo->query("SHOW COLUMNS FROM edu_users")->fetchAll(PDO::FETCH_ASSOC);
foreach ($cols as $c) {
echo $c['Field'] . '|' . $c['Type'] . '|' . $c['Null'] . '|' . $c['Key'] . '|' . ($c['Default'] ?? 'NULL') . PHP_EOL;
}
echo "---sample---" . PHP_EOL;
$rows = $pdo->query("SELECT member_id, intra_pw FROM edu_users ORDER BY member_id LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $r) {
$pw = (string)($r['intra_pw'] ?? '');
$prefix = substr($pw, 0, 4);
echo $r['member_id'] . '|len=' . strlen($pw) . '|prefix=' . $prefix . PHP_EOL;
}