简体   繁体   中英

Too long string causes error - “Cannot modify header information”

I want to create a calendar that displays a single month. Users can only see the current month and next month. The calendar has two buttons that allow going to the next month or when the current month. I want to prevent (by PHP) the possibility of going to the other month when you type in the URL number of the month which is too distant or previous than current. When you type the wrong month in the URL the PHP should redirect you to the current or next month.

I noticed that when the user enters the wrong month and when the redirection header should work then there is an error:

"(output started at C:\xampp\htdocs\php\page--xampp--phpmailer\subpages\profile__dates.php:97) in C:\xampp\htdocs\php\page--xampp--phpmailer\php\profile_dates.php on line 15". "profile__dates.php:97"

returns from database base64 profile image. When I change the length src of the image then everything is working very well but I don't see the user's avatar.

How can I fix it without changing the method of saving a user's avatar in the database and in PHP?

$userInfo['profile_image'] - returns over 6k length string, when I short it up to 30 chars then it's working

<?php
    session_start();

    if(isset($_SESSION['isLoggedIn'])){
        if(!$_SESSION['isLoggedIn']){
            header("Location: ../index.php");
            exit();
        }else{
            if(isset($_GET['month']) || isset($_GET['year'])){
                if(!empty($_GET['month']) || !empty($_GET['year'])){
                    include('../php/getuserinfo.php');
                    include('../php/is_profile_activated.php');
                    include('../php/profile_dates.php');
                }
            }else{
                $month = date('m');
                $year = date('Y');
                header("Location: http://localhost/php/page--xampp--phpmailer/subpages/profile__dates.php?month=$month&year=$year");
                exit();
            }
        }
    }else{
        die(header("Location: ./login.php"));
    }
?>
<!DOCTYPE html>
<html lang="pl-PL">

<head>
    <title>Rezerwacja terminu | Bartek OSK</title>
    <meta charset="UTF-8">
    <meta name="description" content="Od lat profesjonalnie uczymy naszych kursantów nauki jazdy. Posiadamy bardzo wysoką zdawalność. Posiadamy łączone kursy obniżając przy tym łączną cenę. ">
    <meta name="msapplication-TileColor" content="#da532c">
    <meta name="theme-color" content="#ffffff">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link rel="stylesheet" href="../styles/basic.css">
    <link rel="stylesheet" href="../styles/profile__dates.css">
    <link rel="apple-touch-icon" sizes="180x180" href="../favicons/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="../favicons/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="../favicons/favicon-16x16.png">
    <link rel="manifest" href="../favicons/site.webmanifest">
    <link rel="mask-icon" href="../favicons/safari-pinned-tab.svg" color="#5bbad5">
</head>

