0

I m using a free domain and puted all my fails in and changed the db settings and so on and i got this error

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /srv/disk3/1618254/www/netdisk.eu.pn/mojprofil.php:2) in /srv/disk3/1618254/www/netdisk.eu.pn/core/init.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /srv/disk3/1618254/www/netdisk.eu.pn/mojprofil.php:2) in /srv/disk3/1618254/www/netdisk.eu.pn/core/init.php on line 2

Parse error: syntax error, unexpected '[' in /srv/disk3/1618254/www/netdisk.eu.pn/classes/DB.php on line 113

Works fine on localhost though.

My init.php:

<?php
session_start();

$GLOBALS ['config'] = array(
    'mysql' => array(
        'host' => 'asd',
        'username' => 'asd',
        'password' => 'asd',
        'db' => 'asdr'
    ),
    'remember' => array(
        'cookie_name' => 'hash',
        'cookie_expiry' => 604800
    ),
    'session' => array(
        'session_name' => 'user',
        'token_name' => 'token'
    )
);

spl_autoload_register(function($class) {
    require_once 'classes/' . $class . '.php';

});

require_once 'functions/sanitize.php';
if(Cookie::exists(Config::get('remember/cookie_name')) && !Session::exists(Config::get('session/session_name'))) {
    $hash = Cookie::get(Config::get('remember/cookie_name'));
    $hashCheck = DB::getInstance()->get('users_session', array('hash', '=', $hash));
    if($hashCheck->count()) {
        $user = new User($hashCheck->first()->user_id);
        $user->login();
    }
}
?>

and DB.php

<?php
class DB {
    private static $_instance = null;
    private $_pdo,
            $_query,
            $_error = false,
            $_results,
            $_count = 0;

    private function __construct() {
        try {
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') .';dbname=' . Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }

    public static function getInstance() {
        if(!isset(self::$_instance)) {
            self::$_instance = new DB();
        }
        return self::$_instance;
    }

    public function query($sql, $params = array()) {
        $this->_error = false;
        if($this->_query = $this->_pdo->prepare($sql)) {
            $x = 1;
            if(count($params)) {
                foreach($params as$param) {
                    $this->_query->bindValue($x, $param);
                    $x++;
                }
            }
            if($this->_query->execute()) {
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            } else {
                $this->_error = true;
            }
        }
        return $this;
    }

    public function action($action, $table, $where = array()) {
        if(count($where) === 3) {
            $operators = array('=', '>', '<', '>=', '<=');

            $field     = $where[0];
            $operator  = $where[1];
            $value     = $where[2];

            if(in_array($operator, $operators)) {
                $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

                if(!$this->query($sql, array($value))->error()) {
                    return $this;
                }
            }
        }
        return false;
    }
    public function get($table, $where) {
        return $this->action('SELECT *', $table, $where);
    }
    public function delete($table, $where) {
        return $this->action('DELETE', $table, $where);
    }
    public function insert($table, $fields = array()) {
       $keys = array_keys($fields);
       $values = '';
       $x = 1;

       foreach($fields as $field) {
           $values .= "?";
           if($x < count($fields)) {
               $values .= ', ';
           }
           $x++;
       }

       $sql = "INSERT INTO {$table} (`" . implode('`, `', $keys) . "`) VALUES({$values})";

       if(!$this->query($sql, $fields)->error()) {
           return true;
       }
       return false;
    }
    public function update($table, $id, $fields) {
        $set = '';
        $x = 1;

        foreach($fields as $name => $value) {
            $set .= "{$name} = ?";
            if($x < count($fields)) {
            $set .= ',';
            }
            $x++;
        }

        $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";

        if(!$this->query($sql, $fields)->error()) {
            return true;
        }
        return false;
    }

    public function results() {
        return $this->_results;
    }
    public function first() {
        return $this->results()[0];
    }

    public function error() {
        return $this->_error;
    }

    public function count () {
        return $this->_count;
    }
}

?>
lenart95
  • 45
  • 1
  • 7
  • 1
    Again, because your host has an old PHP version. You cannot do this prior to PHP 5.4: `return $this->results()[0];` You must store `$this->results()` to a new variable then dereference `[0]` from it. – Michael Berkowski Feb 12 '14 at 17:49
  • If the `headers already sent` errors don't show on your local development, verify that you have error reporting turned on and display errors on. Always do this in development. `error_reporting(E_ALL); ini_set('display_errors', 1);` Then read http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php – Michael Berkowski Feb 12 '14 at 17:50
  • @MichaelBerkowski i found a domain with PHP version 5.5.7 and MySQL version 5.1 – lenart95 Feb 12 '14 at 17:53
  • Make sure you are actually using 5.5.7, because that line, which is 113 of DB.php uses 5.4+ syntax. Check `phpinfo()` to make sure you have the version you think you have. – Michael Berkowski Feb 12 '14 at 17:58
  • @MichaelBerkowski ok i fixed that now i only got the problem headers already sent but idk how to really fix it... is there anyway we could talk somewhere in private? – lenart95 Feb 12 '14 at 18:04
  • The error points you to the source of the output (which may just be a linebreak as detailed in the question I linked above. `output started at /srv/disk3/1618254/www/netdisk.eu.pn/mojprofil.php:2` So carefully analyze `mojprofil.php` at line 2. Something there is causing output, and _no output_ can be sent before `header()` or `setcookie()` or `session_start()`. Usually it is just an errant space or linebreak, such as before the opening ` – Michael Berkowski Feb 12 '14 at 18:06
  • is it possible its this? ` ` – lenart95 Feb 12 '14 at 18:08
  • 1
    If that appears before your PHP code executes, then yes that is the source of the error. There can be nothing at all sending output, which means nothing outside of `` before calling `session_start()`. – Michael Berkowski Feb 12 '14 at 18:09
  • @MichaelBerkowski thanks very much that removed some errors but i got new again ... Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /srv/disk3/1618233/www/netdisk.co.nf/Template.php:4) in /srv/disk3/1618233/www/netdisk.co.nf/core/init.php on line 2 you can check them here anyway : http://netdisk.co.nf/index.php – lenart95 Feb 12 '14 at 18:16
  • 1
    Same problem. `Template.php` sends some output at line 4, before `session_start()` is called. You can't do that. You need to move the call to `session_start()` to occur before anything else. Move it to the very top of the first included script. This isn't just with newer PHP versions. Your old one and your local site had this problem too but you must have had `display_errors` turned off so you never noticed it. – Michael Berkowski Feb 12 '14 at 18:23
  • ok that worked but when i press register i get this problem Warning: require_once(classes/input.php): failed to open stream: No such file or directory in /srv/disk3/1618233/www/netdisk.co.nf/core/init.php on line 22 Fatal error: require_once(): Failed opening required 'classes/input.php' (include_path='.:/usr/local/php-5.5.7/share/pear') in /srv/disk3/1618233/www/netdisk.co.nf/core/init.php on line 22 – lenart95 Feb 12 '14 at 18:29

0 Answers0