[PHP] headers already sent by
0Dość częstym i banalnym błędem jest headers already sent by, który pojawia się w momencie próby wysłania nagłówków do przeglądarki. Oznacza to, że przed wysłaniem jakichkolwiek treści strony musimy wysłać wszystkie nagłówki. Najczęściej problem stwarzany jest przez użycie funkcji session_start() lub setcookie(). Poniższy przykład wygeneruję nam omawiany błąd.
<?php echo 'hello there!'; // Zainicjowanie sesji session_start(); ?>
Aby rozwiązać problem wystarczy przesunąć session_start() na początek w ten sposób:
<?php // Zainicjowanie sesji session_start(); echo 'hello there!'; ?>
Includowanie i headers already sent by
Kolejną sprawę, która trzeba omówić są pliki includowane. Przypuścmy, że to jest nasz index.php:
<?php include './a.php'; include './b.php'; // Zainicjowanie sesji session_start(); ?>
ten to: a.php
<?php $init = false; ?>
a poniższy to: b.php
<?php echo '$init = '.($init === true ? 'true' : 'false'); ?>
Najlepszym rozwianiem tego problemu jest inicjowanie mechanizmu sesji na początku pliku głównego czyli index.php powinien wyglądać tak:
<?php // Zainicjowanie sesji session_start(); // Inne operacje include './a.php'; include './b.php'; ?>
Używanie bufora ob_start()
Niby to jest proste lecz co w przypadku kiedy trzeba będzie wysłać cookie w środku skryptu? Tutaj kłania się budowa skryptu. Normalnie wygląda to w ten sposób, że najpierw jest generowana cała strona, a dopiero na końcu parsowana i wysyłana do przeglądarki. W naszym wypadku kiedy wysłaliśmy już coś do przeglądarki z pomocą przychodzi nam bufor. Poniżej znajduję się przykład jak go zastosować.
<?php
ob_start(); // Definitywnie na początku
?>
<html>
<head>
</head>
<body>
<?php
echo 'I like bananas';
setcookie('TestCookie', 'The banana');
?>
</body>
</html>
<?php
ob_end_flush();
?>
Jedyne co musimy pamiętać to fakt, że ob_start() umieszczamy na samym początku pliku zaś ob_end_flush() na końcu.
session_start() na początku i nadal jest błąd
Czasami zdarza się, że mamy taki oto kod:
<?php session_start(); ?>
Na pierwszy rzut oka powinno działać lecz jeżeli nowicjusz zapisze ów kod w notatniku to ten kochany program doda na początku pliku zbędne znaki, które są powodem problemów. Odpowiednie kodowanie pliku ma znaczenie dlatego też przestrzegam przed takimi praktykami! Wyjątkiem od reguły może być parametr auto_prepend_file w php.ini. Może się zdarzyć, że serwer będzie dorzucał automatycznie jakiś plik przed wygenerowaniem naszej strony. Sytuacje te są sporadycznie spotykane! Pamiętajmy, że używanie bufora może spowolnić dzianie serwisu szczególnie przy dużej ilości użytkowników dlatego też staramy się dobrze pisać aplikacje webowe i stosować ob_start() w ostatecznosci
Czasami zdarza się, że mamy taki oto kod:
Skrypt kodujący hasło w md5
0Witam poniżej przedstawiam skrypt na zakodowanie hasła w md5 . Korzystając z takiego skryptu wrzuconego na serwer , mamy pewność , że nasze hasło nie zostało nigdzie zapisane co sprzyja bezpieczeństwu.
<?php
header('Content-Type: text/html; charset=utf-8');
echo '<form action="" method="post">
Haslo dostepu do skryptu: <input type="password" name="haslodostepu" value="haslo"><br />
Haslo do zakodownia: <input type="password" name="md5passy" value="haslo"
onBlur="if(this.value==\'\') this.value=\'haslo\';" onFocus="if(this.value==\'haslo\') this.value=\'\';" ><br />
<input type="submit" value="Generuj MD5!">
</form>';
$haslo = $_POST['haslodostepu'];
$passy = $_POST['md5passy'];
if (isset($haslo))
{
if ($haslo != 'haselkodostepu')
{
echo 'bledne haslo';
}
else
{
echo md5($passy);
}
}
?>
$haslo = $_POST['haslodostepu'];
haslodostepu zmieniamy na swoje hasło i to tyle.
Siemka
0Siemka witam na blogu , blog będzie mi służyć jako pisanie wpisów i tutoriali z dziedzin webmasteringu jaki grafiki.