Avatar billede mrg Nybegynder
07. maj 2004 - 18:33 Der er 28 kommentarer og
1 løsning

Header i PHP fil

Hej,

Jeg er i gang med at samle en hjemmeside - og al den php koden er der en anden der laver for mig, så derfor dette spørgsmål.

Problem:
En af siderne har koden
header("Location: login.php?sti=update_playerstats_form");
- som smider brugeren hen på login, hvis vedkommende ikke er logget ind.

Men det giver fejlen:
Warning: Cannot modify header information - headers already sent by (output started at C:\W3Sites\2508dk\www\fcva\db_connect.php:47)

Ovenstående er sidste linie i connect-filen. Jeg fik at vide at det kunne være jeg skulle have noget ob_start () og ob_end_flush() i filerne - men er der en der kan forklare mig om det lyder rigtigt - og om det er noget der skal sættes ind i alle filerne?
Det er kun de sider med ovenstående 'header' kode der laver møg i den.
Avatar billede human Nybegynder
07. maj 2004 - 18:35 #1
Det er fordi du skriver til skærmen før headeren.
Avatar billede mrg Nybegynder
07. maj 2004 - 18:37 #2
- og så skulle man lige huske at jeg ikke aner noget som helst om php-koderi...så du må meget gerne uddybe ?
Avatar billede human Nybegynder
07. maj 2004 - 18:37 #3
Så kom med din kode.
Avatar billede mrg Nybegynder
07. maj 2004 - 18:39 #4
Fra hvilken fil ? Den der giver fejlen ?
Avatar billede hmortensen Nybegynder
07. maj 2004 - 18:40 #5
Lyder underligt at du har noget output i en connect fil
Avatar billede mrg Nybegynder
07. maj 2004 - 18:41 #6
Connect-filen:

<?php
//alle kald til db går via denne fil (og KUN denne!!)


//etablerer forbindelse til db, giv user og psw med som arg
function db_connection($usr,$pwd){
      $host = "localhost";
      $db = "fcva00328";
      $user = "2508dk";
      $pass = "sp88sr";
      $link = mysql_connect($host, $user, $pass)
    or die("Could not connect: " . mysql_error());
    mysql_select_db($db);

    return $link;     
  }

function query($query) {
      $result = mysql_query($query);
      return $result;
  }

//lukker forbindelsen til db
function close() {
      mysql_close();
  }

//laver result om til et array af results, giv result af query med
function db_result_to_array($result){
    $result_array = array();
   
    for($i=0;$row = @mysql_fetch_array($result);$i++){
        $result_array[$i] = $row;
    }
   
    return $result_array;
}

?>
Avatar billede mrg Nybegynder
07. maj 2004 - 18:42 #7
He he - og så fik jeg lige sendt jer db-adgangskoden...
Avatar billede hmortensen Nybegynder
07. maj 2004 - 19:00 #8
Kan du ik lige smide koden hvor det her indgår:
header("Location: login.php?sti=update_playerstats_form");
Avatar billede mrg Nybegynder
07. maj 2004 - 19:01 #9
Update-fil:

<?php
session_start();
//script til at opdatere kort, bøder, sidste bøde
//MÅ KUN GØRES AF bødeformænd adgang = '2'

require_once("db_connect.php");
require_once("check_vars.php");
require_once("global_user_validator.php");
require_once("user_validator.php");

if(check_sess_and_cookie()){
   
    $adgang = check_accesslevel();
   
    //hvis bruger ikke har min 2 i adgang, må vedkommende ikke gøre dette
    if($adgang < 2){
        echo "Du har ikke adgang til at opdatere kort, bøder, sidste bøde!";
        return;
    }
    update_playerstats();
}else{
    //bruger sendes til login.php, da han ikke er logget ind
    //STI SKAL ÆNDRES!!!!!!!!!!!!
    header("Location: login.php?sti=update_playerstats_form");
    return;
}

function update_playerstats(){
   
    //hvis denne er sat er der trykket på submit på siden...
    if(!empty($_POST['brugernavn'])) {
       
        $bruger     = $_POST['brugernavn'];
        $navn        = $_POST["1"];
        $yellow     = $_POST["2"];
        $red         = $_POST["3"];
        $fines         = $_POST["4"];
        $lastfine     = $_POST["5"];
                       
        $db = db_connection("test", "test");
        $q = "update spiller set yellowcard = '$yellow',redcard = '$red', fines = '$fines',lastfine = '$lastfine' where brugernavn = '$bruger'";
        $result = query($q);
        $error = mysql_error($db);

        if($error){
            echo "<br> noget gik galt! Fejl: ".$error;
        }else{
            echo "<p>Bruger <i><strong>$bruger</strong></i> blev opdateret!<p>";
        }
    }
       
    //hvilket hold er brugeren tilknyttet
    $hold = $_SESSION['userlevel'];
    $db = db_connection("test", "test");
    //får fat i alle spillere tilknyttet holdet
    $q = "SELECT brugernavn, navn, yellowcard AS 'Gule kort', redcard AS 'Røde kort', fines AS 'Bøder ialt', lastfine AS 'Seneste bøde' FROM spiller WHERE hold = '$hold' ORDER BY brugernavn";
    $res = query($q);

    if(!mysql_num_rows($res) > 0){
        echo "Ingen spillere i databasen med hold id: $hold <br>";
        return;
    }
?>

Der kommer også en masse kode efter dette...men fejlen opstår altså ved 'header'...
Avatar billede fangel Nybegynder
07. maj 2004 - 19:24 #10
jeg kan kun få db_connect filen til at være ~45 linier, men fejlen siger at output kommer fra linie 47... tjek lige at der ikke er fx et linieskift efter ?> i bunden af filen..

altså

---
....
....
?>

---

Morten
Avatar billede mrg Nybegynder
07. maj 2004 - 19:48 #11
Ok - connect filen indeholder et par //linier til sidst - dem klippede jeg ud. Derfor har du kun ca. 45 linier...
Avatar billede fangel Nybegynder
07. maj 2004 - 19:57 #12
ok - har du noget mod at bringe filen i dens fulde længde, og med linienumre på (ellers sætter jeg linienumre på)

Morten
Avatar billede mrg Nybegynder
07. maj 2004 - 19:58 #13
<?php
//alle kald til db går via denne fil (og KUN denne!!)


//etablerer forbindelse til db, giv user og psw med som arg
function db_connection($usr,$pwd){
      $host = "localhost";
      $db = "fcva00328";
      $user = "2508dk";
      $pass = "sp88sr";
      $link = mysql_connect($host, $user, $pass)
    or die("Could not connect: " . mysql_error());
    mysql_select_db($db);

    return $link;     
  }

function query($query) {
      $result = mysql_query($query);
      return $result;
  }

//lukker forbindelsen til db
function close() {
      mysql_close();
  }

//laver result om til et array af results, giv result af query med
function db_result_to_array($result){
    $result_array = array();
   
    for($i=0;$row = @mysql_fetch_array($result);$i++){
        $result_array[$i] = $row;
    }
   
    return $result_array;
}

/*
grant select, insert, update, delete
on fcva.*
to user@localhost identified by 'password';
*/ 



?>
Avatar billede hmortensen Nybegynder
07. maj 2004 - 20:05 #14
Sikker på at der ikke er et mellemrum og/eller linieskift efter '?>' ?
Avatar billede mrg Nybegynder
07. maj 2004 - 20:23 #15
der er et enkelt mellemrum efter >
Avatar billede mrg Nybegynder
07. maj 2004 - 20:25 #16
Nu fjernede jeg så mellemrummet - og så giver den fejl i en anden af de kaldte filer (user_validator)...hvad sker der ?

User_validator ser således ud...

<?php
// Særligt relevant her er metoden redirection()
// I denne sættes de sider brugeren skal dirigeres hen på
// alt efter hvilket hold han spiller på.
// f.eks ændres hold_1.php til 'http://www.fcva.dk?hold=1'
// hvis ingen af statements opfyldes redirectes default til 1/2. holds side(til gæster)

// resten af metoderne nedefter skal der ikke pilles ved...

ob_start();

/*
$_SESSION['username'] er brugernavn i db       
$_SESSION['userlevel'] er hold i db           
$_SESSION['accesslevel'] er adgang i db
*/

require_once("db_connect.php");
require_once("url_vars.php");

function redirection() {
       
    if ($_SESSION['userlevel'] == "1") {
        // redirect
        header("Location: default2.php?hold=1");
    }
    //står her kun for en sikkerheds skyld, gammel!
    //ingen skal have userlevel = 2, alle 1.+2. holdsspillere skal have userlevel = 1
    else if ($_SESSION['userlevel'] == "2") {
        // redirect
        header("Location: default2.php?hold=1");
    }
    else if ($_SESSION['userlevel'] == "3") {
        // redirect       
        header("Location: default2.php?hold=3");
    }
    else if ($_SESSION['userlevel'] == "4") {
        // redirect
        header("Location: default2.php?hold=4");
    }
    else if ($_SESSION['userlevel'] == "5") {
        // redirect
        header("Location: default2.php?hold=5");
    }
    else if ($_SESSION['userlevel'] == "6") {
        // redirect
        header("Location: default2.php?hold=6");
    }
    else if ($_SESSION['userlevel'] == "7") {
        // redirect
        header("Location: default2.php?hold=7");
    }
    else if ($_SESSION['userlevel'] == "8") {
        // redirect
        header("Location: default2.php?hold=8");
    }
    else {
        // The variabel $_SESSION['userlevel'] is not set - - error. Send the user to 1. og 2. holds home page.
        header("Location: default2.php?hold=1");
    }
}

//returnerer bruger til script som bliver givet med i $file, f.eks: $file = add_spiller_form
//$file skal angives UDEN endelsen .php!!!
function redirector($file){
    //tilføjer .php til filnavnet
    $file = $file. ".php";
    //du skal bruge nedenstående URL går jeg ud fra....
    //$location = "http://www.fcva.dk/". $file;
    $location = "http://mrg/fcva/". $file;
    header("Location: $location");
}

//chekker om session variable er sat
function check_User_Session_Variables() {

    if(isset($_SESSION['username'])){
        if(isset($_SESSION['userlevel'])){
              if(isset($_SESSION['userlevel'])){   
                  return true;
              }else{
                return false;
                  }   
          }else{
              return false;
            }
    }else{
        return false;
          }
}

//chekker om der findes en cookie
function check_Cookie() {

        if (isset($_COOKIE['fcva'])){ 
            // Cookie present
            return true;
        }
        else {
            // Cookie NOT present
            return false;
        }
}

//validerer cookie, hvis valid sættes sessvar, ellers sættes sessvar til guest   
function validate_Cookie_Database() {
       
        // Read the values from the cookie
        $cookie_info = explode("-", $_COOKIE['fcva']);  //Extract the Data
          $name = $cookie_info[0];
          $pass = $cookie_info[1];

        db_connection("test","test");
        $result = query("SELECT * FROM spiller WHERE brugernavn = '$name'");
        $num = mysql_numrows( $result );         

        if ($num == 1) {
              //der findes én bruger med det brugernavn
            //chek om password er rigtigt først!

            $row = mysql_fetch_array($result);
           
            //tjekker om password er korrekt!
            if($pass != $row["password"]){
                    //password matcher ikke med det i db'en...
                    //sender brugeren tilbage til login.php
                    //STI SKAL ÆNDRES!!!!!!!!!!
                    $file = "login.php?psw=false&hid=true";
                    $bruger = $_POST['name'];
                    $location = delete_ws_login($file, $bruger);
                    header("Location: $location");
                    return;
            }
                       
            // User is validated - set Session_Variables           
            $_SESSION['username'] = $name;       
            $_SESSION['userlevel'] = $row["hold"];           
            $_SESSION['accesslevel'] =  $row["adgang"];
            return true;
        }           
        else {
            // This cookie is old and stale
            // Set the Session_variables to guest
            //set_Session_Variables_Guest();
            return false;
        }
}

//username skal IKKE sættes idet, det gør at andre metoder tror man er logget på!
//GÆSTER HAR IKKE NOGET USERNAME!
function set_Session_Variables_Guest(){
       
        //$_SESSION['userlevel'] = "1";
        //$_SESSION['accesslevel'] = "0";
} 

//returnerer adgangs niveau, hvis det ikke findes returneres 0
function check_accesslevel() {
    if (isset($_SESSION['accesslevel'])) {
        // the variable was set - return it
        return $_SESSION['accesslevel'];
    }
    else {
        // the variable was not set - check for cookie.
        if (check_Cookie()) {
            // User has a cookie - lets validate it.
            if (validate_Cookie_Database()) {
                return $_SESSION['accesslevel'];
            }
        }
        else {
            // user didn´t have a cookie
            return 0; // set accesslevel to guest level
        }
    }
}

ob_end_flush();
?>

Og der er IKKE mellemrum efter det sidste >
Avatar billede fangel Nybegynder
07. maj 2004 - 20:50 #17
hvad og hvor (linie) er fejlen?

Morten
Avatar billede rednex Nybegynder
08. maj 2004 - 00:36 #18
Det er en ganske almindelig fejl der som regel skyldes enten mellemrum eller linieskift før/efter PHP tags'ene i en eller flere include filer. Disse tomme linier starter så outputtet til browseren. Eftersom headerne bliver sendt inden outputtet er det ikke muligt at tilføje headers bagefter. Derfor får du den fejl.

Sørg for at fjerne alle mellemrum, linieskift og kommentarer både før og efter PHP scriptene ( dvs. alt udenfor <%php .. %> ) i alle dine include filer. Så burde problemet være løst.
Avatar billede mrg Nybegynder
09. maj 2004 - 15:24 #19
Hmmm...tak for generel info...men den fejl i user_validator (ovenstående kode, fra 20.25) giver altså fejl i næstsidste linie

ob_end_flush();

Hvad kan det så skyldes ?
Avatar billede fangel Nybegynder
09. maj 2004 - 15:29 #20
og hvad er fejlen?
Avatar billede mrg Nybegynder
09. maj 2004 - 15:55 #21
Den samme som før:

Warning: Cannot modify header information - headers already sent by (output started at C:\W3Sites\2508dk\www\fcva\user_validator.php:177)
Avatar billede rednex Nybegynder
09. maj 2004 - 16:03 #22
Jeg tror stadig du bliver nødt til at gå ALLE de filer igennem du includer og lede efter tomme linier.
Avatar billede fangel Nybegynder
09. maj 2004 - 16:24 #23
hmm - ob_end_flush udskriver intet (men returnere bool) - så det er ikke den linie (med mindre den linie fejl, og udskriver en fejl medd.)

Morten
Avatar billede mrg Nybegynder
09. maj 2004 - 16:27 #24
ok - men det er kun tomme linier/mellemrum udenfor php tags ?

Ser på det i aften - men tak for buddene...
Avatar billede rednex Nybegynder
09. maj 2004 - 16:31 #25
Ja, alt udenfor php tags skal væk.
Avatar billede mrg Nybegynder
09. maj 2004 - 21:24 #26
Hmmmm...nu har jeg altså været filerne igennem - der er intet udenfor php tags i de filer jeg includer...

Og det er fortsat en fejl i linien med

ob_end_flush();

Hvad gør dette ob_start og ob_end_flush ???
Avatar billede hmortensen Nybegynder
09. maj 2004 - 21:25 #27
Tømmer bufferen mener jeg...

Prøv at udkommenterer de 2 linier
Avatar billede mrg Nybegynder
09. maj 2004 - 21:27 #28
Fatter ingenting - nu virker det pludselig - kan I ikke lægge nogle svar, så jeg kan strø lidt point ud ?

Tusind tak for bistand !
Avatar billede fangel Nybegynder
09. maj 2004 - 23:12 #29
nu har jeg i hvert fald lagt et - så kan du acceptere det hvis du vil

Morten
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester