Ajax-Request mit JQuery unter PHP (OOP)

Davicito

Erfahrenes Mitglied
Ich meld mich mal wieder bei Euch, da ich gerade mit einem Ajax-Request so meine Probleme habe.

Unter einem MVC-Pattern möchte ich nun ein Ajax-Request bauen, in dem ein dynamischer Inhalt geladen werden soll.

Dazu habe ich zu Testzwecken folgenden JQuery-Code in einem Template eingebaut, der im Grunde auch das macht, was es tun soll
HTML:
<head>
    <script src="http://code.jquery.com/jquery-latest.js"></script>       
               
    <script>
         $(document).ready(function(){
             $("#test").load("Ajax/refresh.php");
         });
    </script>       
</head>

Dieses Script ruft dann eine refresh.php-Script-Datei auf, in dem ein simples echo"test"; steht
PHP:
<?php
     namespace Ajax;

     echo"test";
?>

Das funktioniert auch prima!

Nun will ich diese Script-Datei so erweitern, dass das Script nicht ausgeführt werden kann, wenn sich vorher kein Benutzer authentifiziert hat.
Dazu will ich aus meinem Model, die statische Methode "checkUser()" aufrufen (s. PHP-Script)
PHP:
<?php
  namespace Ajax;
  use MVC\Model\Model;
  include('MVC\Model\Model.php');

  //echo"test";

  if(Model::checkUser())
      echo"true";
  echo"false";   
?>

Leider wird hier die Model-Klasse nicht gefunden, obwohl ich eigentlich mit use und include die Klasse eingebunden habe. Was habe ich hier übersehen? s. nachfolgende Fehlermeldung
Code:
Warning: include(MVC\Model\Model.php): failed to open stream: No such file or directory in C:\xampp\htdocs\Message\Ajax\refresh.php on line 4

Warning: include(): Failed opening 'MVC\Model\Model.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Message\Ajax\refresh.php on line 4

Fatal error: Class 'MVC\Model\Model' not found in C:\xampp\htdocs\Message\Ajax\refresh.php on line 11

kann ich vielleicht in der OOP-Welt kein einfache PHP-Script-Datei ausführen oder liegt das an der Verwendung von Namespace??

Ich danke im Voraus, für Eure Hilfe!!

Davicito.
 
Hallo,

lies die Fehlermeldung! Aus dem ersten Satz geht ganz klar daraus hervor, dass die Datei nicht gefunden wird.

OOP ist dein refresh.php eher nicht. Normalerweise hat man eine Controller-Klasse, von der man eine eigene Klasse ableitet (z. B. RefreshController).
Auch dass Model::checkUser() existiert, ist schlechtes Design. Wieso sollte deine "Root-Model" Klasse solch eine statische Funktion enthalten?

Übrigens ist es empfehlenswert, seine <script>-Tags kurz bevor </body> zu platzieren. Dann ist der Seitenaufbau schneller.
 
Hallo ComFreak,

vielen Dank erstmal für die schnelle Antwort ^^.
Also ich hab auch nicht behauptet, das meine refresh.php OOP ist des wegen auch Script-Datei also prozeduraler Code!
Hallo,
Aus dem ersten Satz geht ganz klar daraus hervor, dass die Datei nicht gefunden wird.

Das hatte ich bereits erwähnt!
Hallo,
Leider wird hier die Model-Klasse nicht gefunden, obwohl ich eigentlich mit use und include die Klasse eingebunden habe.
Nur ist das echter Käse, da diese Model-Datei existirt. ich binde so in jedem anderen Controller mit der selben Befehlszeile include("MVC\Model\Model"); und mit use MVC\Medel\Model; die selbe Klasse ein und es geht... nur in der prozeduralen-Script-Datei klappt es leider nicht.

z.B rufe ich aus einer Auth-Kontrollerklasse auch das Model so auf. und es funktioniert auch
PHP:
namespace MVC\Controller;

use MVC\Model\Model;    

require_once('MVC\Model\Model.php');

class AuthController {
......
}

Meine Orderstruktur ist folgende:

htdocs\Message\Template\MenuTempl.php (JQuery-Code)
htdocs\Message\MVC\Model\Model.php (checkUser()-Methode)
htdocs\Message\Ajax\refresh.php (Script zum ausführen des Ajax-Request)

