[PHP/Javascript]Una richiesta da sempre lo stesso valore

Discussioni su qualunque linguaggio di programmazione o engine
Rispondi
Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

[PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Premettendo che scriverò qualche cazzata visto che è il primo test che faccio, sono (quasi)riuscito a mettere su un piccolo test per comunicare con un database. Praticamente è una pagina con un pulsante, ogni volta che questo pulsante è premuto un valore nel mio database aumenta di 1 e questo valore è condiviso tra tutti. Sono riuscito a mettere su qualcosa guardando un po' in internet ed adesso ho il pulsante che funziona e se lo clicco e vado a vedere dal gestore del database di altervista vedo il valore salire. Il problema è che il valore che leggono gli utenti è sempre 1.
File HTML:

Codice: Seleziona tutto

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>The most useful button on the internet</title>
  <script src="button.js" type="text/javascript"></script>
  <link href="buttonStyle.css" rel="stylesheet" type="text/css">
</head>
<body>
	<h2>The most useful button on the internet</h2>
    <h3>So far this button has been pressed</h3>
    <h1 id="number"></h1>
    <h3>times</h3>
    <div>
    	<button id="theButton" onclick="buttonThing()"></button>
    </div>
</body>
</html>
File javascript

Codice: Seleziona tutto

document.addEventListener("DOMContentLoaded", function() 
	{ 
		console.log(Caricata la pagina. Richiesta inviata");
		fetchValue(); 
	}
	);

function fetchValue()
{
	var req = new XMLHttpRequest;
    req.onreadystatechange = function ()
    {
    	if ( req.readyState == 4 && req.status == 200 )
        	document.getElementById("number").innerHTML = req.responseText;
    }
    req.open("GET", "http://robapertestare.altervista.org/TheButton/button.php?use=0", true);
    req.send();
}
function buttonThing()
{
	var req = new XMLHttpRequest;
    req.onreadystatechange = function ()
    {
    	if ( req.readyState == 4 && req.status == 200 )
        {
        	console.log("Aggiunto 1!");
        	fetchValue();
        }
    }
    req.open("GET", "http://robapertestare.altervista.org/TheButton/button.php?use=1", true);
    req.send();
}
File PHP

Codice: Seleziona tutto

?php
//Non ho cancellato i campi per sicurezza, sono proprio vuoti. Altervista fa fare il login in automatico
$server = "";
$username = "";
$password = "";
$dbname = "my_robapertestare";

$connection = new mysqli($server, $username, $password, $dbname);
if ( $connection->connect_error )
	die("Connessione fallita:". $connection->connect_error );
//Esegui query(aggiunge 1) se "use" nel URL è a 1
if ( $_GET["use"] == "1")
{
	$sql = "UPDATE TheButton SET Premuto = Premuto+1 WHERE 1";
	echo $connection->query($sql) or die("Query di aumento fallita:". $connection->error);
}
else
{
	$sql = "SELECT Premuto FROM `TheButton` WHERE 1";
	echo $connection->query($sql) or die("Query di fetch fallita:". $connection->error);
}
?>
Le query sql le ho provate nella console dei comandi e funzionano, ho letto che potrebbe essere che il server per risparmiare si salva la risposta e la invia sempre identica ma forse ho interpretato male quello che avevo letto(ripeto, non ne so esattamente tanto di roba a lato server). Se volete provare il sito con il test è questo:
http://robapertestare.altervista.org/Th ... utton.html

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Xeryan ha scritto:Quando fai il select, ritorni il valore booleano della query eseguita e non il numero di clicks, modifica come di seguito:

Codice: Seleziona tutto

$sql = "SELECT Premuto FROM `TheButton` WHERE 1";
$query = $connection->query($sql) or die("Query di fetch fallita:". $connection->error);
$result = $query->fetch_assoc();
return $result["Premuto"];
Consiglio: Invia un XHR ogni 30/60 sec e non ad ogni singolo click, così da allegerire il carico del server e poter fare un minimo di controlli sui clicks effettuati. Ma se vuoi l'aggiornamento in tempo reale ti servono i websockets.
Perfetto, funziona tutto ora. Per l'invio della richiesta non sarebbe ancora meglio inviare tutti i click alla chiusura della pagina?

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Xeryan ha scritto:
Cash ha scritto:Perfetto, funziona tutto ora. Per l'invio della richiesta non sarebbe ancora meglio inviare tutti i click alla chiusura della pagina?
No, non sempre il browser rileva l'evento di chiusura e rischi di perderti molti click
Ma con il tuo metodo non si perderebbero tutti i click fatti prima dello scadere del timeout?Forse si potrebbe fare che ad ogni click fatto c'è un piccolo timeout di 1-2 secondi, se si riclicca prima del timeout si salvano tutti i click fatti e allo scadere del timeout invio la query

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Xeryan ha scritto:
Cash ha scritto:
Xeryan ha scritto:
Cash ha scritto:Perfetto, funziona tutto ora. Per l'invio della richiesta non sarebbe ancora meglio inviare tutti i click alla chiusura della pagina?
No, non sempre il browser rileva l'evento di chiusura e rischi di perderti molti click
Ma con il tuo metodo non si perderebbero tutti i click fatti prima dello scadere del timeout?
Beh si ma è un rischio "accettabile", poi dipende dal server quante richieste riesce a gestire.. vedi tu ;)
Alla fine ho fatto come hai detto, adesso il sito invia una sola query ogni 5 secondi. Grazie mille per l'aiuto

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Solid Snake »

Non ho saputo resistere ed ho cliccato più di 200 :asd:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Solid Snake »

Avevo la pagina ancora aperta, mentre stavo studiando, appena ho visto il numero ho pensato subito "Xeryan si sta divertendo!" :asd:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

352223, direi che anche qualcun'altro ha provato ad usare lo script. Eh vabbè, tanto aggiusto in un secondo, ma c'è anche un altro modo semplicissmo per inviare tantissimi click subito(e anche togliere click)

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Xeryan ha scritto:
c'è anche un altro modo semplicissmo per inviare tantissimi click subito(e anche togliere click)
I click li sommi lato server, come fanno a manipolarli se non tramite l'invio di multipli xhr?
In effetti con il codice che c'è sopra non si può fare. Per ottimizzare a lato server ho fatto che tutti i click fatti ogni 5 secondi vengono inviati insieme, basta inviare una richiesta con il numero di click che vuoi e li puoi aggiungere tutti insieme. Ora però che ci penso mi sa che è un rischio grossissimo per la sicurezza...
Edit:credo di aver risolto, il codice incriminato era questo

Codice: Seleziona tutto

$sql = ( "UPDATE TheButton SET Premuto = Premuto+" .$_GET["use"]. " WHERE 1" );
e adesso lo trasformo prima in un intero per togliere tutte le lettere

Codice: Seleziona tutto

$sql = ( "UPDATE TheButton SET Premuto = Premuto+" .intval($_GET["use"]). " WHERE 1" );

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: [PHP/Javascript]Una richiesta da sempre lo stesso valore

Messaggio da Cash »

Xeryan ha scritto:Beh innanzitutto non trasformare l'input dell'utente ad esempio con intval ma validalo (es. con filter_var() ), specie in questo caso dove se il get non è tipo int vuol dire che sta provando ad "hackare", poi se non c'è già (nel tuo ultimo codice) metti un controllo sul limite di clicks inviabili tramite il get
Fatto tutto, limite di click per richiesta e ho cambiato intval con filter_val. Inoltre ho bloccato il poter inviare numeri negativi. Se qualcuno è interessato al codice:
PHP:

Codice: Seleziona tutto

<?php
//Altervista non richiede i 3 campi, logga in automatico se il file è sul server
$server = "";
$username = "";
$password = "";
$dbname = "my_robapertestare";

$MAX_CLICK_PER_QUERY = 50;

$connection = new mysqli($server, $username, $password, $dbname);
if ( $connection->connect_error )
	die("Connessione fallita:". $connection->connect_error );
//Esegui query(aggiunge 1) se "use" nel URL è a 1
if ( $_GET["use"] != "0" && intval($_GET["use"]) < $MAX_CLICK_PER_QUERY && intval($_GET["use"]) > 0)
{
	$sql = ( "UPDATE TheButton SET Premuto = Premuto+".filter_var($_GET["use"],FILTER_SANITIZE_NUMBER_INT)." WHERE 1" );
	echo $connection->query($sql) or die("Query di aumento fallita:". $connection->error);
}
else
{
	if ( $_GET["use"] == 0 )
    {
		$sql = "SELECT Premuto FROM `TheButton` WHERE 1";
    	$query = $connection->query($sql) or die("Query di fetch fallita:". $connection->error);
    	$result = $query->fetch_assoc();
		echo $result["Premuto"];
    }
    else
    	echo "Cheater :(";
}
?>
Javascript:

Codice: Seleziona tutto

document.addEventListener("DOMContentLoaded", function() 
	{ 
		fetchValue(); 
	}
	);
   
val = 0;

function fetchValue()
{
	var req = new XMLHttpRequest;
    req.onreadystatechange = function ()
    {
    	if ( req.readyState == 4 && req.status == 200 )
        	document.getElementById("number").innerHTML = req.responseText;
    }
    req.open("GET", "http://robapertestare.altervista.org/TheButton/button.php?use=0", true);
    req.send();
}
function buttonThing()
{
    val++;
    document.getElementById("number").innerHTML = parseInt(document.getElementById("number").innerHTML)+1;
}
function sendQuery(value)
{
	var req = new XMLHttpRequest;
    req.onreadystatechange = function ()
    {
    	if ( req.readyState == 4 && req.status == 200 )
        {
        	console.log("Aggiunto " + String(value) + "!");
        	fetchValue();
        }
    }
    req.open("GET", "http://robapertestare.altervista.org/TheButton/button.php?use=" + String(value), true);
    req.send();
}
setInterval(function(){
	console.log("Intervallo di update");
    sendQuery(val);
    val = 0;
    fetchValue();
    }, 5000);

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 35 ospiti