login  Naam:   Wachtwoord: 
Registreer je!
 Forum
Zoeken  Regels  Help
Categorieën > PHP & SQL

PHP OOP en Ajax (Opgelost)

JelmerVisser – 14/12/2011 14:11
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.


Pagina:

16 antwoorden

Gesponsorde links
Daisycon - Verdien geld met uw website

WouterJ – 14/12/2011 16:35 (Laatst gewijzigd op 14/12/2011 16:36)
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.

Ibrahim – 14/12/2011 16:48
Met een wachtwoord lekker ongecodeerd opsturen 

WouterJ – 14/12/2011 17:21
@Ibrahim, daarom zei ik ook een hele erge versimpeling van de werkelijkheid.  

JelmerVisser – 15/12/2011 16:39
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.

WouterJ – 15/12/2011 17:31
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.

JelmerVisser – 19/12/2011 08:57 (Laatst gewijzigd op 19/12/2011 10:24)
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.


Dlol – 19/12/2011 10:43
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.

JelmerVisser – 19/12/2011 10:50
Heb ik ook al geprobeerd, alleen dit geeft alsnog dezelfde fout.

Ibrahim – 19/12/2011 17:52
Moet je de variabele eens dumpen, kijken wat voor waarde het heeft.

JelmerVisser – 21/12/2011 13:23 (Laatst gewijzigd op 21/12/2011 13:29)
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.

Gesponsorde links


Pagina:

Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten:

© 2002-2012 Sitemasters.be - Regels - Gehost door: Vircon - Laadtijd: 0.307s