Initial commit: 교육 프로젝트 배포
This commit is contained in:
@@ -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";
|
||||
@@ -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']
|
||||
);
|
||||
}
|
||||
@@ -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>';
|
||||
?>
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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>';
|
||||
@@ -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>";
|
||||
}
|
||||
}
|
||||
@@ -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>';
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
require_once dirname(__DIR__, 2) . '/db_conn.php';
|
||||
|
||||
$memberId = (string)($_SESSION['member_id'] ?? $_SESSION['user_id'] ?? '');
|
||||
$sysCompCode = (string)($_SESSION['sys_comp_code'] ?? $_SESSION['company'] ?? '');
|
||||
|
||||
if ($memberId === '') {
|
||||
http_response_code(401);
|
||||
echo json_encode(['success' => false, 'message' => 'not_logged_in'], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
$rawBody = file_get_contents('php://input');
|
||||
$input = is_string($rawBody) && $rawBody !== '' ? json_decode($rawBody, true) : [];
|
||||
if (!is_array($input)) {
|
||||
$input = $_POST;
|
||||
}
|
||||
|
||||
$contentId = trim((string)($input['content_id'] ?? ''));
|
||||
if ($contentId === '') {
|
||||
http_response_code(400);
|
||||
echo json_encode(['success' => false, 'message' => 'content_id_required'], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$pdo = db_conn();
|
||||
|
||||
// 학습 이력 조회
|
||||
$sql = 'SELECT watch_tm, content_tm, completed_at, last_viewed_at
|
||||
FROM edu_learning_histories
|
||||
WHERE member_id = ? AND content_id = ?';
|
||||
$params = [$memberId, $contentId];
|
||||
|
||||
if ($sysCompCode !== '') {
|
||||
$sql .= ' AND sys_comp_code = ?';
|
||||
$params[] = $sysCompCode;
|
||||
}
|
||||
|
||||
$sql .= ' ORDER BY last_viewed_at DESC LIMIT 1';
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// 콘텐츠 상세정보 조회 (description)
|
||||
$stmtContent = $pdo->prepare('SELECT description FROM edu_contents WHERE content_id = ? LIMIT 1');
|
||||
$stmtContent->execute([$contentId]);
|
||||
$contentRow = $stmtContent->fetch(PDO::FETCH_ASSOC);
|
||||
$description = ($contentRow['description'] ?? '');
|
||||
|
||||
// 북마크 상태 조회
|
||||
$bookmarkSql = 'SELECT is_active FROM edu_content_wishlist WHERE content_id = ? AND member_id = ?';
|
||||
$bookmarkParams = [$contentId, $memberId];
|
||||
if ($sysCompCode !== '') {
|
||||
$bookmarkSql .= ' AND sys_comp_code = ?';
|
||||
$bookmarkParams[] = $sysCompCode;
|
||||
}
|
||||
$bookmarkSql .= ' LIMIT 1';
|
||||
$stmtBookmark = $pdo->prepare($bookmarkSql);
|
||||
$stmtBookmark->execute($bookmarkParams);
|
||||
$bookmarkRow = $stmtBookmark->fetch(PDO::FETCH_ASSOC);
|
||||
$isBookmarked = (($bookmarkRow['is_active'] ?? '0') === '1');
|
||||
|
||||
$result = [
|
||||
'success' => true,
|
||||
'watch_tm' => (int)($row['watch_tm'] ?? 0),
|
||||
'content_tm' => (int)($row['content_tm'] ?? 0),
|
||||
'completed_at' => $row['completed_at'] ?? null,
|
||||
'last_viewed_at' => $row['last_viewed_at'] ?? null,
|
||||
'description' => $description,
|
||||
'is_bookmarked' => $isBookmarked,
|
||||
];
|
||||
|
||||
echo json_encode($result, JSON_UNESCAPED_UNICODE);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
error_log('[get_video_time] ' . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['success' => false, 'message' => 'server_error'], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
Reference in New Issue
Block a user