2011-03-09 4 views
0

Je vais garder cela simple. Pourquoi appeler session_start() en haut de mon script PHP, je reçois cette sortie en bas:session_start() provoque une erreur fatale

Fatal error: Exception thrown without a stack frame in Unknown on line 0 

Que se passe-t-il?

EDIT: Quelques détails supplémentaires car j'ai isolé le problème plus loin.

index.php (extrait):

<?php 
session_start(); 

require_once('inc/database.php'); 
require_once('inc/gallery.php'); 
... 

database.php:

<?php 
try { 
    $dsn = 'mysql:host=localhost;dbname=tees_db'; 
    $pdo = new PDO($dsn, '[username removed]', '[password removed]'); 
} 
catch (PDOException $e) { 
    header('HTTP/1.1 503 Service Unavailable'); 
    die('There was an error connecting to the database.'); 
} 

gallery.php (extrait):

<?php 
class Gallery { 
    private $pdo; 
    public function __construct() { 
     global $args, $pdo, $request; 
     $this->pdo = $pdo; 
    } 
    ... 
} 
$gallery = new Gallery(); 

Le problème vient du j'essaie classe Gallery quand et lui assigner global $pdo variable en tant que propriété de classe. Pourquoi est-ce que cela causerait une erreur fatale quand $pdo est juste une instance de PDO?

EDIT 2: J'ai trouvé la fermeture de mon navigateur et relancer (tuer la session) supprime l'erreur. L'erreur est uniquement déclenchée lorsque inc/confirm.php est appelée.

inc/confirm.php est un script utilisé dans la confirmation de plus de 18 ans. Le contenu est minimal:

session_start(); 

if (isset($_GET['mod'])) { 
    $mod = $_GET['mod']; 
    $_SESSION[$mod] = '1'; 
} 

header('Location: '.$_SERVER['HTTP_REFERER']); 
exit; 

Comme vous pouvez le voir, enregistre simplement une clé dans le tableau $_SESSION et redirige vers la page d'origine. Rien sur les exceptions ou les dés-constructeurs de classes là-dedans.

+0

http://bugs.php.net/bug.php?id=33598? Êtes-vous sûr que c'est le session_start()? – n00b

+0

Je n'ai pas de méthodes '__destruct', et encore moins d'exceptions jetées en une; et je l'ai isolé à l'appel 'session_start()' en le supprimant, ce qui supprime également l'erreur. –

+0

mais si session_start échouait, l'erreur s'afficherait en haut de la page .... – n00b

Répondre

0

Je suppose qu'il n'y a pas d'écho ou d'impression avant la session _start.

S'il y a un espace vide avant l'appel de fonction, essayez de le retirer.

Essayez ob_clean avant d'appeler session_start. Je ne connais pas les effets secondaires. :(

Essayez

0

NO GLOBALS !!!!!!!

créer une enveloppe pour la connexion de base de données (classe singleton est 'OK' si vous avez seulement un db - si vous avez plus une version modifiée est nécessaire (holla si vous avez besoin par exemple)).

puis il suffit d'utiliser

class Gallery { 
    private $pdo; 
    public function __construct() { 

     $this->pdo = DBObj::getInst(); 
    } 
    ... 
} 
$gallery = new Gallery(); 

si vous pouvez être pris la peine de factoriser et ont encore probs juste holla.

Je ne pense pas vraiment que le problème est ici que ...

Je couru

session_start(); 

try { 
    $dsn = 'mysql:host=localhost;dbname=DB'; 
    $pdo = new PDO($dsn, 'UN', 'PW'); 
} 
catch (PDOException $e) { 
    header('HTTP/1.1 503 Service Unavailable'); 
    die('There was an error connecting to the database.'); 
} 

class Gallery { 
    private $pdo; 
    public function __construct() { 
     global $args, $pdo, $request; 
     $this->pdo = $pdo; 
    } 

} 

$gallery = new Gallery(); 

et obtenir aucune erreur ...

+0

Je viens de le voir. Ce n'est pas mon code, c'est le code dont j'ai hérité;) –