connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if (!$conn->set_charset("utf8mb4")) {
throw new Exception("文字コード設定失敗: " . $conn->error);
}
// プロジェクト情報取得
$stmt = $conn->prepare("SELECT p.*, u.display_name as author_display_name, u.icon_url as author_icon_url
FROM projects p
LEFT JOIN user_data u ON p.author_id = u.google_id
WHERE p.id = ?");
$stmt->bind_param("i", $project_id);
$stmt->execute();
$result = $stmt->get_result();
$project = $result->fetch_assoc();
if (!$project) {
die("プロジェクトが見つかりません");
}
// パスワードチェック
$password_required = !empty($project['password']);
$password_verified = false;
if ($password_required) {
if (isset($_POST['project_password'])) {
if ($_POST['project_password'] === $project['password']) {
$_SESSION['verified_projects'][$project_id] = true;
$password_verified = true;
} else {
$password_error = "パスワードが間違っています";
}
} elseif (isset($_SESSION['verified_projects'][$project_id])) {
$password_verified = true;
}
} else {
$password_verified = true;
}
if (!$password_verified) {
// パスワード入力フォームを表示して終了
?>
パスワードが必要です - Scratch School
query("UPDATE projects SET views = views + 1 WHERE id = $project_id");
// ユーザーが星を付けたかどうか確認
$has_starred = false;
$starred_users = json_decode($project['starred_users'] ?? '[]', true) ?? [];
if (isset($_SESSION['user_id'])) {
$has_starred = in_array($_SESSION['user_id'], $starred_users);
}
// 星のトグル処理
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['toggle_star'])) {
if ($has_starred) {
// 星を削除
$starred_users = array_diff($starred_users, [$_SESSION['user_id']]);
$starred_users_json = $conn->real_escape_string(json_encode(array_values($starred_users)));
$conn->query("UPDATE projects SET stars = stars - 1, starred_users = '$starred_users_json' WHERE id = $project_id");
$project['stars']--;
$has_starred = false;
} else {
// 星を追加
$starred_users[] = $_SESSION['user_id'];
$starred_users_json = $conn->real_escape_string(json_encode(array_values($starred_users)));
$conn->query("UPDATE projects SET stars = stars + 1, starred_users = '$starred_users_json' WHERE id = $project_id");
$project['stars']++;
$has_starred = true;
}
}
// コメント処理
$comment_error = null;
$comment_success = null;
$comments = [];
// commentカラムのJSONデータをデコード
$comment_data = json_decode($project['comment'], true) ?? ['can_comment' => false, 'history' => []];
$can_comment = $comment_data['can_comment'] ?? false;
$comments = $comment_data['history'] ?? [];
if ($can_comment) {
// コメント送信処理
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['comment_content'])) {
$content = trim($_POST['comment_content']);
if (empty($content)) {
$comment_error = "コメント内容を入力してください";
} elseif (strlen($content) > 1000) {
$comment_error = "コメントは1000文字以内で入力してください";
} else {
// ユーザー情報を取得
$stmt = $conn->prepare("SELECT display_name, icon_url FROM user_data WHERE google_id = ?");
$stmt->bind_param("s", $_SESSION['user_id']);
$stmt->execute();
$user_result = $stmt->get_result();
$user_data = $user_result->fetch_assoc();
if ($user_data) {
$new_comment = [
'user_id' => $_SESSION['user_id'],
'name' => $user_data['display_name'],
'icon_url' => $user_data['icon_url'],
'content' => $content,
'timestamp' => time()
];
array_unshift($comments, $new_comment);
$comment_data['history'] = $comments;
// データベース更新
$json_data = json_encode($comment_data, JSON_UNESCAPED_UNICODE);
$stmt = $conn->prepare("UPDATE projects SET comment = ? WHERE id = ?");
$stmt->bind_param("si", $json_data, $project_id);
if ($stmt->execute()) {
$comment_success = "コメントを投稿しました";
} else {
$comment_error = "コメントの保存に失敗しました";
}
} else {
$comment_error = "ユーザー情報が見つかりません";
}
}
}
// コメント削除/編集処理
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['comment_action'])) {
$index = $_POST['comment_index'] ?? null;
$is_owner = ($_SESSION['user_id'] === $project['author_id']);
if ($index !== null && isset($comments[$index])) {
$comment = $comments[$index];
$is_comment_owner = ($comment['user_id'] === $_SESSION['user_id']);
if ($is_owner || $is_comment_owner) {
if ($_POST['comment_action'] === 'delete') {
// コメント削除
array_splice($comments, $index, 1);
$comment_data['history'] = $comments;
$json_data = json_encode($comment_data, JSON_UNESCAPED_UNICODE);
$stmt = $conn->prepare("UPDATE projects SET comment = ? WHERE id = ?");
$stmt->bind_param("si", $json_data, $project_id);
$stmt->execute();
} elseif ($_POST['comment_action'] === 'edit' && isset($_POST['edited_content'])) {
// コメント編集
$edited_content = trim($_POST['edited_content']);
if (!empty($edited_content) && strlen($edited_content) <= 1000) {
$comments[$index]['content'] = $edited_content;
$comments[$index]['edited'] = true;
$comment_data['history'] = $comments;
$json_data = json_encode($comment_data, JSON_UNESCAPED_UNICODE);
$stmt = $conn->prepare("UPDATE projects SET comment = ? WHERE id = ?");
$stmt->bind_param("si", $json_data, $project_id);
$stmt->execute();
}
}
}
}
}
}
// 現在のユーザー情報を取得
$current_user_stmt = $conn->prepare("SELECT display_name, icon_url FROM user_data WHERE google_id = ?");
$current_user_stmt->bind_param("s", $_SESSION['user_id']);
$current_user_stmt->execute();
$current_user_result = $current_user_stmt->get_result();
$current_user = $current_user_result->fetch_assoc();
// コメント投稿者のアイコン情報を取得
$comment_user_ids = array_column($comments, 'user_id');
if (!empty($comment_user_ids)) {
$placeholders = implode(',', array_fill(0, count($comment_user_ids), '?'));
$types = str_repeat('s', count($comment_user_ids));
$stmt = $conn->prepare("SELECT google_id, icon_url FROM user_data WHERE google_id IN ($placeholders)");
$stmt->bind_param($types, ...$comment_user_ids);
$stmt->execute();
$icon_result = $stmt->get_result();
$user_icons = [];
while ($row = $icon_result->fetch_assoc()) {
$user_icons[$row['google_id']] = $row['icon_url'];
}
// コメントデータにアイコンURLを追加
foreach ($comments as &$comment) {
if (isset($user_icons[$comment['user_id']])) {
$comment['icon_url'] = $user_icons[$comment['user_id']];
}
}
}
$conn->close();
?>
- Scratch School
まだコメントはありません