質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.22%

ブラウザによってエラーが出なかったり、出たりします。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 951

kenichi_myk

score 14

chormeで確認するとエラーが出ませんが、それ以外のブラウザで確認するとエラーが表示されています

Ajaxで月日を読み、phpでカレンダーを作成しています。

chromeではエラーが出ていないのですが、それ以外のブラウザでは以下のエラーが出ています。

Fatal error: Uncaught TypeError: DateTime::__construct() expects parameter 1 to be string, array given in C:\xampp\htdocs\****.php on line 21

該当する箇所のソースは以下です。

function funcIsAjax(){
  if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
   return true;
   return false;
}

if(funcIsAjax())    header("Content-type: text/plain; charset=UTF-8");
else{
  header("Location: {$base_url}"); exit;
}

date_default_timezone_set('Asia/Tokyo'); 

$today = $_POST;
extract($today);

$thisMonth = new DateTime($today); //21行目はここです。
$dt = clone $thisMonth;
$prev = $dt->modify('-1 month')->format('Y-m');
$dt = clone $thisMonth;
$next = $dt->modify('+1 month')->format('Y-m');

$yearMonth = $thisMonth->format('Y F');
$month = $thisMonth->format('Y-m');

// カレンダー表示
// 前月表示
$tr = '<div class="cal_tr">';
$tail = null;
//前月の最終日を習得
$lastDayOfPrevMonth = new DateTime('last day of ' . $yearMonth . ' -1 month');
while ($lastDayOfPrevMonth->format('N') < 7) {
  $tail = sprintf('<div></div>', $lastDayOfPrevMonth->format('d')) . $tail;
  $tail = sprintf('<div class="cal cal_td empty"><div class="cal_body"></div></div>', $lastDayOfPrevMonth->format('d')) . $tail;
  $lastDayOfPrevMonth->sub(new DateInterval('P1D'));
  $prevmanth = $lastDayOfPrevMonth->format('Y-m');
}

// 当月表示
$body = null;
$period = new DatePeriod (
    new DateTime('first day of' . $yearMonth),
    new DateInterval('P1D'),
    new DateTime('first day of' . $yearMonth . '+1 month')
);

$today = new DateTime('today');
foreach ($period as $day) {
  if ($day->format('N') === '1'){
    $body .= '</div></div>';
    $body .= '<div class="cal_tr">';
  }
  $days = $day->format('Y-m-d');

  $sch = '';
  foreach($holiday as $key) {
    $id = $key['id'];
    $user = $key['account_id'];
    $from = $key['datetime_from'];
    $to = $key['datetime_to'];
    $type = $key['holiday_type'];
    $comment = $key['comment'];

    if($from == $days){
      $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : '';
      $sch .= '<div class="area_btn" data-user="' . $user . '" data-from="' . $from . '" data-to="' . $to . '" data-type="' . $type . '" draggable="true">' . $type . '/' . ' ' .$user .'</div>';
    }
  }

  if($sch !== '') {
    $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : '';
    $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body day">' . $sch . '</div></div>', $day->format('w'), $todayClass, $day->format('d'));

  } else {
    $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : '';
    $body .= sprintf('<div class="cal cal_td" data-date="' . $days . '"><div class="cal_date day_%d %s">%d</div><div class="cal_plan"></div><div class="cal_body day"></div></div>', $day->format('w'), $todayClass, $day->format('d'));
  }  
}

// 次月表示
$head = null;
$firstDayOfNextMonth = new DateTime('first day of' . $yearMonth . '+1 month');
// var_dump($firstDayOfNextMonth->format('N'));
while($firstDayOfNextMonth->format('N') > 1) {
  $head .= '<div class="cal cal_td empty">' . $firstDayOfNextMonth->format('d');
  $head .= '<div class="cal_body"></div>';
  $head .= '</div>';

  $firstDayOfNextMonth->add(new DateInterval('P1D'));
  $nextMonth = $firstDayOfNextMonth->format('Y-m');
}

echo $tr . $tail . $body . $head;
$(window).on('load', function(){
    $.ajaxSetup({
        type:'POST',
        ifModified:false,
        cache:false,
    });   

    var ajax_url = './calendar.php';

    var today = $('.thismonth').attr('data-month');
    var date = today;
    console.log(date);
    var data = {
      today : date,
    };

    return $.ajax({
      url:ajax_url,
      data:data,
    }).done(function(data, textStatus, jqXHR){
      $('.inner').html(data);
    }).fail(function(jqXHR, textStatus, errorThrown ){
      $('.inner').children('.cal_tr').html(textStatus);
    });

どの様に対処すればよいか困っています。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/11/19 12:40

    それにAjaxなら画面表示はないはずで、このエラーをどのように感知したのかを知りたいですね

    キャンセル

  • kenichi_myk

    2019/11/19 13:41

    touch punchを導入したので、iPhoneで確認した際にエラーが出ていました。
    まさかと思ってchrome以外のブラウザで確認した所、chrome以外で同様のエラーが表示されていました。
    phpはサーバーサイドの言語と言う事は理解しているのですが、なぜブラウザでエラーが出たり出なかったりなのかが分かっていません。

    キャンセル

  • tabuu

    2019/11/20 09:32

    >なぜブラウザでエラーが出たり出なかったりなのかが分かっていません。
    ブラウザによって送信する内容が異なるためです。
    同一ブラウザでもバージョンによって異なる場合もあります。

    >$thisMonth = new DateTime($today); //21行目はここです。
    変数$todayには何が入っていますか?
    DateTimeクラスのコンストラクタの引数は文字列ですが、想定している文字列が入っているかを、ブラウザごとに確認してみてください。

    キャンセル

回答 2

+2

postに何が入っている想定か、具体的に例示ください

$_POSTをextractするのは良くないですね
またextractにより変数todayは上書きされるのでしょうか?
ちょっと何をしたいのか読み取れないです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/19 12:48 編集

    あと、php側でecho /printなどの出力がないので、なにも返してこないように思えます
    それとDatetimeクラスが難しいなら、普通の日付関数で処理してみてください

    キャンセル

  • 2019/11/19 13:37

    extractするのはよくなかったんですね。よく調べずに使ってしまっていました。
    AjaxでHTMLに出力しています。

    キャンセル

  • 2019/11/19 13:45

    > AjaxでHTMLに出力しています。

    いえ、そうではなくてphp側で何らかの文字列が出力されないと
    ajaxでなにも受け取ることができないという意味です

    キャンセル

  • 2019/11/19 13:52

    当初のphpの下にカレンダーの出力内容を書いているので追加しました。

    キャンセル

check解決した方法

0

$_POSTがセットされている場合といない場合の記述を入れる事で無事解決できました!

様々な方にたくさん助言をいただきありがとうございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る