» »

Klic funkcije v PHP onclick

Klic funkcije v PHP onclick

a-ptuj ::

Pozdravljeni!
V PHP bi rad naredil števec, ki bi mi štel kolikokrat sem kliknil na gumb "Štej klike na gumb" in nato razultat shranil v *.txt datoteko, obenem pa bi ga izpisal tudi zraven gumba. Naredil sem spodnjo kodo, ki pa se mi ob kliku na gumb ne zažene in ne izpiše kolikokrat je že bilo kliknjeno do sedaj. Kaj je z funkcijo narobe. Prosim za pomoč. Če je mogoče kar v sami kodi. Hvala že v naprej.

<?php
function stej (){
$vsebina = file("delo.txt"); 
$stevilo = intval($vsebina[0]); 
$stevilo++; 

$handler = fopen("delo.txt", "w"); 
fputs($handler, $stevilo);
fclose($handler);

print $stevilo; 
}
?>

<html>
<input type="submit" onclick="<?php stej (); ?> " value="Štej klike na gumb" />
</html>

overlord_tm ::

onclick klice javascript funkcije in ne php funkcij.

Rabil bos narediti neko JS kodo, ki bo potem klicala to php funkcijo.

PS: tak nacin bo prestel klike vseh uporabnikov na strezniku skupaj, ne samo klike posameznega uporabnika. Ce rabis samo klike enega uporabnika, je JS zadosti.

a-ptuj ::

Prav to želim, da prešteje klike vseh uporabnikov skupaj, zato rabim PHP, saj se morajo kliki posameznega uporabnika zapisati v *.txt, da lahko od tam vzame podatek koliko klikov so že naredili različni uporabniki do sedaj in temu prišteje nov klik.

Kako naj z JS kodo zaženem PHP kodo, da bo zagnala funkcijo stej () v PHP kodi? Prav to bi rad vedel, da bo zadeva delala. Mi jo prosim lahko kdo napiše, saj meni to ne uspe.

MrBrdo ::

Temu se na kratko reče Ajax, poglej si kakšen tutorial, da ne bomo izumljali tople vode.
MrBrdo

DiTi ::

se da rešit tudi brez ajaxa, ne vem sploh zakaj hočeš s javascriptom če gre z enostavno formo.

urosz ::

tudi jaz bi to naredil s formo ;)

rabiš samo php vbistvu ;)

a-ptuj ::

Če gre to brez javascripta samo s formo v php, OK. Kako se pa to naredi? Kako se napiše taka koda, ki bo vsebovala *.txt, gumb in izpis? Jaz tega nažalost ne znam, a mi jo lahko napišete prosim.

paco ::

...
<?php
$recordFile = "delo.txt";
$Type = (string)$_GET["type"];

if($Type == "getno")
{
	echo (int)@file_get_contents($recordFile);
	exit();
}
elseif($Type == "incno")
{
	@file_put_contents($recordFile, 1+(int)@file_get_contents($recordFile));
	exit();
}
$CurrentClicks = (int)@file_get_contents("delo.txt");
?>
<!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 http-equiv="Content-Type" content="text/html; charset=utf8" />
	<script type="text/javascript" language="javascript">
	var IntervalTimer = 5; //in miliseconds
	var IntervalID = resetInterval();
	
	function ajaxRequest(url, vars, div_id)
	{
		var request;
		try
		{
			request = new XMLHttpRequest();
		}
		catch(e)
		{
			request = new ActiveXObject("Microsoft.XMLHTTP");
		}
		if(typeof(div_id) != "undefined")
		{
			request.onreadystatechange = function()
			{
				if (request.readyState == 4)
				{
					if (request.status == 200)
						document.getElementById(div_id).innerHTML = request.responseText;
					else
						document.getElementById(div_id).innerHTML = "-";
				}
			}
		}
		request.open("GET", url + vars, true);
		request.send(null);
	}
	
	function resetInterval()
	{
		var _IntervalID = setInterval("setCurrentClickNumber()", IntervalTimer*1000);
		return _IntervalID;
	}

	function setCurrentClickNumber()
	{
		ajaxRequest("<?=$_SERVER['PHP_SELF']?>", "?type=getno", "clicksCount");
	}
	function increaseClickNumber()
	{
		ajaxRequest("<?=$_SERVER['PHP_SELF']?>", "?type=incno");
	}
	function buttonOnClick()
	{
		clearInterval(IntervalID);
		increaseClickNumber();
		setCurrentClickNumber()
		IntervalID = resetInterval();
	}
	//-->
	</script>
</head>
<body>
<input type="button" value="Prištej" onclick="buttonOnClick();" /> Klikov: <div style="display:inline;" id="clicksCount"><?=$CurrentClicks?></div>
</body>
</html>


Če ti ne rata, pa tolk časa glej v tole pa googlej, dokler ne boš znal sam tega nardit. :)
It iz aj.

a-ptuj ::

Zelo sem vesel, da Ste mi napisali skript. Vendar zadeva še vedno ne dela. kaže mi, da je napaka v 3 vrstici skripta. Prosim še za ta popravek. Hvala Vam.

DiTi ::

paco wtf je to o.O
tretja vrstica pa itak da ne more delat...moraš preverjat
 if(isset($_GET['nekaj'])){ $nekaj = $_GET['nekaj'];}

paco ::

DiTi, to je koda za katero je zaprosil a-ptuj :P, in pa napaka ni v tem, temveč v 3 vrstici JS :P.
(PS: Tudi preverjanje ni potrebno, saj če $_GET["type"] ni nastavljen, dobi spremenljivka vrednost NULL, oz. v mojem primeru zaradi casta (string) postane prazen string(""))

a-ptuj, zgornja koda meni deluje ( http://paco.pwnz.org/d/a.php ), tako da niti ne vem, kaj naj popravljam.
(PS: Če stran ni dosegljiva, počakaj, da prižgem računalnik :P)
Tretja vrstica v mojem primeru pa je itak prazna. :)
It iz aj.

Zgodovina sprememb…

  • spremenilo: paco ()

a-ptuj ::

Pozdravljeni!

Da nebom narobe napisal. Ko zaženem Vašo kodo mi javi naslednjo napako "PHP Notice: Undefined index: type in E:\delo.php on line 3 PHP Stack trace: PHP 1. {main}() E:\delo.php:0" V kateri vrstici je prišlo do napake jaz ne vem.

Zgornjo Vašo koda sem dal na stran http://mb.ipaslovenija.org/delo.php . Koda prvič zapiše podatek v datoteko delo.txt nato pa ne več. datoteka delo.txt ima atribute nastavljene na 777 (branje, pisanje, izvajanje).

overlord_tm ::

Tale na internetu dela OK, vsaj meni izgleda tako.

paco ::

Tudi meni, ampak da zdej razrešimo ta problem :P.

Zadeva sicer deluje, ampak če $_GET["type"] ni nastavljen, ti pri nastavljanju vrednosti v spremenljivko vrne error(oz. notice). Problem lahko rešiš na 2 načina:
1. na vrh php datoteke dodaš
error_reporting(false);


2. ali pa kot je že prej rekel DiTi, preden nastaviš spremenljivko preveriš če je $_GET["type"] nastavljen
$Type = (string)$_GET["type"];

zamenjaš z
$Type = NULL;
if(isset($_GET["type"]))
    $Type = (string)$_GET["type"];
It iz aj.

Zgodovina sprememb…

  • spremenilo: paco ()

a-ptuj ::

Ob zamenjavi dela skripte napake tudi meni več ne javlja, vendar meni na spletni strani http://mb.ipaslovenija.org/delo.php zadeva ne dela. Ko odprem piše Klikov: 12 , ko pa kliknem nov klik pa piše Klikov: 11, potem pa nič več. V datoteki "delo.txt" http://mb.ipaslovenija.org/delo.txt pa je zapisanih 12.

fiction ::

A ste že slišal vic, ko gre policaj programirat v PHP-ju... :P
Just kidding.

To, da imaš števec v datoteki, ni ravno najbolj idealno. Problem je, če dobiš npr. več bolj ali manj sočasnih requestov in nisi več prepričan, kako se bodo stvari izvajale. Če je v določenih primerih lahko narobe, gre za race-condition. Najbrž je opisana težava povezana s tem. Lahko da je nekdo prebral ven 10, medtem se je vse skupaj povečalo do 12, potem pa je ta prvi proces prišel spet do besede in veselo napisal nazaj 11. Priporočam uporabo flock() ali pa enostavno kakšne relacijske baze, magari tudi SQLite, če ne gre drugače.

