実現したいこと
fullcalenderにMySQLのシフトデータをカレンダー上に表示させたい
発生している問題・分からないこと
fullcalenderにMySQLのシフトデータをカレンダー上に表示させたいのですが途中でエラーが発生しました。
エラーメッセージ
error
1Error fetching data: TypeError: e is not iterable 2 at i (index.global.min.js:6:145454) 3 at i (index.global.min.js:6:145501) 4 at index.global.min.js:6:147918 5 at ha.buildPluginHooks (index.global.min.js:6:147930) 6 at ha.processRawCalendarOptions (index.global.min.js:6:166590) 7 at ha.computeOptionsData (index.global.min.js:6:165940) 8 at new ha (index.global.min.js:6:160996) 9 at new e.Calendar (index.global.min.js:6:279010) 10 at calender.js:7:22
該当のソースコード
calendar.js
1document.addEventListener('DOMContentLoaded', function() { 2 var calendarEl = document.getElementById('calendar'); 3 4 fetch('getShifts.php') 5 .then(response => response.json()) 6 .then(data => { 7 var calendar = new FullCalendar.Calendar(calendarEl, { 8 headerToolbar: { 9 left: 'prev,next today', 10 center: 'title', 11 right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth' 12 }, 13 buttonText: { 14 prev: '先月', 15 next: '来月', 16 today: '今日', 17 dayGridMonth: '月', 18 timeGridWeek: '週', 19 timeGridDay: '日', 20 listMonth: 'リスト', 21 }, 22 locale: 'ja', 23 timeZone: 'Asia/Tokyo', 24 eventLimit: true, 25 navLinks: true, 26 editable: true, 27 dayMaxEvents: true, // for all non-TimeGrid views 28 views: { 29 timeGrid: { 30 dayMaxEventRows: 4 // adjust to 6 only for timeGridWeek/timeGridDay 31 } 32 }, 33 selectable: true, 34 plugins: ['dayGrid', 'timeGrid', 'interaction', 'list'], 35 initialView: 'dayGridMonth', 36 events: function(info, successCallback, failureCallback) { 37 // infoオブジェクトを使用して日付の範囲を取得 38 setCalendarList(info.startStr, info.endStr, successCallback); 39 }, 40 eventClick: function(info) { 41 // カレンダーに設定したイベントクリック時のイベント 42 }, 43 dateClick: function(info) { 44 // カレンダー空白部分クリック時のイベント 45 }, 46 select: function(info) { 47 // カレンダー空白部分をドラッグして範囲指定した時のイベント 48 }, 49 eventDrop: function(info) { 50 // イベントをドラッグして別日に移動させた時のイベント 51 } 52 }); 53 54 calendar.render(); 55 }) 56 .catch(error => { 57 console.error('Error fetching data:', error); 58 }); 59}); 60 61/** 62 * 対象日付スケジュールデータセット処理 63 * @param {string} startStr - 開始日付 64 * @param {string} endStr - 終了日付 65 * @param {function} successCallback - 成功時のコールバック関数 66 * @returns {undefined} 67 */ 68function setCalendarList(startStr, endStr, successCallback) { 69 $.ajax({ 70 type: 'post', 71 dataType: "json", 72 async: true, 73 cache: false, 74 url: 'getShifts.php', 75 data: { 76 startDate: startStr, 77 endDate: endStr 78 } 79 }) 80 .then(function(data) { 81 var events = []; 82 83 // 取得したデータをフルカレンダーのイベント形式に整形 84 $.each(data, function(index, value) { 85 events.push({ 86 id: value['shift_id'], 87 title: value['title'], 88 description: value['description'], 89 start: value['start'], 90 end: value['end'], 91 color: value['color'], 92 textColor: value['textColor'] 93 }); 94 }); 95 96 // 成功時のコールバック関数にイベントを渡す 97 successCallback(events); 98 }) 99 .catch(error => { 100 console.error('Error in setCalendarList:', error); 101 // 失敗時の処理をここに記述することもできます 102 }); 103 104 return; 105} 106
getShifts.php
1<?php 2// データベースの設定情報を定義します。 3$servername = "localhost"; 4$username = ""; 5$password = ""; 6$dbname = ""; 7 8// PDOを使用してデータベースに接続します。 9// PDOはエラー処理やセキュリティ(プリペアドステートメント)などの面でmysqliより推奨されます。 10try { 11 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 12 // エラーモードを例外モードに設定 13 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 14} catch (PDOException $e) { 15 die("Connection failed: " . $e->getMessage()); 16} 17 18// スケジュールデータを取得するクエリを定義します。 19$sql = "SELECT shift_id, title, description, start_date, start_time, end_date, end_time, calendar_color, calendar_text_color FROM shifts WHERE start_date >= :startDate AND end_date <= :endDate"; 20 21// パラメータをバインドしてクエリを実行します。 22$startDate = $_GET['startDate'] ?? date('Y-m-d'); 23$endDate = $_GET['endDate'] ?? date('Y-m-d'); 24$stmt = $conn->prepare($sql); 25$stmt->bindParam(':startDate', $startDate); 26$stmt->bindParam(':endDate', $endDate); 27$stmt->execute(); 28 29// クエリ結果を配列に格納します。 30$scheduleList = $stmt->fetchAll(PDO::FETCH_ASSOC); 31 32// データベース接続を閉じます(PDOでは接続閉じる必要は基本的にありませんが、明示的に閉じたい場合はnullを代入します) 33$conn = null; 34 35// JSON形式でレスポンスを返します。 36header('Content-Type: application/json'); 37echo json_encode($scheduleList); 38?> 39
content.php
1<?PHP 2session_start(); 3 4// ログイン済みかどうかを確認 5if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){ 6 header("location: ../login/login.php"); 7 exit; 8} 9 10 11//データベース接続 龍の目 12require('../dbconnect.php'); 13 14// ユーザー情報の取得クエリ 15$sql = "SELECT e.name, r.role_name 16 FROM employees e 17 JOIN roles r ON e.role_id = r.role_id 18 WHERE e.employee_code = ?"; 19 20if($stmt = $db->prepare($sql)){ 21 22 // パラメータをバインド 23 $employee_code = $_SESSION["employee_code"]; 24 $stmt->bindParam(1, $employee_code, PDO::PARAM_STR); 25 26 // クエリの実行 27 if($stmt->execute()){ 28 // 結果を取得 29 $row = $stmt->fetch(PDO::FETCH_ASSOC); 30 if ($row) { 31 $name = $row['name']; 32 $role = $row['role_name']; 33 } 34 } 35} 36// データベース接続を閉じる 37$db = null; 38?> 39 40 41 42 43<!DOCTYPE html> 44<html lang="ja" class="is-overflow"> 45<head> 46 <meta charset="UTF-8"> 47 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 48 <title>ログインページ</title> 49 <link rel="stylesheet" href="index02.css"> 50 <script src="calender.js"></script> 51 52 <script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.11/index.global.min.js'></script> 53 54 55</head> 56 57<body> 58<div class="htmlContainer"> 59<!-- header --> 60 <main> 61 <div class="container"> 62 <h1>スケジュール</h1> 63 </div> 64 <div id="cale" style="padding: 10px 10px;"> 65 <div id='calendar'></div> 66 </div> 67 </main> 68</div> 69</body> 70</html>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
エラーコードとかを調べましたが見つけられませんでした。
補足
windows XAMPP vscode
まだプログラミング始めたばかりで色々いたらない点もありますがご教授願います。
もっと詳細な情報が必要な場合はどうぞご気軽にコメントしてください。
よろしくお願いします.
plugins の行を削除するとどうなりますか?
回答1件
あなたの回答
tips
プレビュー