Variabele vanuit Javascript naar PHP pagina sturen.
Ten eerste zal ik mijn situatie even uitleggen:
Ik gebruik facebook's single sign-on plugin om mensen te laten inloggen op mijn site. Dit gaat met javascript.
Uiteindelijk krijg ik na het inloggen voor iedere user een uniek id van de ingelogde user. Die noem ik dan "var userid".
Met dat userid wil ik in een php pagina een database doorzoeken om alle bestellingen van de ingelogde user op te vragen. Iedere bestelling heeft een column "userid". Ik weet dus niet hoe ik mijn javascript variabele in mijn php script krijg.
Mijn facebook inlog script (en dus ook de variabele) staat in een geïnclude menu.php en ik heb die variabele nodig in mijn pagina.php.
Hopelijk kan iemand mij hiermee helpen.
Als je een JS waarde over wilt brengen naar PHP, dan zou je een AJAX-request moeten gebruiken.
Toen had ik dit:
javascript in menu.php:
$.ajax({
type: "POST",
url: 'pagina.php',
data: {userID: userid}
});
en dan in mijn pagina.php
$id = $_POST['userID'];
(menu.php staat included in pagina.php)
Misschien doe ik hier iets fout?
Gewijzigd op 23/04/2014 21:37:18 door Colin h
Heb je ook de jQuery zelf ingevoegd?
Ik heb wel jquery zelf wel included als je dat bedoeld?
Aar bedoeld denk ik of je <script src="jQuery URL hier"></script> ingevoegd hebt.
Bedankt voor de reacties! Ik ga het zo meteen proberen. Ik neem aan dat ik de functie zelf niet aan hoef te roepen? Of gewoon bij document load?
Dit is een beetje verwarrend, maar het is niet een function zoals je gewend bent.
$(function(){ is een afkorting van $( document ).ready(function() {
En alles wat daar binnen staat wordt pas uitgevoerd zodra alles geladen is.
edit: Je hoeft deze dus niet zelf aan te roepen.
Gewijzigd op 24/04/2014 11:13:27 door Michael -
Als ik naar pagina.php ga dan krijg ik de alert "Done" na enkele seconde wel in beeld.
Vervolgens blijkt hij gewoon leeg te zijn als ik hem print.
$userid = $_POST['userId'];
Dit is mijn volledige ajax code:
$(function(){
$.ajax({
type: "POST",
url: "mijn-opstellingen.php",
data: {userId: userid}
}).done(function() {
alert('Done');
}).fail(function() {
alert('Fail');
});
});
Misschien zie ik toch iets over het hoofd?
Edit: het ligt in ieder geval niet aan de javascript var userid, die heb ik al gecontroleerd door hem bijvoorbeeld achter de "Done" alert te printen.
Gewijzigd op 24/04/2014 15:56:38 door Colin h
Wanneer je de POST in een SESSION of database gaat opslaan zal het waarschijnlijk wel werken.
Zet deze code eens in 'mijn-opstellingen.php'
Voor de javascript nog eens uit, en open dan die pagina.
Toevoeging op 24/04/2014 16:11:48:
Je zou je script nog even kunnen uitbreiden met je geposte data, maar ik denk ook niet dat het daaraan ligt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
$.ajax({
type: "POST",
url: "pagina.php",
data: {userID: userid}
}).done(function(data) {
alert('Done : ' + data);
}).fail(function(data) {
alert('Fail : ' + data);
});
});
</script>
<script>
$(function(){
$.ajax({
type: "POST",
url: "pagina.php",
data: {userID: userid}
}).done(function(data) {
alert('Done : ' + data);
}).fail(function(data) {
alert('Fail : ' + data);
});
});
</script>
Gewijzigd op 24/04/2014 16:12:26 door Michael -
Nu helemaal boven in mijn-opstellingen.php gezet en aan mijn javascript code in menu.php niks veranderd.
Hij print een lege array lijkt het.
Dit zal wel werken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
/*
* mijn-opstellingen.php
*/
session_start();
if($_SERVER['REQUEST_METHOD'] == "POST") {
$_SESSION['POST'] = $_POST;
}
var_dump($_SESSION['POST']);
?>
/*
* mijn-opstellingen.php
*/
session_start();
if($_SERVER['REQUEST_METHOD'] == "POST") {
$_SESSION['POST'] = $_POST;
}
var_dump($_SESSION['POST']);
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div id="mijn-opstellingen"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
var userid = 355353535;
$.ajax({
type: "POST",
url: "mijn-opstellingen.php",
data: {userID: userid}
}).done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
var userid = 355353535;
$.ajax({
type: "POST",
url: "mijn-opstellingen.php",
data: {userID: userid}
}).done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
</script>
Daarnaast zou je ook nog jQuery.post kunnen gebruiken wat een shorthand is voor ajax.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="mijn-opstellingen"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
</script>
Gewijzigd op 25/04/2014 08:15:49 door Michael -
Beetje late reactie, heb geen tijd gehad om er eerder naar te kijken!
Ik heb je code uitgeprobeerd, ik denk dat er misschien ergens met de PHP iets fout gaat.
Het probleem zit niet bij ajax of .post, als ik vanuit daar een alert stuur met userid dan krijg ik op de pagina mijn-opstellingen.php gewoon een alert met de goede id.
Als ik met de php code die jij stuurde (met session) var_dump(...) doe dan krijg ik wél een array met userid.
Als ik daarna dit doe:
if(isset($_POST["userID"])){
....
}
Dan gebeurt er helemaal niks. Als ik een 'if' maak die kijkt of $_POST["userID"] empty is dan geeft hij aan dat deze empty is.
Of als ik een echo doe met $_POST["userID"] dan gebeurt er helemaal niks.
Ik snap er nu helemaal niks meer van, met dat session en var_dump krijg ik wél een waarde, maar als ik vervolgens verder in de pagina kijk of $_POST["userID"] het doet, gebeurt er niks.
Heb ook al gecheckt of $_GET het doet, en heb een echo gedaan met $_SESSION['POST'] maar dan krijg ik alleen "Array" geprint. (dus iets anders dan wat var_dump doet).
Ik snap het niet meer, hopelijk kan iemand me toch helpen :')
In ieder geval wel bedankt voor alle hulp tot nu toe!
Code (js)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$(function(){
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").load("mijn-opstellingen.php");
}).fail(function(data) {
$("#mijn-opstellingen").text("Fout!");
});
});
Het gaat om .load, hiermee roep je nogmaals mijn-instellingen.php op maar dan zonder post variabelen.
Maar het is natuurlijk niet nodig omdat dubbelop te doen (load is ook een AJAX request)
Code (js)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$(function(){
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").html(data);
}).fail(function(data) {
$("#mijn-opstellingen").html("Fout!");
});
});
var userid = 355353535;
$.post( "mijn-opstellingen.php", { userID: userid })
.done(function( data ) {
$("#mijn-opstellingen").html(data);
}).fail(function(data) {
$("#mijn-opstellingen").html("Fout!");
});
});
Daarnaast gebruik je wel een zeer onveilige methode om via Facebook in te loggen met Javascript.
Javascript is client side en valt dus door kwaadwillende personen te manipuleren.
Gewijzigd op 07/05/2014 19:39:18 door Ger van Steenderen
En ik ga de userid gebruiken om een aantal resultaten op te halen uit mijn database, ik sla verder geen persoonlijke gegevens op, dus in principe zou iedereen elkaars "opstellingen" mogen zien als je iemand's userid hebt.
Maar ik zit nu nog steeds met m'n userId die ik niet kan opvragen met $_POST, erg vreemd.
Edit: die data die ik via .post in de #mijn-opstellingen div zet is trouwens een kopie van mijn-opstellingen.php, maar dan met userid, hij zet er dus de hele pagina in.. maar daar (in die div dus) werkt denk ik $_POST wel.
Zou het eraan kunnen liggen dat de jquery .post in de geinclude menu.php staat?
Gewijzigd op 07/05/2014 20:10:00 door Colin h
Wat er nu gebeurd, met de code van Michael, is dat telkens als de pagina wordt geladen een ajax request wordt uitgevoerd (vanwege $(function)).
Maar als je dat oproept nadat via Facebook is ingelogd, zal het misschien anders gaan.
Het heeft er ook mee te maken wat jij wilt wat er gebeurt nadat men is ingelogd.
Moet dan gelijk die div met opstellingen getoond worden?
Ik denk dat ik mijn probleem gevonden heb. Ik krijg mijn userid namelijk pas wanneer facebook de userid heeft doorgegeven (dit gebeurt nadat de pagina geladen is, en dus is de $_POST dan al gedefinieerd.
Ik heb de $.post(..) nu dus buiten het inlog gedeelte gezet, maar dit wordt uitgevoerd voordat de userid bekend is, waardoor de data die hij post dus leeg is.
Ik zal gedeeltes van mijn code als voorbeeld geven:
var userid;
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
FB.api('/me', function (user) {
if (user) {
userid = ''+user.id;
console.log(user.id);
$(function(){
//hier stond eerst $.post(..)
});
}
$.post( "mijn-opstellingen.php", { userID: userid });
alert(""+userid);
Ik krijg die alert voordat mijn userid vanuit facebook bekend is en die alert heeft de waarde "undefined". Dus $_POST is denk ik dan ook om diezelfde reden leeg. De console.log(..) geeft echter wel de goede userid, omdat die uitgevoerd wordt wanneer de userid bekend is. Als ik mijn $.post(..) op de oude plek terug zet (waar de comment staat). Dan post hij pas een paar seconde nadat de pagina geladen is, waardoor $_POST volgens mij al geset is.
Ik heb het idee dat ik heel dichtbij ben, maar ik heb nog geen idee wat de volgende stap is.
Je hebt dus de kans dat $.post wordt aangeroepen voordat de userid vanuit Facebook bekend is.
$(function) en $(document).ready zijn event listeners. Beide doen hetzelfde nl. kijken wanneer de DOM geladen is. Dit is hetzelfde als javascript net voor de afsluitende body tag uit te voeren.
Omdat het asynchroon is kan het dus voorkomen dat het event al getriggered is voordat de call naar de Facebook API een antwoord heeft.
Het beste is om de Facebook API ook in $(document).ready mee te nemen.
Of misschien nog beter om het in PHP al te bepalen.
Hier bijvoorbeeld de breedte van het scherm in pixels.
<html>
<head>
</head>
<body>
<script>
{
window.location.assign("http://www.domein.nl/pagina.php?scherm=" + screen.width)
}
</script>
</body>
</html>
De ontvangende pagina:
<html>
<head>
</head>
<body>
</body>
</html>
Om deze reden sluit ik dit topic