Bonjour, comme tous mes prédecesseurs j'ai fini le site selon le tuto "magnifique question apprentissage" de grafikart et j'ai comme eux du mal à le mettre en ligne.
Je poste par desespoir de cause après avoir passé toute la nuit a tenter toutes les méthodes précédentes et aucune ne marche (j'ai parcouru la moitié du forum jusque là).
J'ai pris la peine de changer PATH_INFO par ORIG_PATH_INFO et de corriger l'erreur BASE_URL.'/'.$url à la fin du fichier router.

htaccess sous forme :

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule (.*) webroot/$1 [L]

quoique le RewriteBase ne change rien du tout et le FollowSlink et le multiviews non plus c'est indifférent à mon serveur

je vous mets un lien pour verifier le resultat vous-meme parceque j'ai du mal à expliquer ce que j'ai comme probleme

http://www.foxolution.net/posts/view/33 (La racine du site donne une page blanche et je recois un 404 (en fait ma propre page d'erreur 404) meme si l'id 33 existe bien à la base de données)

Je tiens enfin a préciser que je suis sur un hebergement mutualisé qui roule sous php 5.2 et que le site est placé dans un répertoire public_html (ou son alias www) non pas directement à la racine du site

Je vous serai tres tres reconnaissant de vous pencher sur mon cas (je suis épuisé).
Toute aide est la bienvenue je vous prie juste de jeter un coup d'oeil su le lien et me faire part de vos suggestions sur OU SE SITUE LE PROBLEME car vous voyez que le navigateur affiche du resultat mais qui est totalement tronqué : S'agit-il d'un problème htaccess (je crois pas puisque ça marche quand meme) de version php 5.2 (mais y a pas eu recours a des fonctionnalités récentes dans le tuto ?)... Bref je suis perdu...
Merci d'avance.

17 réponses


Xtr3me
Réponse acceptée

Dans la fonction classe remplace ton code existant avec PATH_INFO par ça:

$this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/';

Pour les fonctions du Routeur:

/**
    * Permet de générer une url à partir d'une url originale
    * controller/action(/:param/:param/:param...)
    **/
    static function url($url = ''){
        trim($url,'/');
            $Url = new Url();
            $url = $Url->noaccent($url);
        foreach(self::$routes as $v){
            if(preg_match($v'originreg'],$url,$match)){
                $url = $v'redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url);
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url);
            }
        } 

        return 'http://'.$_SERVER'HTTP_HOST'].BASE_URL.'/'.str_replace(" ","-",$url); 
    }
    static function webroot($url){
        trim($url,'/');
        return 'http://'.$_SERVER'HTTP_HOST'].BASE_URL.'/'.$url; 
    }

Tu peux à la limite enlever le 'http://'.$\_SERVER'HTTP\_HOST'] dans la fonction webroot moi je l'utilise ainsi mais ça risque d'être gênant dans ton cas.

Krycek
Auteur
Réponse acceptée

WOW quelle journée;
pour résumer 2 "vraies" problèmes sont sortis de toute cette mésaventure:
1 : dans mon serveur on utilise l'ancienne appellation mysql_escape_string meme si elle est obsolète (pensez-y si vous etes sous php 5.2)
2 : Il peut arriver que l'usage d'un nom de controlleur, action, modele... debute tantot en majuscules tantot en minuscule soit tolerée sur MAMP (et j'imagine WAMP Et XAMP) -ce qui inclut les noms de chaines dans une variable evidemment- à tel point que ça passe inaperçu lors de la conception mais ça t'explose à la figure dès que tu mets le contenu en ligne et vous aurez une page blanche si les erreurs ne sont pas activées au serveur.
3 : je n'ai pas cessé de répéter que ORIG_PATH_INFO c comme PATH_INFO mais non, à un certain moment j'ai eu une erreur et j'ai donc utilisé $this->url = $_SERVER'REQUEST_URI'] à la place. pour BASE_URL et ses problemes de slash en prime je l'ai remplacé par le nom du domaine direct 'http://nomdedomaine.net'

"Je vous ai épargné l'histoire des majuscules et pleines d'autres que j'ai du regler avant de pouvoir ENFIN uploader mon premier site POO MVC"

ce poste fait aussi le point sur l'histoire de htaccess et du path_info;
j'espère qu'il sera en mesure d'aider quelqu'un à l'avenir comme j'ai été supporté par les posts d'autres utilisateurs.

Krycek
Auteur

Alors voilà je continue a developper : remarquez le lien Actualites (le seul qui s'affiche au menu) il renvoie sur http:/// (je sais en moins que la fonction rooter::url pose probleme) mais lequel ???

c bizzare tout ça... La je dois préciser que mon hebergeur supporte l'url rewriting
Les options prises en charge par mon hebergeur mutualise qui tourne avec php 5.2 sont
Environnement :
Bases de données
PHP 5, CGI, Perl, SSI, XML
Zend Optimiser, ionCube Loader
mod_rewrite, cURL, .htaccess,
GD Library )

Je crois que ça a un rapport avec BASE_URL ?? meme en remplacant par l'adresse du site quand je definie BASE_URL ça donne la meme chose..
je continue de tester
Aidez-moi plz

Krycek
Auteur

Encore une precision :
quand j'enleve le '/' des 2 return BASE_URL a la fin du fichier rooter pour avoir le code suivant :

foreach(self::$prefixes as $k=>$v){
if(strpos($url,$v) === 0){
$url = str_replace($v,$k,$url);
}
}
return BASE_URL.$url; //ici initialement c'etait return BASE_URL.'/'.$url;
}

static function webroot($url){
trim($url,'/');// c'est ici que grafikart nous propose d'enlever le slash
return BASE_URL.$url;
}

}

RESULTAT : le lien actualités n'affiche plus http:/// comme j'ai dit avant mais bien l'adresse de mon site.
Mais je garde toujours un site qui ne rime à rien comme vous pouvez constater
Du coup je garde ce dernier code et je continue de tester sauf si quelqu'un me donne une solution avec le code précédant

Krycek
Auteur

SVP si quelqu'un a modifié les fonctions du router (parse , url, connect...) pour s'adapter a son hebegeur merci de m'envoyer le code.
je crois que ça vient de la la ainsi que du path_info dans le fichier request(sur mon serveur c orig_path_info qui marche mais je sais plus si je dois ajouter le '/' a la fin du code comme proposé par certains ou pas ; en plus ce maudit slash dans request faut l'adapter a la fin du code du router : BASE_URL.'/'.$url... )
moi je m'en sortirai pas je pourrai pas modifier le code de grafikart c pour ça que je vous demande SVP de m'afficher votre code si vous l'avez modifié Merci

Krycek
Auteur

Je deviens lourd -je le sais- mais ce doit etre l'effet nuit blanche pardonnez-moi
c'est juste pour dire que je crois finalement que le probleme du routage request path_info et tout ça est resolu du moment ou l'onglet actualites dans le lien en haut pointe vers la bonne adresse quelque soit le methode (j'en ai esseyé plusieurs et toutes corrigent bien l'adresse dans mon lien)
Il doit donc s'agir d'autre chose. un autre probleme quelque part ailleurs ( C dommage parceque la je ne sais pas du tout par ou commencer)finalement je vais esseyez de comprendre pourquoi la page users/login ne s'affiche pas vu que c'est une page relativement simple -quand je tappe cockpit ça me renvoie vers cette page-la bonne page- donc le routage fais son travail maintenant)
Help

Essaye l'option +Multiviews en plus de FollowSymLinks.

Krycek
Auteur

merci pour la réponse : deja esseyé et ça marche pas...
mais je vais encore testé après avoir reglé le probleme du rooting.

Krycek
Auteur

C officiel cela ne marche pas les .htaccess sont clean.
je crois pas que ce soit le Model car la connexion se fait avec la base je penche pour le controller (De toute façon c le mieu placé pour creer une sacrée pagaille) mais ca n'a pas de sens puisque ca marche en local en plus j'ai le message d'erreur alors le controller marche.
C le Model alors qui plante ???

Krycek
Auteur

au fait j'ai passé toute la matinée sur ca; dans mon serveur inutile d'appeler PATH_INFO ça marche pas soit utiliser ORIG_PATH_INFO direct soit une methode utilisant HTTP_REQUEST en remplacant trim url par autre chose ca marche aussi. mais je vais utiliser ton code pour en avoir le coeur net. donne moi qq minutes (ou secondes)pour adapter tout ca avec ce que j'ai maintenat (et qui marche;je crois;)

Krycek
Auteur

C est bien comme j'ai dit ton code marche comme les autres - si on utilise ORIG_PATH_INFO- (et une methode de plus) c'est juste que mon probleme ne vient pas de la
c le controller ?? mé ca n'a pas de sens il aurait du planter en local, idem pour le model

sinon je te passe les reconnections que j'ai a partir du fichier conf juste apres les parametres de connexion:
Router::prefix('cockpit','admin');
Router::connect('','posts/index');
Router::connect('cockpit','cockpit/Posts/index');
Router::connect('blog/:slug-:id','Posts/view/id:([0-9]+)/slug:([a-z0-9-]+)');
Router::connect('blog/*','Posts/*');

Ce code est bon ??

Krycek
Auteur

le probleme est que j'ai pas de messages d'erreurs php (en dehors du 404 qui disons-le ne devrait pas apparaitre puisque l'id appelé existe)
je n'ai que des pages blanches

Krycek
Auteur

je suis un con, j'avais l'affichage des erreurs desactive par defaut sur mon serveur..
je pourrai tracer le probleme maintenant et je suis curieux d'en connaitre l'origine mais je sens que la fin est proche (Quel con-Moi-)

Krycek
Auteur

deja premier constat si jamais quelqu'un rencontre ce probleme. j'ai travaillé avec mysql_real_escape_string en local vu que mysql_escape_string est obsolete
mais vu que mon hebergeur est toujours sous php 5.2 c'est l'ancienne appellation qu'il fallait utiliser. meme si la derniere devrait etre supportee avec le 5.2 mais bon, un probleme de moin.

Moralité : Pour les pages blanches voyez du cote du model et du controller :)
si vous etes sous php 5.2 vous pouvez utiliser les fonctions obsoletes :)

On continue...

En même temps t'es marrant tu veux de l'aide mais à part le .htaccess et les deux fonctions url/webroot tu nous passes pas le code qui serait potentiellement missible.
De plus utilises la fonction quotes de PDO le MVC utilises PDO autant l'utiliser à fond plus que d'utiliser des fonctions comme MySQL_real_escape_string qui seront dépréciées...

Krycek
Auteur

merci xtr3me quand j'ai commencé a voir les erreurs C T dejà presque fini sinon tu as raison pour mysql_escape il existe la fonction PDO::quote() c'est juste que retirer le real etait plus facile dans le feu de l'action . mais faudra la remplacer par PDO c'est plus sur meme sur un ancien serveur php 5.2(qui supporte tt de meme PDO)
merci a toi

J'ai été confronté comme tout le monde à ce genre problème et non PATH_INFO n'est pas identique à ORIG_PATH_INFO quand j'ai eu à faire à des dossiers virtuels j'étais bien embêté parce-que les deux ne sont pas identique justement.