Sessies weg na Facebook login
GroundZero - 11/06/2013 17:41
Lid
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
<?php
if($user)
{
$query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
WHERE
email = "'.mysql_real_escape_string($user_info['email']).'"');
$rows = mysql_num_rows($query);
if($rows == 1)
{
$fetch = mysql_fetch_assoc($query);
$_SESSION['userid'] = $fetch['id'];
$_SESSION['company'] = $fetch['company'];
$_SESSION['email'] = $fetch['email'];
$_SESSION['password'] = $fetch['password'];
$_SESSION['account_type'] = $fetch['account_type'];
echo 'ACCOUNT BESTAAT AL, klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan...';
echo '<br /> '.$_SESSION['email'];
}
else
{
$gender = $user_info['gender'];
if($gender == 'male'){
$gender = EDP26;
}elseif($gender == 'female'){
$gender = EDP27;
}
mysql_query('INSERT INTO site_users
(name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
VALUES
("'.mysql_real_escape_string($user_info['first_name']).'",
"'.mysql_real_escape_string($user_info['last_name']).'",
"'.mysql_real_escape_string($gender).'",
"'.mysql_real_escape_string($user_info['email']).'",
"'.mysql_real_escape_string($user_info['link']).'",
"'.mysql_real_escape_string('http://graph.facebook.com/'.$user_info['id'].'/picture?type=large').'",
1,
3,
"'.mysql_real_escape_string(mktime()).'")') or die(mysql_error());
$query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
WHERE
email = "'.mysql_real_escape_string($user_info['email']).'"') or die(mysql_error());
$fetch = mysql_fetch_assoc($query);
$_SESSION['userid'] = $fetch['id'];
$_SESSION['company'] = $fetch['company'];
$_SESSION['email'] = $fetch['email'];
$_SESSION['password'] = $fetch['password'];
$_SESSION['account_type'] = $fetch['account_type'];
echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan.';
echo '<br /> '.$_SESSION['email'];
}
}
else
{
echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
}
?>
<?php
if ( $user )
{
$query = mysql_query ( 'SELECT id, company, email, password, account_type FROM site_users WHERE
if ( $rows == 1 )
{
$_SESSION [ 'userid' ] = $fetch [ 'id' ] ;
$_SESSION [ 'company' ] = $fetch [ 'company' ] ;
$_SESSION [ 'email' ] = $fetch [ 'email' ] ;
$_SESSION [ 'password' ] = $fetch [ 'password' ] ;
$_SESSION [ 'account_type' ] = $fetch [ 'account_type' ] ;
echo 'ACCOUNT BESTAAT AL, klik <a href="' . ROOT
. 'profile/" title="Mijn profiel">hier</a> om verder te gaan...' ; echo '<br /> ' . $_SESSION [ 'email' ] ; }
else
{
$gender = $user_info [ 'gender' ] ;
if ( $gender == 'male' ) {
$gender = EDP26;
} elseif ( $gender == 'female' ) {
$gender = EDP27;
}
(name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
VALUES
1,
3,
$query = mysql_query ( 'SELECT id, company, email, password, account_type FROM site_users WHERE
$_SESSION [ 'userid' ] = $fetch [ 'id' ] ;
$_SESSION [ 'company' ] = $fetch [ 'company' ] ;
$_SESSION [ 'email' ] = $fetch [ 'email' ] ;
$_SESSION [ 'password' ] = $fetch [ 'password' ] ;
$_SESSION [ 'account_type' ] = $fetch [ 'account_type' ] ;
echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="' . ROOT
. 'profile/" title="Mijn profiel">hier</a> om verder te gaan.' ; echo '<br /> ' . $_SESSION [ 'email' ] ; }
}
else
{
echo '<a href="' . $loginUrl . '">FACEBOOK LOGIN</a>' ; }
?>
Probleem 1
In plaats van de "hier" links om de gebruiker door te sturen had ik het volgende:
ob_clean();
header('Location: '.ROOT.'/profile');
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
ob_start();
session_start();
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
Martijn2008 - 11/06/2013 22:01 (laatste wijziging 11/06/2013 22:03)
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.
<h1>Waardes voor $user</h1>
<pre>
<?php print_r($user); ?>
</pre>
<h1>Waardes voor $user_info</h1>
<pre>
<?php print_r($user_info); ?>
</pre>
<?php
echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
?>
<h1>Waardes voor $user</h1>
<pre>
</pre>
<h1>Waardes voor $user_info</h1>
<pre>
</pre>
<?php
echo '<a href="' . $loginUrl . '">FACEBOOK LOGIN</a>' ;
?>
GroundZero - 12/06/2013 11:07 (laatste wijziging 12/06/2013 11:42)
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.
<?php
if(isset($loginUrl))
echo '<a href="'.$loginUrl.'">.</a>';
?>
<?php
echo '<a href="' . $loginUrl . '">.</a>' ; ?>
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:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ob_start();
session_start();
setlocale(LC_TIME, 'nl_NL');
require_once('includes'.DIRECTORY_SEPARATOR.'config.php');
require_once('includes'.DIRECTORY_SEPARATOR.'functions.php');
require_once('facebook/fbaccess.php');
if(isset($_COOKIE['Website_language']))
{
$choice = $_COOKIE['Website_language'];
require_once('language'.DIRECTORY_SEPARATOR.strtoupper($choice).'_'.$choice.'.php');
}
else
{
require_once('language'.DIRECTORY_SEPARATOR.'NL_nl.php');
}
$ch_query = mysql_query('SELECT row, text FROM site_checkboxes');
while($ch_fetch = mysql_fetch_assoc($ch_query))
{
$ch_arr[$ch_fetch['row']] = $ch_fetch['text'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="" />
<meta name="web_author" content="" />
<meta name="contact" content="" />
<meta name="copyright" content="" />
<link rel="stylesheet" type="text/css" href="css/portal.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'account']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script type="text/javascript">
function showdata(ent){
$('.port_image_holder').fadeOut('fast', function(){});
$('.'+ent).fadeIn('fast', function(){});
}
</script>
</head>
<body>
<div class="wrapper">
<div class="port_menu">
<fieldset>
<form name="login" method="post" action="">
<input type="text" name="email" value="" placeholder="E-mail" class="input_small" />
<input type="password" name="password" value="" placeholder="Password" class="input_small" />
<input type="submit" name="submit" value="inloggen" class="submit" />
</form>
</fieldset>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
WHERE
email = "'.mysql_real_escape_string($_POST['email']).'"
AND
password = "'.mysql_real_escape_string(sha1($_POST['password'])).'"
AND
activated = 1');
$fetch = mysql_fetch_assoc($query);
$rows = mysql_num_rows($query);
if($rows == 1)
{
mysql_query('INSERT INTO site_login_attempts
(user_id, ip_address, user_agent)
VALUES
("'.mysql_real_escape_string(returnIdFromEmail($_POST['email'])).'",
"'.mysql_real_escape_string($_SERVER['REMOTE_ADDR']).'",
"'.mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']).'")');
$_SESSION['userid'] = $fetch['id'];
$_SESSION['company'] = $fetch['company'];
$_SESSION['email'] = $fetch['email'];
$_SESSION['password'] = $fetch['password'];
$_SESSION['account_type'] = $fetch['account_type'];
ob_clean();
header('location: '.ROOT.'profile'.DIRECTORY_SEPARATOR);
}
else
{
echo LOG4;
}
}
?>
</div>
<div class="port_banner">
</div>
<div class="port_row">
<div class="port_wide">
<?php
if($user)
{
$query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
WHERE
email = "'.mysql_real_escape_string($user_info['email']).'"');
$rows = mysql_num_rows($query);
if($rows == 1)
{
$fetch = mysql_fetch_assoc($query);
$_SESSION['userid'] = $fetch['id'];
$_SESSION['company'] = $fetch['company'];
$_SESSION['email'] = $fetch['email'];
$_SESSION['password'] = $fetch['password'];
$_SESSION['account_type'] = $fetch['account_type'];
echo 'ACCOUNT BESTAAT AL, klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan...';
echo '<br /> '.$_SESSION['email'];
}
else
{
$gender = $user_info['gender'];
if($gender == 'male'){
$gender = EDP26;
}elseif($gender == 'female'){
$gender = EDP27;
}
mysql_query('INSERT INTO site_users
(name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
VALUES
("'.mysql_real_escape_string($user_info['first_name']).'",
"'.mysql_real_escape_string($user_info['last_name']).'",
"'.mysql_real_escape_string($gender).'",
"'.mysql_real_escape_string($user_info['email']).'",
"'.mysql_real_escape_string($user_info['link']).'",
"'.mysql_real_escape_string('http://graph.facebook.com/'.$user_info['id'].'/picture?type=large').'",
1,
3,
"'.mysql_real_escape_string(mktime()).'")') or die(mysql_error());
$query = mysql_query('SELECT id, company, email, password, account_type FROM site_users
WHERE
email = "'.mysql_real_escape_string($user_info['email']).'"') or die(mysql_error());
$fetch = mysql_fetch_assoc($query);
$_SESSION['userid'] = $fetch['id'];
$_SESSION['company'] = $fetch['company'];
$_SESSION['email'] = $fetch['email'];
$_SESSION['password'] = $fetch['password'];
$_SESSION['account_type'] = $fetch['account_type'];
echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="'.ROOT.'profile/" title="Mijn profiel">hier</a> om verder te gaan.';
echo '<br /> '.$_SESSION['email'];
}
}
else
{
echo '<a href="'.$loginUrl.'">FACEBOOK LOGIN</a>';
}
?>
</div>
</div>
</div>
</body>
</html>
<?php
require_once ( 'includes' . DIRECTORY_SEPARATOR. 'config.php' ) ;
require_once ( 'includes' . DIRECTORY_SEPARATOR. 'functions.php' ) ;
require_once ( 'facebook/fbaccess.php' ) ;
if ( isset ( $_COOKIE [ 'Website_language' ] ) ) {
$choice = $_COOKIE [ 'Website_language' ] ;
require_once ( 'language' . DIRECTORY_SEPARATOR
. strtoupper ( $choice ) . '_' . $choice . '.php' ) ; }
else
{
require_once ( 'language' . DIRECTORY_SEPARATOR. 'NL_nl.php' ) ;
}
$ch_query = mysql_query ( 'SELECT row, text FROM site_checkboxes' ) ; {
$ch_arr [ $ch_fetch [ 'row' ] ] = $ch_fetch [ 'text' ] ;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="" />
<meta name="web_author" content="" />
<meta name="contact" content="" />
<meta name="copyright" content="" />
<link rel="stylesheet" type="text/css" href="css/portal.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'account']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script type="text/javascript">
function showdata(ent){
$('.port_image_holder').fadeOut('fast', function(){});
$('.'+ent).fadeIn('fast', function(){});
}
</script>
</head>
<body>
<div class="wrapper">
<div class="port_menu">
<fieldset>
<form name="login" method="post" action="">
<input type="text" name="email" value="" placeholder="E-mail" class="input_small" />
<input type="password" name="password" value="" placeholder="Password" class="input_small" />
<input type="submit" name="submit" value="inloggen" class="submit" />
</form>
</fieldset>
<?php
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' )
{
$query = mysql_query ( 'SELECT id, company, email, password, account_type FROM site_users WHERE
AND
AND
activated = 1' ) ;
if ( $rows == 1 )
{
(user_id, ip_address, user_agent)
VALUES
$_SESSION [ 'userid' ] = $fetch [ 'id' ] ;
$_SESSION [ 'company' ] = $fetch [ 'company' ] ;
$_SESSION [ 'email' ] = $fetch [ 'email' ] ;
$_SESSION [ 'password' ] = $fetch [ 'password' ] ;
$_SESSION [ 'account_type' ] = $fetch [ 'account_type' ] ;
header ( 'location: ' . ROOT
. 'profile' . DIRECTORY_SEPARATOR
) ; }
else
{
}
}
?>
</div>
<div class="port_banner">
</div>
<div class="port_row">
<div class="port_wide">
<?php
if ( $user )
{
$query = mysql_query ( 'SELECT id, company, email, password, account_type FROM site_users WHERE
if ( $rows == 1 )
{
$_SESSION [ 'userid' ] = $fetch [ 'id' ] ;
$_SESSION [ 'company' ] = $fetch [ 'company' ] ;
$_SESSION [ 'email' ] = $fetch [ 'email' ] ;
$_SESSION [ 'password' ] = $fetch [ 'password' ] ;
$_SESSION [ 'account_type' ] = $fetch [ 'account_type' ] ;
echo 'ACCOUNT BESTAAT AL, klik <a href="' . ROOT
. 'profile/" title="Mijn profiel">hier</a> om verder te gaan...' ; echo '<br /> ' . $_SESSION [ 'email' ] ; }
else
{
$gender = $user_info [ 'gender' ] ;
if ( $gender == 'male' ) {
$gender = EDP26;
} elseif ( $gender == 'female' ) {
$gender = EDP27;
}
(name, surname, gender, email, facebook, logo, activated, account_type, promotion_key)
VALUES
1,
3,
$query = mysql_query ( 'SELECT id, company, email, password, account_type FROM site_users WHERE
$_SESSION [ 'userid' ] = $fetch [ 'id' ] ;
$_SESSION [ 'company' ] = $fetch [ 'company' ] ;
$_SESSION [ 'email' ] = $fetch [ 'email' ] ;
$_SESSION [ 'password' ] = $fetch [ 'password' ] ;
$_SESSION [ 'account_type' ] = $fetch [ 'account_type' ] ;
echo 'Je bent nu ingelogd met je Facebook account! Klik <a href="' . ROOT
. 'profile/" title="Mijn profiel">hier</a> om verder te gaan.' ; echo '<br /> ' . $_SESSION [ 'email' ] ; }
}
else
{
echo '<a href="' . $loginUrl . '">FACEBOOK LOGIN</a>' ; }
?>
</div>
</div>
</div>
</body>
</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.
Martijn - 12/06/2013 14:02
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
Martijn2008 - 12/06/2013 15:13
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.
<?php
// ... je code
/*
* De gebruiker query definieren
*/
function SelectUserQuery($email)
{
$query = "SELECT id, company, email, password, account_type FROM site_users
WHERE
email = '" .mysql_real_escape_string($email) . "'";
return mysql_query($query) or die(mysql_error());
}
/*
* Controleren of de gebruiker al bestaat in de database
*/
function ExistUser($email)
{
return (mysql_num_rows(SelectUserQuery($email)) > 0);
}
/*
* Indien de gebruiker in de database bestaat:
* Sessie aanmaken en item ophalen
*/
function CreateUserSession($email)
{
$item = mysql_fetch_array(SelectUserQuery($email));
$_SESSION['userid'] = $item['id'];
$_SESSION['company'] = $item['company'];
$_SESSION['email'] = $item['email'];
$_SESSION['password'] = $item['password'];
$_SESSION['account_type'] = $item['account_type'];
return $item;
}
// ... je code
?>
<?php
// ... je code
/*
* De gebruiker query definieren
*/
function SelectUserQuery( $email )
{
$query = "SELECT id, company, email, password, account_type FROM site_users
WHERE
}
/*
* Controleren of de gebruiker al bestaat in de database
*/
function ExistUser( $email )
{
}
/*
* Indien de gebruiker in de database bestaat:
* Sessie aanmaken en item ophalen
*/
function CreateUserSession( $email )
{
$_SESSION [ 'userid' ] = $item [ 'id' ] ;
$_SESSION [ 'company' ] = $item [ 'company' ] ;
$_SESSION [ 'email' ] = $item [ 'email' ] ;
$_SESSION [ 'password' ] = $item [ 'password' ] ;
$_SESSION [ 'account_type' ] = $item [ 'account_type' ] ;
return $item ;
}
// ... je code
?>
Stijn - 15/06/2013 03:23
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.