paco ::

Izgleda da je problem v samem javascriptu in njegovem prevajanju. Zadeva namreč deluje brezhibno v Firefoxu in Operi, malo počasneje pa v Chrome-u(verjetno zaradi requestov).
It iz aj.

a-ptuj ::

Hvala lepa vsem, ki Ste mi pomagali pri tej kodi v PHP.
Res je zadeva v Firefoxu (FI-3.6)deluje brezhibno. Ne deluje pa v Internet Exploreju (IE-8) v katerem sem jaz testiral delovanje. A jo je možno usposobiti tudi, da bo delala v IE8?

fiction ::

Izgleda da je problem v samem javascriptu in njegovem prevajanju.
V bistvu fora ni v tem. Vsaj pri meni se JS v IE8 čisto lepo izvede, dobim celo odgovor. Težava je caching od IE-ja. Če probaš na roko delo.php?type=getno zmeraj dobiš isti odgovor. Če reloadaš page dobiš pravilni rezultat od PHP-ja, potem pa se prek AJAX-a povozi vrednost (in je spet napačna). Jaz bi poskusil:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
in
<META HTTP-EQUIV="Expires" CONTENT="-1">
znotraj <head> taga.

Ali pa bolj grda fora, da poleg type parametra v requestu zraven appendaš še nek random in mu daš vrednost Math.random().

verjetno zaradi requestov
Tisto, da se stvar refresha na 5 s, je čisti overkill in niti ni bila zahteva "stranke".

Res je zadeva v Firefoxu (FI-3.6)deluje brezhibno.
Zadeva ne deluje brezhibno kot sem že prej povedal, ker imaš notri tekmovalne okoliščine. Pri kakšni resni zadevi zna biti to kar hud problem. Je pa res, da je pri IE prej prišla do izraza druga reč. Če bi rekel v SQL stavku UPDATE SET value=value+1 bi se to zgodilo znotraj ene transakcije, tako pa prebereš vrednost in jo nazaj zapišeš, nimaš pa pojma kaj se (morebiti) dogaja vmes.

MrBrdo ::

fiction je izjavil:


Ali pa bolj grda fora, da poleg type parametra v requestu zraven appendaš še nek random in mu daš vrednost Math.random().

sej ni tok grda.. se kr velik uporablja, v RoR je prakticno default :)
MrBrdo

techfreak :) ::

Kolikor vem, ima IE6 občasne težave z querystringi in ne zahteva nove strani, če spremeniš samo npr. "?t=" + Math.random().

fiction ::

Kolikor vem, ima IE6 občasne težave z querystringi in ne zahteva nove strani, če spremeniš samo npr. "?t=" + Math.random().
Zanimivo. Sicer se na srečo ne ukvarjam z web developmentom, ampak kolikor sem slišal ima IE6 težave še z marsičem :)

a-ptuj ::

Zadeva deluje v večih brskalnikih. Ne dela pa v Internet Exploreju (EI6,EI7, EI8). A bi mogoče delala, če ne bi bilo samodejnega osveževanja, ki je sedaj vključebo v kodo. Ali je samodejno osveževanje nujno potrebno za delovanje take kode? Ali bi jo lahko morda kodo skrajšali, pa bi še kljub temu delala pravilno? Že naprej hvala za odgovor.

techfreak :) ::

Preizkusi:
var request;
try{
	request = new ActiveXObject('Msxml2.XMLHTTP');
}catch(e){
	try{
		request = new ActiveXObject('Microsoft.XMLHTTP');
	}catch(e){
		request = new XMLHttpRequest();
	}
}

namesto:
var request;
try
{
	request = new XMLHttpRequest();
}catch(e){
	request = new ActiveXObject("Microsoft.XMLHTTP");
}

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Excell klicanje makrota z različnimi gumbi

Oddelek: Pomoč in nasveti
11799 (615) JankoK
»

Vprašanje iz Jave

Oddelek: Programiranje
71140 (880) illion
»

[c#] Program ki izvaja autoclick

Oddelek: Programiranje
51289 (1114) milc
»

[Java]Vprašanja

Oddelek: Programiranje
242103 (1571) Bela01
»

"Paste" iz enega okna v drugega?

Oddelek: Programiranje
5990 (884) poweroff

Več podobnih tem