<body>
<nav>
        <div id="navbar">
            <div class="nav-logo flexbox-row-center">
                <img class="nav-logo-img" src="../imgs/logo.png" alt="BartekOSK logo">
            </div>
            <div class="nav-links flexbox-row-center">
                <ul class="flexbox-row-center">
                    <li class="nav--elem"><a href="../index.php">Strona Główna</a></li>
                    <li class="nav--elem"><a href="../subpages/pricelist.php">Cennik</a></li>
                    <li class="nav--elem"><a href="../subpages/gallery.php">Galeria</a></li>
                    <li class="nav--elem"><a href="../subpages/contact.php">Kontakt</a></li>
                    <?php
                    if(isset($_SESSION['isLoggedIn']) && $_SESSION['isLoggedIn']){
                        echo('<li class="nav__account--elem"><a class="nav__account--link" href="../subpages/profile__home.php"><img src="'.$userInfo['profile_image'].'" alt="User profile image"></a>
                        <ul class="nav__account__dd--list">
                            <li class="nav__account__dd--elem"><a href="../subpages/profile__account__information.php" title="Informacje o użytkownikach">Informacje o użytkowniku</a></li>
                            <li class="nav__account__dd--elem"><a href="../subpages/profile__course__information.php" title="Informacje o kursie">Informacje o kursie</a></li>
                            <li class="nav__account__dd--elem"><a href="../subpages/profile__dates.php" title="Informacje o użytkownikach">Terminy</a></li>
                            <li class="nav__account__dd--elem"><a href="../php/logOut.php" title="Wyloguj się">Wyloguj się</a></li>
                        </ul></li>');
                    }else{
                        echo '<li class="nav__signup--elem"><a href="../subpages/signup__form.php">Zapisz się</a></li>';
                        echo '<li class="nav__login--elem"><a href="../subpages/login.php">Zaloguj się</a></li>';
                    }
                    ?>
                </ul>
            </div>
        </div>
        <div class="navigation__rwd">
            <button class="hamburger">
                <span class="hamburger__box">
                    <span class="hamburger__inner"></span>
                </span>
            </button>
            <div class="nav-list-wrapper">
                <ul class="nav-list">
                    <li><img class="rwd-nav-logo-img" src="../imgs/logo.png" alt="BartekOSK logo"></li>
                    <li><a href="../index.php">Strona Główna</a></li>
                    <li><a href="../subpages/pricelist.php">Cennik</a></li>
                    <li><a href="../subpages/gallery.php">Galeria</a></li>
                    <li><a href="../subpages/contact.php">Kontakt</a></li>
                    <?php
                        if(isset($_SESSION['isLoggedIn']) && $_SESSION['isLoggedIn']){
                            echo '<li class="rwd__nav__signup--elem"><a href="../subpages/account__home.php">Konto</a></li>';
                            echo '<li class="rwd__nav__logout--elem"><a href="../php/logOut.php">Wyloguj się</a></li>';
                        }else{
                            echo '<li class="rwd__nav__signup--elem"><a href="../subpages/signup__form.php">Zapisz się</a></li>';
                            echo '<li class="rwd__nav__login--elem"><a href="../subpages/login.php">Zaloguj się</a></li>';
                        }
                    ?>
                </ul>
            </div>
        </div>
    </nav>

    <section id="content">
        <h1>REZERWACJA TERMINU</h1>
        <div class="home__btn--container">
            <a href="profile__home.php"><img class="home__btn--img" src="../imgs/home_icon.png" alt="Home icon" title="Profil"></a>
        </div>
        <?php echo generateCalendar(); ?>
        <div class="profile--nav flexbox-row-center">
            <ul class="nav--list">
                <li class="nav__list--item"><a href=""><img class="nav__list__item--img" src="../imgs/user_icon_small.png" alt="User icon" title="Informacje o użytkowniku"></a></li>
                <li class="nav__list--item"><a href="profile__course__information.php"><img class="nav__list__item--img" src="../imgs/student_cap_icon_small.png" alt="Student cap icon" title="Informacje o kursie"></a></li>
                <li class="nav__list--item"><a href="profile__dates.php"><img class="nav__list__item--img active" src="../imgs/calendar_icon_small.png" alt="Calendar icon" title="Terminy"></a></li>
            </ul>
        </div>
    </section>

    <div class="header-shape-one">
        <img src="../svgs/shape1.svg" alt="Background Shape1">
    </div>
    <div class="header-shape-two">
        <img src="../svgs/shape2.svg" alt="Background Shape2">
    </div>

    <footer class="flexbox-column-center">
        <div class="footer-contact flexbox-column-center">
            <a href="../index.html" claas="footer__contact__logo--btn"><img src="../imgs/logo.png" alt="BartekOSK logo"></a>
            <ul>
                <li><img src="../imgs/marker_white-32px.png" alt="Marker image">ul. Sokolska 34, 40-121 Katowice</li>
                <li><img src="../imgs/mail_white-32px.png" alt="Mail image">bartekosk@gmail.com</li>
                <li><img src="../imgs/phone_white-32px.png" alt="Phone image">+48 501-546-408</li>
            </ul> 
        </div>
        <div class="important__documents--container">
            <a href="../regulamin.pdf" class="important__document--link">Regulamin</a>
            <a href="../polityka-prywatnosci.pdf" class="important__document--link">Polityka prywatności</a>
            <a href="../rodo.pdf" class="important__document--link">RODO</a>
        </div>
        <div class="footer-copyright flexbox-row-center">
            <p>© Bartek OSK. Wszelkie prawa zastrzeżone. | Zaprojektowane przez Kamil Krukowski.</p>
        </div>
    </footer>

    <?php
        if(!isset($_COOKIE['cookieAgree'])){
            echo('<section class="cookies__notification--container">
                <p class="cookies__info">Ta strona wykorzystuje pliki <strong>cookies</strong> w celu polepszenia doświadczeń z korzystania naszej strony.</p>
                <a href="../polityka-prywatnosci.pdf" class="cookies__more__info--link">Więcej informacji</a>
                <br>
                <button class="cookies__agree--btn">Zrozumiałem/am</button>
            </section>');
        }
    ?>

    <script
  src="https://code.jquery.com/jquery-3.5.1.js"
  integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="
  crossorigin="anonymous"></script>
    <script src="../js/dates.js"></script>
    <script src="../js/script.js"></script>
</body>

</html>
<?php
    ob_start();
    function generateCalendar(){
        //Get basic info about date and calendar
        $typeOfCalendar = CAL_GREGORIAN;
        $month = $_GET['month'];
        $year = $_GET['year'];
        $monthName = date('M', mktime(0,0,0,$month,1,$year));

        //If user wants to show two months forward or previous month
        if(date('m') == 12){
            if($month > 1 && $year == date('Y')+1){
                $month = 1;
                $year = date('Y')+1;
                die(header("Location: ../subpages/profile__dates.php?month=$month&year=$year"));
            }
        }else{
            if($month > date('m')+1){
                $month = date('m')+1;
            }else if($month < date('m')){
                $month = date('m');
            }
        }

        $daysInTheMonth = cal_days_in_month($typeOfCalendar, $month, $year);
        $firstDayOfTheMonth = date("N", mktime(0,0,0,$month,1,$year));

        //Days of previous month
        if($month == 1){
            $daysInThePrevMonth = cal_days_in_month($typeOfCalendar, 12, $year-1);
        
            $prevMonthDay = $daysInThePrevMonth - $firstDayOfTheMonth+2;
        }else{
            $prevMonth = $month-1;
            $daysInThePrevMonth = cal_days_in_month($typeOfCalendar, $prevMonth, $year);
        
            $prevMonthDay = $daysInThePrevMonth - $firstDayOfTheMonth+2;
        }

        //Days of forward month
        if($month == 12){
            $fwdMonthDay = date("j", mktime(0,0,0,1,1,$year+1));
            echo($fwdMonthDay);
        }else{
            $fwdMonth = $month+1;

            $fwdMonthDay = date("j", mktime(0,0,0,$fwdMonth,1,$year+1));
            echo($fwdMonthDay);
        }

        //Create table
        echo('<table class="calendar--container">');

        //Info
        echo('<tr>');
            echo('<td colspan="2"><button class="calendar__back--btn"><</button></td>');
            echo('<td colspan="3"><p class="calendar__month--text">'.$monthName.'</p></td>');
            echo('<td colspan="2"><button class="calendar__next--btn">></button></td>');
        echo('</tr>');

        //Days
        echo('<tr>');
            echo('<td><p>Pon</p></td>');
            echo('<td><p>Wt</p></td>');
            echo('<td><p>Śro</p></td>');
            echo('<td><p>Czw</p></td>');
            echo('<td><p>Pią</p></td>');
            echo('<td><p>Sob</p></td>');
            echo('<td><p>Nie</p></td>');
        echo('</tr>');

        $dateInLoop = 0;

        for($i = 1; $i<=6; $i++){
            echo("<tr>");
                for($j = 1; $j<=7; $j++){
                    if($i === 1 && ($j === $firstDayOfTheMonth-1)){
                        echo("<td><p class='other__month__day--text'>$prevMonthDay</p></td>");
                        $dateInLoop = 1;
                    }else if($i === 1 && ($j >= $firstDayOfTheMonth)){
                        echo("<td data-day='$dateInLoop'><button class='calendar__day--btn'>$dateInLoop</button></td>");
                        $dateInLoop++;
                    }else if($i === 1 && ($j < $firstDayOfTheMonth)){
                        echo("<td><p class='other__month__day--text'>$prevMonthDay</p></td>");
                        $dateInLoop++;
                        $prevMonthDay++;
                    }else if($i != 1 && ($dateInLoop <= $daysInTheMonth)){
                        echo("<td data-day='$dateInLoop'><button class='calendar__day--btn'>$dateInLoop</button></td>");
                        $dateInLoop++;
                    }else if($i != 1 && ($dateInLoop >= $daysInTheMonth)){
                        echo("<td><p class='other__month__day--text'>$fwdMonthDay</p></td>");
                        $dateInLoop++;
                        $fwdMonthDay++;
                    }
                }
            echo("</tr>");
        }

        echo("</table>");
    }
    ob_end_flush();
?>

As per the comment I made, what you could try would be to get the generateCalendar method to return the HTML string rather than output it directly and then call that function earlier than you do currently.

For example:

function generateCalendar(){
    if( isset( $_GET['month'], $_GET['year'] ) ){
    
        $html=array();
        $month = $_GET['month'];
        $year = $_GET['year'];
        
        
        if( !is_numeric( $month ) or !is_numeric( $year ) ){
            return false;
        }
        
        $typeOfCalendar = CAL_GREGORIAN;            
        $monthName = date('M', mktime(0,0,0,$month,1,$year));

        
        //If user wants to show two months forward or previous month
        if( date('m') == 12 ){
            if( $month > 1 && $year == date('Y')+1 ){
                $month = 1;
                $year = date('Y')+1;
                
                die( header( "Location: ../subpages/profile__dates.php?month=$month&year=$year" ) );
            }
        }else{
            if($month > date('m')+1){
                $month = date('m')+1;
            }else if($month < date('m')){
                $month = date('m');
            }
        }

        $daysInTheMonth = cal_days_in_month($typeOfCalendar, $month, $year);
        $firstDayOfTheMonth = date("N", mktime(0,0,0,$month,1,$year));

        //Days of previous month
        if($month == 1){
            $daysInThePrevMonth = cal_days_in_month($typeOfCalendar, 12, $year-1);
            $prevMonthDay = $daysInThePrevMonth - $firstDayOfTheMonth+2;
        }else{
            $prevMonth = $month-1;
            $daysInThePrevMonth = cal_days_in_month($typeOfCalendar, $prevMonth, $year);
            $prevMonthDay = $daysInThePrevMonth - $firstDayOfTheMonth+2;
        }

        
        //Days of forward month
        if( $month == 12 ){
            $fwdMonthDay = date("j", mktime(0,0,0,1,1,$year+1));
            $html[]=$fwdMonthDay;
            
        }else{
            $fwdMonth = $month+1;
            $fwdMonthDay = date("j", mktime(0,0,0,$fwdMonth,1,$year+1));
            $html[]=$fwdMonthDay;
        }
        
        
        //Create table
        $html[]='
        <table class="calendar--container">
            <tr>
                <td colspan="2"><button class="calendar__back--btn"><</button></td>
                <td colspan="3"><p class="calendar__month--text">'.$monthName.'</p></td>
                <td colspan="2"><button class="calendar__next--btn">></button></td>
            </tr>
            <tr>
                <td><p>Pon</p></td>
                <td><p>Wt</p></td>
                <td><p>Śro</p></td>
                <td><p>Czw</p></td>
                <td><p>Pią</p></td>
                <td><p>Sob</p></td>
                <td><p>Nie</p></td>
            </tr>');
        
        $dateInLoop = 0;

        for($i = 1; $i<=6; $i++){
            $html[]='<tr>;
            for( $j = 1; $j<=7; $j++ ){
                if( $i === 1 && ($j === $firstDayOfTheMonth-1) ){
                    $html[]="<td><p class='other__month__day--text'>$prevMonthDay</p></td>";
                    $dateInLoop = 1;
                }else if( $i === 1 && ($j >= $firstDayOfTheMonth) ){
                    $html[]="<td data-day='$dateInLoop'><button class='calendar__day--btn'>$dateInLoop</button></td>";
                    $dateInLoop++;
                }else if($i === 1 && ($j < $firstDayOfTheMonth)){
                    $html[]="<td><p class='other__month__day--text'>$prevMonthDay</p></td>";
                    $dateInLoop++;
                    $prevMonthDay++;
                }else if( $i != 1 && ($dateInLoop <= $daysInTheMonth) ){
                    $html[]="<td data-day='$dateInLoop'><button class='calendar__day--btn'>$dateInLoop</button></td>";
                    $dateInLoop++;
                }else if( $i != 1 && ($dateInLoop >= $daysInTheMonth) ){
                    $html[]="<td><p class='other__month__day--text'>$fwdMonthDay</p></td>";
                    $dateInLoop++;
                    $fwdMonthDay++;
                }
            }
            $html[]="</tr>";
        }
        $html[]="</table>";
        return implode( PHP_EOL, $html );
    }
    return false;
}

And then, in the main page:

<?php
    session_start();
    
    if(isset($_SESSION['isLoggedIn'])){
        if(!$_SESSION['isLoggedIn']){
            exit(header("Location: ../index.php"));
            
        }else{
            if(isset($_GET['month']) || isset($_GET['year'])){
                if(!empty($_GET['month']) || !empty($_GET['year'])){
                    include('../php/getuserinfo.php');
                    include('../php/is_profile_activated.php');
                    include('../php/profile_dates.php');
                    
                    
                    #call the calendar that now returns HTML string
                    $calhtml=( function_exists('generateCalendar') ) ? generateCalendar() : false;
                }
            }else{
                $month = date('m');
                $year = date('Y');
                exit( header( "Location: http://localhost/php/page--xampp--phpmailer/subpages/profile__dates.php?month=$month&year=$year)" );
            }
        }
    }else{
        die(header("Location: ./login.php"));
    }
?>

Later, in that same page ( where the generateCalendar method was originally called )

<?php

    # echo the calendar data
    if( $calhtml ) echo $calhtml; 

?>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM