Postingan lainnya
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
6 Jawaban:
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'; ?>
sebenernya uda work kok bang saya tambahin ob_start() , tapi saya bingung apakah emang harus ditambahin ob_start() gitu ?
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.
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.
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.