Hallo,
Auch dass Model::checkUser() existiert, ist schlechtes Design. Wieso sollte deine "Root-Model" Klasse solch eine statische Funktion enthalten?

Ich möchte nur den Umweg vermeiden, immer erst ein Instanzobjet mit new aufzurufen das ist alles! ich sehe da jetzt kein schlechtes Design!

Hallo,
Übrigens ist es empfehlenswert, seine <script>-Tags kurz bevor </body> zu platzieren. Dann ist der Seitenaufbau schneller.

OK, das hab ich noch nicht gewusst. Schließlich wird in der Literatur es so beschrieben, das es im Head zustehen hat.

LG, Davicito
 
Zuletzt bearbeitet von einem Moderator:
Hi,

du musst immer relativ von dem Script ausgehen, welches aufgerufen wird. Da dein Ajax-Php-Script direkt aufgerufen wird, geht er hier von "htdocs\Message\Ajax\" aus und nicht von dem htdocs oder Projektverzeichnis. Von daher findet er die Datei nicht und kann sie nicht einbinden.

Ich möchte nur den Umweg vermeiden, immer erst ein Instanzobjet mit new aufzurufen das ist alles! ich sehe da jetzt kein schlechtes Design!
Doch, das ist schlechtes Design. Ein Model ist dumm, es enthält lediglich Daten, führt aber selbst keine Logik aus oder ruft andere Controller auf. Die Methode wäre in einem Controller oder einer Hilfsklasse besser aufgehoben.

Grüße,
BK
 
Sofern du keinen Autoloader benutzt, hast du doch das Problem selbst schon gelöst:
Meine Orderstruktur ist folgende:
htdocs\Message\Template\MenuTempl.php (JQuery-Code)
htdocs\Message\MVC\Model\Model.php (checkUser()-Methode)
htdocs\Message\Ajax\refresh.php (Script zum ausführen des Ajax-Request)
Du hast den Pfad relativ von refresh.php falsch angegeben. Genau das hat dir die Fehlermeldung auch gesagt ;)
Vielleicht verwechselst du Namespaces und Pfade. Die haben miteinander nichts zu tun, außer wenn du Autoloader + den PSR-4 Standard verwendest.
OK, das hab ich noch nicht gewusst. Schließlich wird in der Literatur es so beschrieben, das es im Head zustehen hat.
Dann bist du an unvollständige Literatur geraten. Ich empfehle dir das Mozilla Developer Network (MDN) als Quelle für HTML, JavaScript, CSS etc.
 
Verstehe... ich danke Euch für die hilfreichen Tipps und werde sie beherzigen ^^!!
Konnte es Dank Euch, den Fehler beheben!

Bratkartoffel hat gesagt.:
Doch, das ist schlechtes Design. Ein Model ist dumm, es enthält lediglich Daten, führt aber selbst keine Logik aus oder ruft andere Controller auf. Die Methode wäre in einem Controller oder einer Hilfsklasse besser aufgehoben.

Das leuchtet mir ein... nur will ich vermeiden, das in der refresh.php
nichts ausgeführt werden kann, wenn kein Benutzer angemeldet ist. Wer weiß schon ob nicht einer auf die dumme Idee kommen könnte, das refresh-Script einfach so auszuführen ;-)
Wenn ich schon eine Methode "checkUser()" besitze, ist es ja schlecht diese nicht zu verwenden
Wie würdet Ihr das sonst machen, im Ajax-Request?
 
Zuletzt bearbeitet von einem Moderator:
Die Sicherheitsmaßnahme ist auch korrekt!
Es ging mir und der gebratenen Kartoffel darum, dass die statische Funktion checkUser() nichts mit der Model-Klasse zu tun hat, trotzdem dort aber verwahrt wird.

Das PHP-Framework CakePHP stellt beispielsweise ein Component-System bereit. Jeder Controller kann die Komponenten deklarieren, die er gedenkt zu nutzen.


PS: Wieso erscheint bei deinen Zitaten immer "ComFreek", obwohl ich gar nicht der Autor von denen bin? ;) Ist nun korrigiert.
 
Zurück