Frage von lutzxs, 68

Warum kriege ich diesen PHP Fehler?

Nun ja ich versuche gerade nach diesem Tutorial (bei Google der 2. Link wenn man nach "create simple CMS" sucht) einen kleinen CMS zu schreiben bzw wie mir wahrscheinlich manche kommen werden copy&paste .. bin halt nicht so der PHP profie .. Big Sorry?

Also nun ja ich habe was mit der pear.php in dem Fehler gesehen und der war richtig gesetzt also der Pfad (C:\xampp\php\pear\PEAR.php). Der Pfad von Article.php ist auch richtig gesetzt glaube ich (C:\xampp\htdocs\cms\classes\Article.php). Ich benutze XAMPP v3.2.2 auf windows 10. Und eh ja. Ich weiß nicht weiter wäre nett wenn ihr helfen könntet.

Mit freundlichen Grüßen

Lutz

Der Fehler:

Warning: require(C: mpp\htdocs\cms\classes\Article.php): failed to open stream: Invalid argument in C:\xampp\htdocs\cms\config.php on line 12

Fatal error: require(): Failed opening required 'C: mpp\htdocs\cms\classes\Article.php' (include_path='C:\xampp\php\pear') in C:\xampp\htdocs\cms\config.php on line 12

config.php:

<?php
ini_set( "display_errors", true );
date_default_timezone_set( "Europe/Berlin" );  // <a href="http://www.php.net/manual/en/timezones.php">http://www.php.net/manual/en/timezones.php</a>
define( "DB_DSN", "mysql:host=localhost;dbname=cms" );
define( "DB_USERNAME", "root" );
define( "DB_PASSWORD", "" );
define( "CLASS_PATH", "C:\xampp\htdocs\cms\classes" );
define( "TEMPLATE_PATH", "C:\xampp\htdocs\cms\templates" );
define( "HOMEPAGE_NUM_ARTICLES", 6 );
define( "ADMIN_USERNAME", "lutzxs" );
define( "ADMIN_PASSWORD", "James123" );
require( CLASS_PATH . "\Article.php" );
 
function handleException( $exception ) {
  echo "Sorry, a problem occurred. Please try later.";
  error_log( $exception->getMessage() );
}
 
set_exception_handler( 'handleException' );
?>

Und Article.php:

http://pastebin.com/8TvNQNUd

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von mastema666, 39

Da wird etwas falsch interpretiert in:

define( "CLASS_PATH", "C:\xampp\htdocs\cms\classes" );

Benutze da besser Single Quotes, in Double Quotes wird der Inhalt nochmal ausgewertet, und weil der Backslash ein "escape"-Zeichen ist wird dort dann aus dem "\xa" ein Leerzeichen (oder anderes, nicht sichtbares, Sonderzeichen, kenne die grad nicht auswendig).

Also so:

define('CLASS_PATH', 'C:\xampp\htdocs\cms\classes');

Ist btw finde ich sowieso die "schönere" Variante, und man geht eben sicher, dass das in den Quotes "wörtlich" genommen wird.

Hier ist das Problem auch nochmal etwas näher erklärt: 
http://stackoverflow.com/questions/24847523/why-does-xa-not-appear-when-outputti...

Und allgemein zum Unterschied Single vs Double Quotes: 
http://www.linuxcommand.org/wss0060.php

Kommentar von lutzxs ,

Danke mein CMS funktioniert jetzt .. soo und jetzt Setz ich mich mal an ein tolles CSS Design :D

Antwort
von TanteHolger, 21

Moin,
Dei Problem liegt darin, dass Backslashes in Strings die in doppelte Anführungszeichen gesetzt sind als Escapesequenzen interpretiert werden, \x ist zum Beispiel eine davon.
Die Fehler sind in folgenden Zeilen.

define( "CLASS_PATH", "C:\xampp\htdocs\cms\classes" );
define( "TEMPLATE_PATH", "C:\xampp\htdocs\cms\templates" );

Um den String nun richtig auszuwerten gibt es folgende Möglichkeiten.
Entweder Du setzt vor jedem \ ein anführendes \, praktisch so

define( "CLASS_PATH", "C:\\xampp\\htdocs\\cms\\classes" );
define( "TEMPLATE_PATH", "C:\\xampp\\htdocs\\cms\\templates" );

oder Du Packst die Zeichenkette in einfache Anführungszeichen '

define( "CLASS_PATH", 'C:\xampp\htdocs\cms\classes' );
define( "TEMPLATE_PATH", 'C:\xampp\htdocs\cms\templates' );


Weitere Informationen dazu findest Du in der PHP-Dokumentation unter http://php.net

Gruß: Holger


Kommentar von lutzxs ,

Auch dir danke der Beste Antwort Stern geht aber leider an masterma666 einfach weil er früher geantwortet hat :/ Aber trotzdem danke :D

Kommentar von TanteHolger ,

Null Problemo und viel Erfolg mit Deinem Vorhaben und beim Lernen. =)

Antwort
von RedKungFuMastr, 17

Du kannst Composer nutzen, um deine Klassen automatisch zu laden ohne mehrere require/include einzusetzen: https://getcomposer.org/

<?php

require __DIR__ . '/vendor/autoload.php';

Zu deinen Pfaden, mach es besser so:

<?php // index.php

define('BASE_PATH', __DIR__);

require BASE_PATH.'/cms/config.php';
// Ein normaler Server hat KEIN C-Laufwerk...

require BASE_PATH.'/vendor/autoload.php';
<?php // config.php

define('CLASS_PATH', BASE_PATH.'/classes');
// ...

Bevor du dich an ein eigenes CMS traust, solltest du dir unbedingt ein CMS zuerst mal anschauen. Die Auswahl ist Groß. Wordpress, Laravel, etc pp...

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten