Masalah "Cannot Modify Header" di PHP

assalamualaikum,

jadi gini saya punya project blog, dimana pasti ada CRUD nya, pas di localhost gk ada masalah, begitu saya hosting ke public saya coba2 edit ternyata gk redirect, tapi data udah berubah.

saya uda cari2 masalahnya sama solusinya, di forum sekolah sekolah koding, bahkan stackoverflow ternyata tinggal nambahin ob_start() ,ob_flush dan setelah saya coba work!!

tapi saya bingung apakah itu normal dan emang harus ditambahin fungsi itu ? atau itu emang ada masalah sama script saya ? soalnya di localhost gk ada masalah apapun.

mohon pencerahannya terima kasih

avatar naufalhfzhn
@naufalhfzhn

172 Kontribusi 59 Poin

Diperbarui 7 tahun yang lalu

6 Jawaban:

Script redirectnya gimana gan?

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

script redirect itu yg apa bang ? ini ni contoh script yang pas mau bagian edit

 <?php
    require_once 'core/init.php';
    if (!isset($_SESSION['nama_user']) ) {
      header("Location: index.php");
    }//check author session============

    require_once 'template/header.php';

    $error = ' ';
    $id       = $_GET['id'];

    if (isset($_GET['id']) ) {
      $post = show_per_id($id);

      while ($row = mysqli_fetch_assoc($post) ) {
        $first_title = $row['title'];
        $first_content = $row['content'];
        $first_tag = $row['tag'];
      }

    }
// END SHOW DATA ON SPECIFIC ID
 ?>
      <section id="content">
        <div class="wrapper">
            <h2 class="crud">Edit Note </h2>
            <form class="crud" action="" method="post">
              <label for="title"> Title :</label>
              <input id="title" type="text" name="title" value="<?= $first_title; ?>">

              <label for="content"> Content :</label>
              <textarea id="content" name="content" rows="8" cols="40"><?= $first_content; ?> </textarea>

              <label for="tag"> Tag :</label>
              <input id="tag" type="text" name="tag" value="<?= $first_tag; ?>">
              <input type="submit" name="submit" value="Edit Note">
              <?php
              if (isset($_POST['submit']) ) {
                $title = $_POST['title'];
                $content = $_POST['content'];
                $tag = $_POST['tag'];

                //CHECK IF NOTHING IS EMPTY
                if ( !empty(trim($title)) && !empty(trim($content)) && !empty(trim($tag)) ) {
                  //EDIT POST FUNCTION
                  if (edit_post($title, $content, $tag, $id) ) {
                    header("Location: index.php"); // ini redirectnya  jadi kalo uda di edit harusnya redirect
                  }else {
                    $error = "ada masalah saat menambah data";
                    echo "<div class='error'> $error </div>";
                  }
                  // END ELSE
                }else {
                  $error = "Nggak boleh ada yg kosong";
                  echo "<div class='error'> $error </div>";
                }
                // END ELSE
              }
              // END BIG IF
              ?>
            </form>
            <a class="back" href="index.php"> << kembali </a>

          </div><!-- END CONTAINER -->
      </section><!-- END CONTENT -->

 <?php require_once 'template/footer.php'; ?>

avatar naufalhfzhn
@naufalhfzhn

172 Kontribusi 59 Poin

Dipost 7 tahun yang lalu

sebenernya uda work kok bang saya tambahin ob_start() , tapi saya bingung apakah emang harus ditambahin ob_start() gitu ?

avatar naufalhfzhn
@naufalhfzhn

172 Kontribusi 59 Poin

Dipost 7 tahun yang lalu

Jawaban Terpilih

problemnya agan pakai redirect header() setelah muncul output di browser http://php.net/manual/en/function.header.php

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

jadi header hanya bisa berjalan bila belum ada output yang dihasilkan oleh php script. disini agan pakai header() setelah muncul html tags, jadi muncul error "Cannot modify headers, headers already sent".

// END SHOW DATA ON SPECIFIC ID
 ?>
      <section id="content">
        <div class="wrapper">
            ...
              <?php
              if (isset($_POST['submit']) ) {
                $title = $_POST['title'];
                $content = $_POST['content'];
                $tag = $_POST['tag'];

                //CHECK IF NOTHING IS EMPTY
                if ( !empty(trim($title)) && !empty(trim($content)) && !empty(trim($tag)) ) {
                  //EDIT POST FUNCTION
                  if (edit_post($title, $content, $tag, $id) ) {
                    header("Location: index.php"); // ini redirectnya  jadi kalo uda di edit harusnya redirect

seperti terlihat diatas, header("Location: index.php") muncul setelah <section> tags dan banyak lagi yang lain teroutput di browser. harusnya muncul sebelum html tags. perkara ini berjalan di localhost mungkin karena beda environtment dan output_buffering aktif di localhost agan.

ob_start() fungsinya untuk menjalankan output buffering, jadi output yang muncul tidak langsung di stream ke browser tapi ditampung ke internal memory, baru ketika ob_flush() muncul semua output di munculkan ke browser. jadi ketika ditengah script ada header() masih bisa berjalan asalkan sebelum ob_flush().

ob_start ob_flush memang tidak harus, tapi saya juga sering menggunakan karena menurut saya outputnya lebih elegan, ngga partial (stream). tapi penggunaan di script yang besar kalau ga hati2 juga berpotensi boros memory.

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

oalah iya2 baru mudeng, berati emang ada kesalahan di script saya ya.

nah masalahnya itu kalo yang bagian if submit sampe seterusnya nanti saya pindahin keatas , bagian message errornya jadi pindah kebagian atas dong, saya pengennya kalo bagian message errornya ada di bagian tepat setelah form.

avatar naufalhfzhn
@naufalhfzhn

172 Kontribusi 59 Poin

Dipost 7 tahun yang lalu

uda solve bang tanpa pake ob_start ama ob_flush , ane akalin pindahin ke atas semua kecuali messagenya tetep di bawah, walaupun codenya kyk berantakan gitu sih.

avatar naufalhfzhn
@naufalhfzhn

172 Kontribusi 59 Poin

Dipost 7 tahun yang lalu

Login untuk ikut Jawaban