login  Naam:   Wachtwoord: 
Registreer je!
 Forum

PHP OOP en Ajax (Opgelost)

Offline JelmerVisser - 14/12/2011 14:11
Avatar van JelmerVisserLid Hallo allemaal,

Voor een opdracht op school ben ik bezig met een groot script in PHP met OOP, maar hierbij wil ik gebruik maken van ajax om de gegevens op te halen etc.

Hoe werkt dit met ajax, normaal geef je een url mee naar het bestand met het script erin, maar nu staat alles in classes en functies vanwege de OOP natuurlijk.

Hoe kan je dit benaderen met ajax? Of moet je voor die gedeeltes gewoon geen functies gebruiken en buiten de class gaan scripten?

Nu maak ik al gebruik van PHPLiveX die de gegevens via javascript en php omzet zodat het met ajax gebruikt kan worden, maar dit werkt voor mij niet helemaal lekker, en weet ook niet of dit helemaal veilig is.
Is er een standaard manier voor?

Alvast bedankt.

16 antwoorden

Gesponsorde links
Offline WouterJ - 14/12/2011 16:35 (laatste wijziging 14/12/2011 16:36)
Avatar van WouterJ HTML gevorderde Het enige wat je met AJAX kunt doen is een pagina ophalen en de content daarvan op een site plaatsen.

Als je nou met AJAX een login systeem wilt maken, doormiddel van OOP PHP natuurlijk, dan zul je 1 pagina moeten maken waarop de PHP code voor het inloggen staat (login.ajax.php), hierin staat alle PHP code voor het inloggen. En je hebt PHP pagina's met de classes erin:
  1. function __autoload( $file ) {
  2. require_once 'classes/'.strtolower($file).'.class.php';
  3. }
  4.  
  5. try {
  6. $system = new LogInSystem();
  7. $user = new User($_POST['username']);
  8. $user->setPass($_POST['password']);
  9. $system->addUser($user);
  10. $system->login();
  11. }
  12. catch(Exception $e) {
  13. echo $e->getMessage();
  14. }


De autoload functie is om de classes te laden en vervolgens loggen we een user in. Deze pagina noemen we login.ajax.php.

Vervolgens maken we een login.php bestand aan. Hierin kan de user zichzelf inloggen:
  1. <label>Naam: <input type="text" name="naam" id="username"></label><br>
  2. <label>Wachtwoord: <input type="password" name="pass" id="pass"></label><br>
  3. <input type="submit" value="Log In">
  4. </form>

En dan de JS code in login.php:
  1. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  2. <script>
  3. $(function() {
  4. jQuery.ajax({
  5. url : 'login.ajax.php',
  6. type : 'POST'
  7. data : 'username=' + $('#username').val() + '&password=' + $('#pass').val(),
  8. success : function( result ) {
  9. $('#result').html(result);
  10. }
  11. });
  12. });
  13. </script>


Zoiets zou het er dan uit moeten zien, natuurlijk is dit een hele erge versimpeling van de werkelijkheid.
Bedankt door: JelmerVisser
Offline Ibrahim - 14/12/2011 16:48
Avatar van Ibrahim PHP expert Met een wachtwoord lekker ongecodeerd opsturen 
Offline WouterJ - 14/12/2011 17:21
Avatar van WouterJ HTML gevorderde @Ibrahim, daarom zei ik ook een hele erge versimpeling van de werkelijkheid.  
Offline JelmerVisser - 15/12/2011 16:39
Avatar van JelmerVisser Lid Ik heb het even geprobeerd op deze manier, maar krijg het niet helemaal lekker werkend.

Mijn functie ziet er als volgt uit:

  1. class Authorisation{
  2.  
  3. private $sKey = 'NkrK5Vb6rh';
  4.  
  5. public function validateLogin($username, $password){
  6. global $Database;
  7. if ($statement = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?")){
  8. $statement->bind_param("ss", $username, md5($password . $this->sKey));
  9. $statement->execute();
  10. $statement->store_result();
  11. if($statement->num_rows > 0){
  12. $statement->close();
  13. $_SESSION['logged_in'] = true;
  14. $_SESSION['username'] = $username;
  15. return true;
  16. }else{
  17. $statement->close();
  18. return false;
  19. }
  20. }else{
  21. die("ERROR: Could not prepare MySQLi statement!");
  22. }
  23. }
  24. }


Moet ik dat dan op deze manier in het bestandje zetten?

  1. function __autoload( $file ) {
  2. require_once 'classes/'.strtolower($file).'.class.php';
  3. }
  4.  
  5. try {
  6. $Template = new Template();
  7. $Authorisation = new Authorisation($_POST['username'], $_POST['password']);
  8. }
  9. catch(Exception $e) {
  10. echo $e->getMessage();
  11. }


Alvast bedankt voor de goede hulp!

Jelmer.
Offline WouterJ - 15/12/2011 17:31
Avatar van WouterJ HTML gevorderde Je weet wat dat scriptje doet?

Regel 1 - 3, hierin zien we de __autoload functie. Deze wordt geroepen zodra je een nieuwe class aanroept (dus met new Classname()).
In de functie zien we dat we dan de classnaam gaan include. We gebruiken _once zodat het bestand niet onnodig vaak wordt geïncluded. Verander het eventuele path en bestandsnaam als dat bij jou anders is.
try { ... } catch(Exception $e) { ... }, bij try zetten we alle code en zodra daar een fout in is worden we door gestuurd naar catch. Hierin doen we wat met de foutmelding, in dit geval een echo.
Deze manier heet Exceptions en is de foutafhandeling voor OOP, voor meer informatie:
- PHP.net: exception
- http://phptuts.nl/view/35/8/

Met AJAX roep je nu het bestand aan. Vervolgens krijg je met AJAX de waarde terug die je ziet als je het bestand opent. Met deze waarde kun je in JS wat doen.
Offline JelmerVisser - 19/12/2011 08:57 (laatste wijziging 19/12/2011 10:24)
Avatar van JelmerVisser Lid EDIT: Het is nu gelukt, heb nu echter weer een ander probleem, namelijk ik krijg een error bij prepare();

  1. Fatal error: Call to a member function prepare() on a non-object in /home/jelmer/domains/mandarijnsleren.nl/public_html/classes/authorisation.class.php on line 12


Eerder werkte het gewoon, ik zie de fout niet, ik heb de variabel wel een global meegegeven. Kunnen jullie wat ontdekken?:

  1. public function validateLogin($username, $password){
  2. global $Database;
  3. if ($statement = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?")){
  4. $statement->bind_param("ss", $username, md5($password . $this->sKey));
  5. $statement->execute();
  6. $statement->store_result();
  7. if($statement->num_rows > 0){
  8. $statement->close();
  9. $_SESSION['logged_in'] = true;
  10. $_SESSION['username'] = $username;
  11. return true;
  12. }else{
  13. $statement->close();
  14. return false;
  15. }
  16. }else{
  17. die("ERROR: Could not prepare MySQLi statement!");
  18. }
  19. }


Alvast bedankt.

Jelmer.

Offline Dlol - 19/12/2011 10:43
Avatar van Dlol Lid In de plaats van de database global te maken kan je hem veel beter meegeven in de constructor van je object en dan de database opslaan in een interne private variabele.
Offline JelmerVisser - 19/12/2011 10:50
Avatar van JelmerVisser Lid Heb ik ook al geprobeerd, alleen dit geeft alsnog dezelfde fout.
Offline Ibrahim - 19/12/2011 17:52
Avatar van Ibrahim PHP expert Moet je de variabele eens dumpen, kijken wat voor waarde het heeft.
Offline JelmerVisser - 21/12/2011 13:23 (laatste wijziging 21/12/2011 13:29)
Avatar van JelmerVisser Lid Oke, ik heb het kunnen oplossen, en heb geen errors meer, echter krijg ik geen respons als ik de goede gebruikersnaam en wachtwoord invoer.

Zouden jullie kunnen checken of ik het zo goed doe?:

Ajax:

  1. jQuery.ajax({
  2. url : '../../../includes/initialize.inc.php',
  3. type : 'POST',
  4. data : 'username=' + $('#user_name').val() + '&password=' + $('#password').val(),
  5. success : function( response ) {
  6. if(response){
  7. $("#login_form").fadeOut("normal");
  8. $("#msgbox").fadeTo(200,0.1,function(){
  9. $(this).html('Bezig met inloggen...').addClass('messageboxok').fadeTo(900,1,
  10. function(){
  11. window.setTimeout(document.location='logged_in.php', 1000);
  12. });
  13. });
  14. }else{
  15. $("#msgbox").fadeTo(200,0.1,function(){
  16. $(this).html('Gebruikersnaam of wachtwoord onjuist...').addClass('messageboxerror').fadeTo(900,1);
  17. });
  18. }
  19. }
  20. });


initialize.inc.php:

  1. function __autoload( $file ) {
  2. require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/'.strtolower($file).'.class.php';
  3. }
  4.  
  5. try {
  6. $Template = new Template();
  7. $Authorisation = new Authorisation();
  8. $Authorisation->validateLogin($_POST['username'], $_POST['password']);
  9. }
  10. catch(Exception $e) {
  11. echo $e->getMessage();
  12. }


Hij geeft als je met de goede gebruikersnaam en wachtwoord probeer in te loggen elke keer:

  1. Gebruikersnaam of wachtwoord onjuist...


Alvast bedankt,

Jelmer.
Offline WouterJ - 21/12/2011 19:27
Avatar van WouterJ HTML gevorderde if(response)

Wat bevat response? Oftewel wat echo je op de pagina? True of false of wat anders? Want als het wat anders is klopt je if niet.
En mocht je true echoen in PHP dan komt er op het scherm 1 te staan. Dus dan wordt je if:
if( response == '1' )

En mocht je false echoen in PHP dan komt er op het scherm 0 te staan. Dan wordt de if:
if( response == '0' )
Offline JelmerVisser - 22/12/2011 16:01 (laatste wijziging 09/01/2012 08:41)
Avatar van JelmerVisser Lid Ja hij return true, maar hij stuurd de 1 wel door naar de pagina zelf, alleen de ajax lijkt de response niet te ontvangen.
Als ik echo true; meegeef, dan zie ik links bovenin de pagina een 1 verschijnen.
Maar in de POST staat er bij response helemaal niks.
Ook als ik return true; meegeef krijg ik geen response naar de ajax functie toe.
Ik snap er even helemaal niks meer van.

Iemand?

Jelmer.
Offline WouterJ - 09/01/2012 19:05
Avatar van WouterJ HTML gevorderde Roep je wel de juiste pagina aan met ajax?
Offline JelmerVisser - 10/01/2012 19:50
Avatar van JelmerVisser Lid Ja, hij krijgt contact met het bestand.
Krijg ook een waarde terug, als ik een alert(response) doe, dan krijg ik ook een alert met een 1.
Hij gaat alleen niet verder.

Je kan een online voorbeeld zien op:

http://www.mandarijnsleren.nl

Jelmer.
Offline vinTage - 10/01/2012 21:30
Avatar van vinTage Nieuw lid doe dit eens:

  1. <input id="submit" class="submit" type="submit" value="Inloggen..." name="login" onclick="return false">

Want volgens mij submit je het form vooraleer er daadwerkelijk iets 'javascript-achtigs' gebeurd (mede door je timeouts/intervals/delays/etc)
Offline JelmerVisser - 11/01/2012 11:37
Avatar van JelmerVisser Lid Dit werkt inderdaad, ik dacht al dat hij een soort van refreshde als er gesubmit werd.
Bedankt!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.249s