2014-09-25 2 views
1

AJAX를 사용하여 이미지와 일부 문자열/숫자를 업로드하려고합니다. 하나의 매우 중요한 문제를 제외하고는 코드가 잘 작동합니다 (모든 것이 데이터베이스에 들어감). 나는 매우 "문자"변수를 고유하게하고, 이미 취해진 문자 이름을 시도하기 위해 오류 메시지를 표시하는 데 사용하려는 모든 시도가 작동하지 않습니다.무한 루프를 일으키는 PHP while 루프

AJAX : 여기 내 코드입니다

function CSubmit() { 

clearInterval(MoveDrawTimer); 

var a=document.forms['form-id']["thefiles"].value; if (a == "") { document.getElementById("info").innerHTML="You must upload an image."; return }; 

if (showFileSize() > 5000000) { document.getElementById("info").innerHTML="File is too big. Maximum size is 5,000,000 bytes."; return }; 

var accepted = [".gif",".png",".jpg",".jpeg"]; 

if (Ext in oc(accepted) == true) { 

var dataURLToBlob = function(dataURL) { 
var BASE64_MARKER = ';base64,'; 
if (dataURL.indexOf(BASE64_MARKER) == -1) { 
    var parts = dataURL.split(','); 
    var contentType = parts[0].split(':')[1]; 
    var raw = parts[1]; 

    return new Blob([raw], {type: contentType}); 
} 

var parts = dataURL.split(BASE64_MARKER); 
var contentType = parts[0].split(':')[1]; 
var raw = window.atob(parts[1]); 
var rawLength = raw.length; 

var uInt8Array = new Uint8Array(rawLength); 

for (var i = 0; i < rawLength; ++i) { 
    uInt8Array[i] = raw.charCodeAt(i); 
} 

return new Blob([uInt8Array], {type: contentType}); }; 

newImage = dataURLToBlob(dataURL); } else { document.getElementById("info").innerHTML="Cannot send file. Check your extensions."; return }; 


var canvas = document.getElementById("Cinfo"); 
var context = canvas.getContext("2d"); 
context.clearRect(0, 0, 400, 400); 

    var TotalSpent = StrPts + IntPts + WisPts + SpdPts + MovPts; 

    var theform = document.getElementById("CharName"); 

    if (theform.value == "") { document.getElementById("info").innerHTML="Your character must have a name."; return } 

    if (/[^a-zA-Z0-9]/.test(theform.value)) { 
    document.getElementById("info").innerHTML="Name must contain only letters and/or numbers."; return } 

    if (theform.value.length > 14) { document.getElementById("info").innerHTML="Character names must be 14 characters max."; return } 

    if (TotalSpent !== 2) { document.getElementById("info").innerHTML="You must spend exactly 2 points."; return } 


var fd = new FormData(); 
fd.append('data', newImage); 
fd.append('character', theform.value); 
fd.append('str', StrPts); 
fd.append('int', IntPts); 
fd.append('wis', WisPts); 
fd.append('spd', SpdPts); 
fd.append('mov', MovPts); 



    //beginning of server transmission. above is javascript front end authentication. 


       //sending the following information: 


       //theform.value // character name 
       //StrPts, IntPts, WisPts, SpdPts, MovPts // the character stats 

       var xmlhttp; 

       if (window.XMLHttpRequest) 
        {  // code for IE7+, Firefox, Chrome, Opera, Safari 
        xmlhttp=new XMLHttpRequest(); 
        } 
        else 
        {  // code for IE6, IE5 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } 


       xmlhttp.onreadystatechange=function(){ xmlhttp.addEventListener("progress", document.getElementById("info").innerHTML="Please wait . . ." , false); 
                 if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
                 if (xmlhttp.responseText.length <= 14) { 
                  document.getElementById("info").innerHTML="Congratulations, " + xmlhttp.responseText + " has been approved."; 
                  SelectScreen();} } } 


       xmlhttp.open("POST","CHunique.php",true); 
       xmlhttp.send(fd); 

은};

<?php 



@$con=mysqli_connect("$db_host","$db_username","$db_pass", "$db_name") or die ("Could not connect to the database. Please try again later."); 

