PHP + AJAX + MYSQL live result uit database
Parse error: syntax error, unexpected '(', expecting T_VARIABLE or '$' on line (4 in de code hieronder)
De error begrijp ik wel, maar de oplossing niet, ik kan niet zomaar $tjes e.d. erin gaan gooien als ik niet weet waar ik mee aan het spelen ben.
Code:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
function haal_totaal_op(){
//laad het totaal vanaf de server direct in het span#totaal_credits
$("#totaal_credits").load("amount.php", function(){
//set een timer om over een minuut het weer te doen
t = setTimeout("haal_totaal_op()",5000);
});
}
?>
function haal_totaal_op(){
//laad het totaal vanaf de server direct in het span#totaal_credits
$("#totaal_credits").load("amount.php", function(){
//set een timer om over een minuut het weer te doen
t = setTimeout("haal_totaal_op()",5000);
});
}
?>
Gewijzigd op 28/02/2012 10:33:36 door Allard Keij
Uhm, dit is een stuk javascript (of beter, JQuery), geen php, dat had je wel al door?
Thnx, Anyways, ook met een <script> tag doet hij het ook niet.
Kan natuurlijk weer aan mij liggen..
Wat ik nu doe is:
<script>
function haal_totaal_op(){
//laad het totaal vanaf de server direct in het span#totaal_credits
$("#totaal_credits").load("amount.php", function(){
//set een timer om over een minuut het weer te doen
t = setTimeout("haal_totaal_op()",1000);
});
}
</script>
In amount.php staat op het moment even: Test
Vervolgens in mijn code zet ik <div id="totaal_credits"></div>
Vervolgens doet het script niks. Geen errors maar ook geen "Test".
echo 'Chances left'.$amount.'';
Toch moet ik er bij vermelden dat ik een stukje code zoals dit ook ergens gevonden had die inderdaad deze functie deed en amount.php elke 5 seconde uitlas. Nu was het probleem dat ik het niet voor elkaar kreeg om ''.$amount.'' ook functioneel te laten zijn. $amount had ik in dat geval dus in de amount.php gezet, het probleem is dus waarschijnlijk dat hij die pagina wel leest maar NIET verwerkt waar de div staat. De oplossing zou in dat geval zijn om het gehele script in amount.php uit te laten voeren maar dan krijg je weer het feit dat het alsnog zo ongeveer de gehele pagina refreshd.
$amount zit momenteel in een "while" vervolgens een echo:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
[code]<?php
$sql="SELECT * FROM products WHERE prodclass = '$prodclass'";
$result=mysql_query($sql);
?>
<?
while($show = mysql_fetch_array($result))
{
?>
[code]<?php
$sql="SELECT * FROM products WHERE prodclass = '$prodclass'";
$result=mysql_query($sql);
?>
<?
while($show = mysql_fetch_array($result))
{
?>
Gewijzigd op 28/02/2012 11:34:35 door Allard Keij
Code (php)
1
2
3
4
2
3
4
$(document).ready(function(){
//bij start pagina, begin de loop om elke minuut het totaal op te halen
haal_totaal_op();
});
//bij start pagina, begin de loop om elke minuut het totaal op te halen
haal_totaal_op();
});
Dit is de trigger om de loop te starten die elke minuut de data ophaalt van de server.
@erwin moet hij die functie niet ook in een (function... )(); zetten zodat deze automatisch al gaat werken?
Toevoeging op 28/02/2012 12:07:28:
@reshadd, vaak worden fucties in js-jquery in een apart bestandje gezet. Vandaar de document.ready. Dit roept de functie haal_totaal_op aan die telkens zichzelf weer aanroept.
Inderdaad, je kan het in je HTML voegen, maar ik kies er altijd voor alles apart te houden. Dus geen styling in mijn HTML document en geen (of zo min mogelijk in elk geval) javascript in mijn HTML document. En in een apart document heb je die document ready altijd nodig.
Verder moet ik eerlijk toegeven dat ik me nog nooit zo in closures heb verdiept en het daarom ook niet ga aanbevelen. Als jij het wel weet mag je een goed werkend voorbeeld geven, ik waag me daar niet aan.
Erwin H:
En in een apart document heb je die document ready altijd nodig.
Dit is niet zo. Als je het document vlak voor </body> 'included' dan heb je het niet nodig. Zeg maar zo:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<!doctype html>
<meta charset=utf-8>
<title>Hello World</title>
<body>
<!-- document -->
<script src="assets/js/scripts.min.js"></script>
</body>
<meta charset=utf-8>
<title>Hello World</title>
<body>
<!-- document -->
<script src="assets/js/scripts.min.js"></script>
</body>
Ger van Steenderen:
vaak worden fucties in js-jquery in een apart bestandje gezet. Vandaar de document.ready.
Als je hier doelt op jQuery plugins, deze worden vaak in een anonymous self-executing function gezet.
voorbeeld stukje code
Wouter J op 28/02/2012 12:17:39:
Dit is niet zo. Als je het document vlak voor </body> 'included' dan heb je het niet nodig. Zeg maar zo:
Ok, maar ook wat mij betreft is ook dat iets wat ik niet wil hebben. Dan heb ik alsnog script tags in mijn body wat ik niet wil. Persoonlijke keuze inderdaad.
ik doe het liever op dezelfde pagina omdat ik dan geen document.ready hoef te gebruiken en alles op een pagina heb.
Ik heb het even geprobeerd met het stukje erbij wat ik vergeten was. Done, but with errors.. Alsnog geen werkend script..
Ik dacht misschien even jQuery loaden.
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
Geen succes helaas.
<script>
$(document).ready(function(){
//bij start pagina, begin de loop om elke minuut het totaal op te halen
haal_totaal_op();
});
function haal_totaal_op(){
//laad het totaal vanaf de server direct in het span#totaal_credits
$("#totaal_credits").load("amount.php");
//set een timer om over een minuut het weer te doen
t = setTimeout("haal_totaal_op()",5000);
}
</script>
<div id="totaal_credits"></div>
amount.php: Test
Error:
Webpage error details
User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)
Timestamp: Tue, 28 Feb 2012 11:30:05 UTC
Message: Object expected
Line: 49
Char: 1
Code: 0
Gewijzigd op 28/02/2012 12:30:48 door Allard Keij
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
<script>
$(document).ready(function() {
$("#responsecontainer").load("response.php");
var refreshId = setInterval(function() {
$("#responsecontainer").load('response.php?randval='+ Math.random());
}, 9000);
$.ajaxSetup({ cache: false });
});
</script>
</head>
<body>
<div id="responsecontainer">
</div>
</body>
<script>
$(document).ready(function() {
$("#responsecontainer").load("response.php");
var refreshId = setInterval(function() {
$("#responsecontainer").load('response.php?randval='+ Math.random());
}, 9000);
$.ajaxSetup({ cache: false });
});
</script>
</head>
<body>
<div id="responsecontainer">
</div>
</body>
Gewijzigd op 28/02/2012 12:34:29 door Reshad F
Die error op deze manier kan ik weinig mee helaas....
Moeten die quotes niet weg?
Als ik dat doe bij mijn scripts werkt het niet meer, anderen zeggen juist weer van wel....
Als ik de code boven de body zet dan krijg ik geen errors, maar ook geen result.. Ik blijf nog even spelen.
Gewijzigd op 28/02/2012 18:55:38 door Allard Keij
Plaats dan weer eens je hele code, misschien dat wij er een fout in kunnen vinden.
Het is helemaal gelukt zoals ik wilde! Ik zal hieronder de code zetten voor mensen die met dezelfde vraag zitten en toevallig op dit toppic uitkomen.
Mijn laatste vraag is nog wel, kan ik met dit onderstaande script een mega bandwidth verwachten of valt dit wel mee? Er kunnen tot wel 10 producten op 1 pagina staan die allemaal de amount.php laden en om de 500 miliseconde refreshen.
Nogmaals allemaal hartelijk bedankt!
Code (php)
1
2
3
4
5
6
2
3
4
5
6
var auto_refresh = setInterval(
function()
{
$('#<?echo"$productid";?>').load('amount.php?pid=<?echo"$productid";?>');
}, 500);
</script>
function()
{
$('#<?echo"$productid";?>').load('amount.php?pid=<?echo"$productid";?>');
}, 500);
</script>
Toevoeging: Het # is een div die je vervolgens in de code moet zetten, deze div's heb ik tevens mijn $productid gemaakt omdat ik meerdere keren dit script op 1 pagina wilde laten draaien, dit is de oplossing.
Toevoeging: In dit geval is de div een echo, dit werk natuurlijk ook zonder echo. Daarbij omdat ik in het javascript div's de productnummers liet zijn worden nu die div's dus 1 voor 1 opgebouwd ( aangezien het in een while gebeurd )
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
$prodid = $_GET['pid'];
$sql = "SELECT * FROM `products` WHERE `id` = '$prodid'";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result)){
$cost = $row['cost'];
$sold = $row['sold'];
$total = $cost - $sold;
echo "$total / <font color=\"blue\" size=\"5\">$cost</font>";
}
?>
$prodid = $_GET['pid'];
$sql = "SELECT * FROM `products` WHERE `id` = '$prodid'";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result)){
$cost = $row['cost'];
$sold = $row['sold'];
$total = $cost - $sold;
echo "$total / <font color=\"blue\" size=\"5\">$cost</font>";
}
?>
Hier haal ik mijn getal op. Dit is amount.php. Deze pagina inhoud word dus elke 500 MS opgehaald en ververst.
Met een beetje spelen is het me helemaal gelukt zoals ik wou.
Ik heb wel de jQuery scripts in de header gezet. Of dit noodzakelijk is weet ik niet zeker maar ik heb ze er toch in. Oftewel:
Code (php)
1
2
2
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://code.jquery.com/jquery-latest.js"></script>
Gewijzigd op 29/02/2012 14:52:22 door Allard Keij