login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Sessies weg na Facebook login

Offline GroundZero - 11/06/2013 17:41
Avatar van GroundZeroLid Beste,

ik laat gebruikers inloggen op mijn website via de Facebook API. Echter heb ik elke keer een fout waar ik niet voorbij kom. Ben inmiddels 3 dagen bezig zonder oplossing. Ik hoop dat iemand mij uit de brand kan helpen.

Overigens, ELKE pagina die ik gebruik daar staat boven:

Citaat:
ob_start();
session_start();


Ik heb een link, als de gebruiker hierop klikt word hij naar Facebook gestuurd waar hij moet bevestigen dat hij wilt inloggen via de API.

Na dit gedaan te hebben stuurt Facebook de gebruiker terug naar mijn website, dit verloopt allemaal nog keurig netjes.

Nu komt het. Ik gebruik onderstaande code om te kijken of de gebruiker al een account heeft of niet

  1. <?php
  2. if($user)
  3. {
  4. $query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
  5. WHERE
  6. email = "'.mysql_real_escape_string($user_info['email']).'"');
  7. $rows = mysql_num_rows($query);
  8.  
  9. if($rows == 1)
  10. {
  11. $fetch = mysql_fetch_assoc($query);
  12.  
  13. $_SESSION['userid'] = $fetch['id'];
  14. $_SESSION['company'] = $fetch['company'];
  15. $_SESSION['email'] = $fetch['email'];
  16. $_SESSION['password'] = $fetch['password'];
  17. $_SESSION['account_type'] = $fetch['account_type'];
  18.  
  19. echo 'ACCOUNT BESTAAT AL, klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan...';
  20. echo '<br /> '.$_SESSION['email'];
  21. }
  22. else
  23. {
  24. $gender = $user_info['gender'];
  25. if($gender == 'male'){
  26. $gender = EDP26;
  27. }elseif($gender == 'female'){
  28. $gender = EDP27;
  29. }
  30.  
  31. mysql_query('INSERT INTO site_users
  32. (name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
  33. VALUES
  34. ("'.mysql_real_escape_string($user_info['first_name']).'",
  35. "'.mysql_real_escape_string($user_info['last_name']).'",
  36. "'.mysql_real_escape_string($gender).'",
  37. "'.mysql_real_escape_string($user_info['email']).'",
  38. "'.mysql_real_escape_string($user_info['link']).'",
  39. "'.mysql_real_escape_string('http://graph.facebook.com/'.$user_info['id'].'/picture?type=large').'",
  40. 1,
  41. 3,
  42.  
  43. $query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
  44. WHERE
  45. email = "'.mysql_real_escape_string($user_info['email']).'"') or die(mysql_error());
  46. $fetch = mysql_fetch_assoc($query);
  47.  
  48. $_SESSION['userid'] = $fetch['id'];
  49. $_SESSION['company'] = $fetch['company'];
  50. $_SESSION['email'] = $fetch['email'];
  51. $_SESSION['password'] = $fetch['password'];
  52. $_SESSION['account_type'] = $fetch['account_type'];
  53.  
  54. echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan.';
  55. echo '<br /> '.$_SESSION['email'];
  56. }
  57. }
  58. else
  59. {
  60. echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
  61. }
  62. ?>


Probleem 1
In plaats van de "hier" links om de gebruiker door te sturen had ik het volgende:

  1. header('Location: '.ROOT.'/profile');


Echter gebeurde er niks... er werd geen direct gedaan, ik heb ze nu dus als tekstuele links geplaatst.

Probleem 2
Wanneer ik op de pagina profile kom, krijg ik een hoop foutmeldingen. Dit omdat de SESSIES niet bestaan.

Ga ik naar een andere pagina, dan bestaan de sessies wel vreemd genoeg. Het is dus dat op sommige pagina's de sessie wel bestaat, en op sommige pagina's weer niet...

Toch is het zo dat elke pagina binnen mijn index.php word geinclude, en daarmee dus ook een



code bovenaan de pagina heeft staan.

Weet iemand wat er fout kan zijn? ik word er een beetje gek van, ben nu al 3 dagen ca. 8 uur per dag bezig maar ik krijg het probleem niet opgelost.

Wanneer het een lastig probleem is dan zou het tof zijn als iemand misschien bereid is mij te helpen via Skype. Ik kan je dan de inlog van de FTP geven.

Echter hoop ik dat het probleem via het forum opgelost kan worden door iemand met ervaring van de facebook API.

Bij voorbaat dank ;)

5 antwoorden

Gesponsorde links
Offline Martijn2008 - 11/06/2013 22:01 (laatste wijziging 11/06/2013 22:03)
Avatar van Martijn2008 PHP beginner In het eerste codeblok zie ik twee variabele die je nooit hebt gedefinieerd:
1. $user
2. $user-info

Echter, ik heb geen idee of je die waardes in een ander bestand hebt gedefinieerd. Zie eens of die twee variabele waardes zijn toegekend.

  1. <h1>Waardes voor $user</h1>
  2.  
  3. <pre>
  4. <?php print_r($user); ?>
  5. </pre>
  6.  
  7. <h1>Waardes voor $user_info</h1>
  8.  
  9. <pre>
  10. <?php print_r($user_info); ?>
  11. </pre>
  12.  
  13. <?php
  14.  
  15. echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
  16.  
  17. ?>
Offline GroundZero - 12/06/2013 11:07 (laatste wijziging 12/06/2013 11:42)
Avatar van GroundZero Lid Deze worden door facebook toegekend... ze werken en bestaan echter worden de sessies gezet maar niet gevonden in andere pagina's. Ik zal even de code globaal posten:

portal.php is het bestand waar de gebruiker op de "inloggen met facebook" link klikt. Deze pagina include het bestand fbaccess.php welke je bij de Facebook API download.

  1. <?php
  2. if(isset($loginUrl))
  3. echo '<a href="'.$loginUrl.'">.</a>';
  4. ?>


Wanneer iemand niet ingelogd is, dan bestaat er dus een $loginUrl. Deze word correct weergegeven zolang iemand niet ingelogd is via Facebook. Wanneer je wel bent ingelogd dan zie je hem ook niet.

Goed, je klikt op de link. Je gaat naar Facebook zoals ik al zij. Je moet wat dingen accepteren en Facebook stuurt je door naar mijn fblogin.php pagina waar ik de volgende code heb:

  1. <?php
  2. ini_set('display_errors', 1);
  3.  
  4.  
  5. setlocale(LC_TIME, 'nl_NL');
  6.  
  7. require_once('includes'.DIRECTORY_SEPARATOR.'config.php');
  8. require_once('includes'.DIRECTORY_SEPARATOR.'functions.php');
  9. require_once('facebook/fbaccess.php');
  10.  
  11. if(isset($_COOKIE['Website_language']))
  12. {
  13. $choice = $_COOKIE['Website_language'];
  14. require_once('language'.DIRECTORY_SEPARATOR.strtoupper($choice).'_'.$choice.'.php');
  15. }
  16. else
  17. {
  18. require_once('language'.DIRECTORY_SEPARATOR.'NL_nl.php');
  19. }
  20.  
  21. $ch_query = mysql_query('SELECT row, text FROM site_checkboxes');
  22. while($ch_fetch = mysql_fetch_assoc($ch_query))
  23. {
  24. $ch_arr[$ch_fetch['row']] = $ch_fetch['text'];
  25. }
  26. ?>
  27. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  28. <html xmlns="http://www.w3.org/1999/xhtml">
  29. <head>
  30.  
  31. <meta name="description" content="" />
  32. <meta name="keywords" content="" />
  33. <meta name="author" content="" />
  34. <meta name="web_author" content="" />
  35. <meta name="contact" content="" />
  36. <meta name="copyright" content="" />
  37.  
  38. <link rel="stylesheet" type="text/css" href="css/portal.css" />
  39.  
  40. <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  41. <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
  42.  
  43. <script type="text/javascript">
  44. var _gaq = _gaq || [];
  45. _gaq.push(['_setAccount', 'account']);
  46. _gaq.push(['_trackPageview']);
  47.  
  48. (function() {
  49. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  50. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  51. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  52. })();
  53. </script>
  54.  
  55. <script type="text/javascript">
  56.  
  57. function showdata(ent){
  58. $('.port_image_holder').fadeOut('fast', function(){});
  59. $('.'+ent).fadeIn('fast', function(){});
  60. }
  61. </script>
  62.  
  63. </head>
  64. <body>
  65.  
  66. <div class="wrapper">
  67. <div class="port_menu">
  68. <fieldset>
  69. <form name="login" method="post" action="">
  70. <input type="text" name="email" value="" placeholder="E-mail" class="input_small" />
  71. <input type="password" name="password" value="" placeholder="Password" class="input_small" />
  72. <input type="submit" name="submit" value="inloggen" class="submit" />
  73. </form>
  74. </fieldset>
  75.  
  76. <?php
  77. if($_SERVER['REQUEST_METHOD'] == 'POST')
  78. {
  79. $query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
  80. WHERE
  81. email = "'.mysql_real_escape_string($_POST['email']).'"
  82. AND
  83. password = "'.mysql_real_escape_string(sha1($_POST['password'])).'"
  84. AND
  85. activated = 1');
  86. $fetch = mysql_fetch_assoc($query);
  87. $rows = mysql_num_rows($query);
  88.  
  89. if($rows == 1)
  90. {
  91. mysql_query('INSERT INTO site_login_attempts
  92. (user_id, ip_address, user_agent)
  93. VALUES
  94. ("'.mysql_real_escape_string(returnIdFromEmail($_POST['email'])).'",
  95. "'.mysql_real_escape_string($_SERVER['REMOTE_ADDR']).'",
  96. "'.mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']).'")');
  97.  
  98. $_SESSION['userid'] = $fetch['id'];
  99. $_SESSION['company'] = $fetch['company'];
  100. $_SESSION['email'] = $fetch['email'];
  101. $_SESSION['password'] = $fetch['password'];
  102. $_SESSION['account_type'] = $fetch['account_type'];
  103.  
  104. header('location: '.ROOT.'profile'.DIRECTORY_SEPARATOR);
  105. }
  106. else
  107. {
  108. echo LOG4;
  109. }
  110. }
  111. ?>
  112. </div>
  113.  
  114. <div class="port_banner">
  115.  
  116. </div>
  117. <div class="port_row">
  118. <div class="port_wide">
  119. <?php
  120. if($user)
  121. {
  122. $query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
  123. WHERE
  124. email = "'.mysql_real_escape_string($user_info['email']).'"');
  125. $rows = mysql_num_rows($query);
  126.  
  127. if($rows == 1)
  128. {
  129. $fetch = mysql_fetch_assoc($query);
  130.  
  131. $_SESSION['userid'] = $fetch['id'];
  132. $_SESSION['company'] = $fetch['company'];
  133. $_SESSION['email'] = $fetch['email'];
  134. $_SESSION['password'] = $fetch['password'];
  135. $_SESSION['account_type'] = $fetch['account_type'];
  136.  
  137. echo 'ACCOUNT BESTAAT AL, klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan...';
  138. echo '<br /> '.$_SESSION['email'];
  139. }
  140. else
  141. {
  142. $gender = $user_info['gender'];
  143. if($gender == 'male'){
  144. $gender = EDP26;
  145. }elseif($gender == 'female'){
  146. $gender = EDP27;
  147. }
  148.  
  149. mysql_query('INSERT INTO site_users
  150. (name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
  151. VALUES
  152. ("'.mysql_real_escape_string($user_info['first_name']).'",
  153. "'.mysql_real_escape_string($user_info['last_name']).'",
  154. "'.mysql_real_escape_string($gender).'",
  155. "'.mysql_real_escape_string($user_info['email']).'",
  156. "'.mysql_real_escape_string($user_info['link']).'",
  157. "'.mysql_real_escape_string('http://graph.facebook.com/'.$user_info['id'].'/picture?type=large').'",
  158. 1,
  159. 3,
  160.  
  161. $query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
  162. WHERE
  163. email = "'.mysql_real_escape_string($user_info['email']).'"') or die(mysql_error());
  164. $fetch = mysql_fetch_assoc($query);
  165.  
  166. $_SESSION['userid'] = $fetch['id'];
  167. $_SESSION['company'] = $fetch['company'];
  168. $_SESSION['email'] = $fetch['email'];
  169. $_SESSION['password'] = $fetch['password'];
  170. $_SESSION['account_type'] = $fetch['account_type'];
  171.  
  172. echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan.';
  173. echo '<br /> '.$_SESSION['email'];
  174. }
  175. }
  176. else
  177. {
  178. echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
  179. }
  180. ?>
  181. </div>
  182. </div>
  183. </div>
  184.  
  185. </body>
  186. </html>


Zoals je ziet kijkt hij of er een $user variable is. Deze is er ook! Beide checks werken. Zowel als er nog geen account in de database is, al wanneer er wel een account is. Het gaat pas fout (DENK IK) bij het zetten van de 5 sessies en het doorsturen.

De sessies worden wel gezet, maar werken slechts op bepaalde pagina's. Het doorsturen reageert helemaal nergens op.

Echter wanneer ik in plaats van doorsturen tekst plaats, dan laat hij deze zien. Dit wil dus zeggen dat de checks wel werken en hij het verschil tussen een reeds bestaand account of nog geen account wel ziet!

Ook voegt hij het account, indien nodig, toe aan de MYSQL database MET de informatie die Facebook terug geeft aan mij in het script.

Alles werkt dus, enkel het doorsturen niet en als ik op een vervolg pagina kom dan zijn de sessies niet aan te roepen... althans, op bijna geen enkele pagina. Op een paar pagina's wel maar dat zijn toevallig net de pagina's waar ik het niet nodig heb.


P.S. het is soms wel dat wanneer ik een pagina een paar keer ververs, dat de sessie in eens wel tevoorschijn komt.
Offline Martijn - 12/06/2013 14:02
Avatar van Martijn Crew PHP Vertellen zij je ob_start() te gebruiken? Want die moet je helemaal niet gebruiken tenzij je goed weet waar je mee bezigt bent. Vaak is het de oorzaak van allemaal rare problemen, dit zou er 1 van kunnen zijn
Offline Martijn2008 - 12/06/2013 15:13
Avatar van Martijn2008 PHP beginner
GroundZero schreef:
Zoals je ziet kijkt hij of er een $user variable is. Deze is er ook! Beide checks werken. Zowel als er nog geen account in de database is, al wanneer er wel een account is. Het gaat pas fout (DENK IK) bij het zetten van de 5 sessies en het doorsturen.


Ik denk dat je het probleem op de volgende manier kan oplossen:
1. Reduceren van dubbel geschreven code door te werken met functies
2. Overbodige code verwijderen zoals bijvoorbeeld die voor site_login_attempts
3. Commentaar toevoegen aan de code regels

Geen idee of dit voor problemen zorgt, maar op regel 107 zie ik ob_clean(); staan.

Een voorbeeld om te werken met functies.

  1. <?php
  2.  
  3. // ... je code
  4.  
  5. /*
  6.   * De gebruiker query definieren
  7.   */
  8. function SelectUserQuery($email)
  9. {
  10. $query = "SELECT id, company, email, password, account_type FROM site_users
  11. WHERE
  12. email = '" .mysql_real_escape_string($email) . "'";
  13. return mysql_query($query) or die(mysql_error());
  14. }
  15.  
  16. /*
  17.   * Controleren of de gebruiker al bestaat in de database
  18.   */
  19. function ExistUser($email)
  20. {
  21. return (mysql_num_rows(SelectUserQuery($email)) > 0);
  22. }
  23.  
  24. /*
  25.   * Indien de gebruiker in de database bestaat:
  26.   * Sessie aanmaken en item ophalen
  27.   */
  28. function CreateUserSession($email)
  29. {
  30. $item = mysql_fetch_array(SelectUserQuery($email));
  31. $_SESSION['userid'] = $item['id'];
  32. $_SESSION['company'] = $item['company'];
  33. $_SESSION['email'] = $item['email'];
  34. $_SESSION['password'] = $item['password'];
  35. $_SESSION['account_type'] = $item['account_type'];
  36. return $item;
  37. }
  38.  
  39. // ... je code
  40.  
  41. ?>




Offline Stijn - 15/06/2013 03:23
Avatar van Stijn PHP expert
Martijn schreef:
Vertellen zij je ob_start() te gebruiken? Want die moet je helemaal niet gebruiken tenzij je goed weet waar je mee bezigt bent. Vaak is het de oorzaak van allemaal rare problemen, dit zou er 1 van kunnen zijn
ob_start() is ook zo'n oplossing om er makkelijk vanaf te komen. Laat eerst je php code uitvoeren en stuur dan pas je output terug naar de browser. Dan moet je niet alles gaan cachen.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.284s