2012-06-22 2 views
2

버튼의 클릭 수를 계산하고 텍스트 파일에 클릭 수를 저장하기 만하면되지만이 코드는 작동하지 않습니다. 클릭 수는 저장되지 않습니다. HTML 파일에서 PHP, AJAX 및 JavaScript를 사용하는 간단한 버튼 클릭 카운터

나는 자바 스크립트를 실행하는 버튼 onClick를 사용했다 : 우리라는 PHP 파일에서

function do() { 
    if (window.XMLHttpRequest){ 
       xhr = new XMLHttpRequest() 
    } 
    else 
    { 
    if (window.ActiveXObject){ 
       var xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       } 
      xhr.open('GET','count.php',false); 
      xhr.onreadystatechange = function() { 
       if(xhr.readyState === 4 && xhr.status === 200) { 
        while(results.hasChildNodes()) { 
         results.removeChild(results.lastChild); 
        } 
        results.appendChild(document.createTextNode(xhr.responseText)); 
       } 
      } 
      xhr.send(); 
    } 

, 우리는 다음과 같은 코드가 있습니다

<?php 

    $clicks = file_get_contents("clicks.txt"); 
    $clicks++; 

    $fp = fopen("clicks.txt", "w+"); 

    while (!flock($fp, LOCK_EX)) {  
     usleep(500000); // Delay half a second 
    } 

    fwrite($fp, $clicks); 
    fclose($fp); 
    flock($fp, LOCK_UN); 

?> 

당신이 날 도울 수를 내 코드에서 문제를 찾으려면?
다른 HTML 페이지의 텍스트 파일을 어떻게 읽습니까?
는 (그냥 텍스트 파일의 정보를 보여줍니다.)

+0

코드의 문제점은 무엇입니까? – andrewsi

+0

죄송합니다, 편집을 참조하십시오. – user1431627

+0

브라우저에서 PHP 파일에 직접 액세스 할 수 있습니까? – andrewsi

답변

1

다음과 같은 일을해야의 PHP 페이지가 제대로 작동 가정 :

<html> 
    <head> 
     <title>Example</title> 
    </head> 
    <body> 
     <script type="text/javascript"> 

function getXMLHttp() 
{ 
    var xmlHttp 
    try 
    { 
    xmlHttp = new XMLHttpRequest(); 
    } 
    catch(e) 
    { 
    try 
    { 
     xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch(e) 
    { 
     try 
     { 
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch(e) 
     { 
     alert("AJAX not supported.") 
     return false; 
     } 
    } 
    } 
    return xmlHttp; 
} 

function MakeRequest() 
{ 
    var xmlHttp = getXMLHttp(); 
    xmlHttp.onreadystatechange = function() 
    { 
    if(xmlHttp.readyState == 4) 
    { 
     HandleResponse(xmlHttp.responseText); 
    } 
    } 
    xmlHttp.open("GET", "count.php", true); 
    xmlHttp.send(null); 
} 

function HandleResponse(response) 
{ 
    document.getElementById('ResponseDiv').innerHTML = response; 
} 
     </script> 
     <input type='button' onclick='MakeRequest();' value='Button'/> 
     <br /> 
     <br /> 
     <div id='ResponseDiv'> 
      Count 
     </div> 
    </body> 
</html> 
+0

try catch를 사용해야합니까? – user1431627

+0

네, 적절한 오류 처리가 중요합니다.'AJAX'가 지원되지 않는 동안'AJAX' 요청을하는 것은 절대 의미가 없으며 오류를 일으킬 수 있습니다. – Anne

+0

Ajax가 작동하지 않으면 사용자를 방해하고 싶지 않습니다. 그냥 제거해도 괜찮습니까? – user1431627

1

몇 가지를 PHP 측에 유의해야.

1) 작성한 글을 읽고 쓰는 데 w +를 사용하여 파일을 여는 중입니다. 또한 자물쇠가 제자리에 놓이기 전에 파일을 자릅니다.

2) 잠금으로 인해 병렬 읽기 및 쓰기가 실패합니다. 이렇게하면 $ clicks를 false로 설정할 수 있으며 fopen이 호출되기 전에 파일 잠금이 해제 된 경우 카운터를 지울 수 있습니다.

3) 잠금이 활성화되어있는 동안 핸들을 닫으므로 잠금을 올바르게 해제하지 않습니다. 이런 일이 장기간 실행되는 스크립트의 경우 스크립트가 종료 될 때까지 잠금이 해제되지 않습니다.

이렇게하면 이러한 모든 문제를 해결할 수 있습니다.

<?php 

$fp = false; 
// Open file for reading, then writing 
while (($fp=fopen('clicks.txt','r+'))===false) { 
    usleep(250000); // Delay 1/4 second 
} 
// Obtain lock 
while (!flock($fp, LOCK_EX)) {  
    usleep(250000); // Delay 1/4 second 
} 
// Read Clicks 
$clicks = trim(fread($fp,1024)); 
// Add click 
$clicks++; 
// Empty file 
ftruncate($fp,0); 
// Write clicks 
fwrite($fp, $clicks); 
// Release Lock 
flock($fp, LOCK_UN); 
// Release handle 
fclose($fp); 

?> 
+0

완전한 다른 웹 페이지에서 텍스트 파일의 내용을 어떻게 표시합니까? – user1431627

+0

파일을 읽기 전용 (r)으로 열기 만하면 독점 잠금 대신 읽기 잠금을 사용하므로이 스크립트는 읽기 도중에 사용자를 차단할 수 없습니다. fopen 및 flock 호출은 다른 스크립트로 잠그기 때문에 루프에 넣어야합니다. 이런 종류의 일은 방금 데이터베이스를 사용하면 훨씬 쉽습니다. :) –

+0

오케이. 나는 서버를 얻을 때 갈 것이다. 나는 이미 XML 요청을 작성했습니다. 단지 그것을 사용하고 PHP를 서버에 저장하기 위해 다시 프로그래밍합니까? – user1431627