mysqli_set_charset($con,"UTF8"); 

$Err = "fine"; 

session_start(); 
$login = $_SESSION['account']; 




$CHresult = mysqli_query($con,"SELECT * FROM CHstats"); 


while($row = mysqli_fetch_array($CHresult)) { 

$thecharacters = $row['character']; 

if (strtolower($character) === strtolower($thecharacters)) { $Err = " Character name already in use."; break; }; } 

문제 : 당신이 볼 수 있듯이

, 나는 다음과 같은 (문제의 시범 현재 불완전한 테스트 페이지)입니다 CHunique.php,로 전송 후 양식에 이르기까지 모든 것을 추가하고 있어요 여기에 서버로부터 응답이 전혀 들리지 않는다는 것입니다. "기다려주십시오."라고 말하는 "진행"기능에는 무한정 남아 있습니다. 이것은 PHP 페이지에서 시도하는 모든 while 루프에 대해 사실입니다. 서버가 로딩에서 막혔습니다. 이는 사용자 이름이 고유한지 여부를 확인하기 위해 모든 문자를 반복하는 while 루프를 사용해야하기 때문에 큰 문제입니다.

다시 말하면 이미지 업로드를 포함하여 모든 사항이 정상적으로 작동합니다. 단,이 경우는 예외입니다. 이 검사는 매우 중요하며, PHP 웹 페이지에서 무한한로드 시간이 발생하는 이유는 무엇입니까? 도와주세요.

또한 JQuery를 사용하지 않습니다.

정말

$query = sprintf("SELECT * FROM CHstats WHERE LOWER(character) = LOWER('%s')", $thecharacters); 
$result = mysqli_query($con, $query); 
if(mysqli_num_rows($result) > 0){ 
    // duplicate character name 
} 

또한 PHP의 비교를 할 의미가 없습니다, 당신을 위해 일을 할 수있는 쿼리를 변경하지 왜

+0

PHP가 응답을 반향 출력하지 않는 것 같습니다. – adeneo

+3

나는 진짜로 그것들이 당신의 진짜 db 자격 증명이 아니길 바래. –

+0

게시 된 코드에 루프가 하나있는 것을 볼 수 있습니다. 이 while 루프는 데이터를 가져 오는 것일 뿐이며 여기에 무한 루프가 발생할 수있는 방법이없는 것처럼 보입니다. 데이터가 너무 커서 많은 행이로드되지 않으면 지연이 발생하고 무언가가 반복되는 것으로 생각하게됩니다. –

답변

0

예! 나는 몇 시간의 좌절감을 안고 그것을 실제로 모두 풀었다. 대답은 내 바보 같은 AJAX 조건에있다 : if (xmlhttp.responseText.length < = 14). 응답이 14자를 초과하여 서버가 무기한로드됩니다.

1

는, while 루프가 페이지를 일으키는 것입니다 있는지 확인 당신입니다 매달려? mysql 연결이 만들어지지 않았거나 오랜 시간이 걸릴 가능성이 높습니다. 아직 작성하지 않았다면 코드에서 die 문을 이동하여 코드가 끊어진 부분을 확인하십시오.

+0

무한한로드를 발생시키는 while 루프를 사용하지 않고 $ thecharacters를 정의 할 수 없기 때문에 주로 코드가 작동하지 않습니다. 솔직히, while 루프가 없다면 코드가 제대로 작동하므로, 그 일이 무엇인지 추측하고 있습니다. – Joshua231

+0

사실, 두 번째 생각에, 나는 while 루프없이 작동하도록 코드를 재 작성했지만 여전히로드 시간이 무한합니다.문제는 PHP 코드가 데이터베이스에서 아무 것도 체크하지 않으면 무한히로드된다는 것인데, 이것은 매우 이상합니다. 왜 그랬을까요? – Joshua231

+0

교수형을하기 전에 얼마나 멀리 떨어져 있는지 알아보기 위해 die 진술을 했습니까? 내 생각 엔 mysql 서버에 연결하는 동안 매달려있을 것입니다. –

관련 문제