2013-06-09 2 views
2

N.B. - 처음에는 잘못된 제목에 대해 유감스럽게 생각합니다. 게시하지 않고 해결하려는 다른 질문이었습니다.테이블에 대한 ajax 쿼리의 일관되지 않은 결과

PHP 파일 호출에서 데이터를 반환하는 것과 관련하여 두 가지 간단한 질문을하고 싶습니다. 이 포럼 덕분에 HMTL에 PHP 코드를 작성하여 db 테이블에 데이터를 저장하고 테이블에서 데이터를 검색 할 수 있습니다.

하지만 지금, 한 페이지에, 나는 테이블에서 데이터를 검색, 테이블에 데이터를 추가 필요하고, 갱신 모든의 새로 고침없이 데이터, HTML 화면. 그래서 나는 MySQL의 테이블 (6 개 분야), 순수 PHP로 작성된 "백엔드", HTML 및 자바 스크립트로 작성된 "프론트 엔드"와 함께 약간의 "테스트"환경을했다.

하루 종일 어제 내가 떠난 작은 머리카락을 꺼내고 있었지만 마침내 html/javascript 파일로 데이터를 다시 전달하는 개념을 알아 냈습니다 (아래 코드를 모두 알려 드리겠습니다). 모든 것이 훌륭하게 작동합니다! 그러나 일치하지 않습니다 - 그래서 실험은 다음 단계로 수행되었다 : 프론트 엔드의

  • FTP 업로드 번호를 입력
  • IE
  • 에 백엔드의
  • FTP 업로드
  • 새로 고침 프론트 엔드 2 배 입력 상자에 "150"을 입력하십시오. ("150"은 지미 헨드릭스의 행 번호
    입니다.)
  • 양식의 "제출"버튼을 클릭하십시오. (이 실험에서는 이 "enter"키를 사용하지 않습니다.)
  • 작동하면 경고 메시지가 Jimi Hendrix와 함께 표시됩니다.
  • 작동하지 않는 경우 아무 것도 나타나지 않습니다.

그래서 여기 두 실험의 결과 Y = 지미 헨드릭스 N = 아니오 팝업 상자

  • 새로 고침
  • YNYNNYYNYYYNYYNYYYNNY 뉴욕 뉴욕
  • 새로 고침
  • YYYNYYNYYYYNYNYYNYNYN NYYN

이 있습니다 나는 정말로 가볍게 침을 볼 수 없다. 루틴이 "작동"하는 경우에 대해 여기에 있습니다. 이 동작은 db에 저장하는 것과 관련된 다른 코드 중 일부입니다.

이제 내 두 가지 질문 :

  • 이 코드가 작동하는 방식에 변화를 설명 할 수 있습니까? 어떤 식 으로든 내가 그것을 고칠 수 있습니까?
  • 지미 헨드릭스를 "경고"상자에 넣었습니다.하지만 그를 div에 넣으려면 어떤 명령을 사용해야합니까? ? .load? 또는 다른 명령? 여기

    <?php 
    $localid = $_POST['localid']; 
    
    $host = "hostname"; 
    $user = "username"; 
    $password = "password"; 
    $dbname = "dbname"; 
    
    $cxn = mysqli_connect($host,$user,$password,$dbname); 
    if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error();} 
    
    $query = " select * from testtable where localid = $localid "; 
    $result = mysqli_query($cxn, $query) or die ("could not query database 1"); 
    
    while ($row = mysqli_fetch_array($result)) 
    { 
    $firstname = $row['firstname']; 
    $lastname = $row['lastname']; 
    $zip = $row['physzip']; 
    $gender = $row['gender']; 
    $dob = $row['dob']; 
    } 
    
    $variablestopass = array 
    (
        'ln' => $lastname, 
        'fn' => $firstname, 
        'zip' => $zip, 
        'gender' => $gender, 
        'dob' => $dob 
    ); 
    echo json_encode($variablestopass);      
    ?> 
    

    그리고는 "프론트 엔드"이다 (헤더없이) :

    <body> 
    <form name="#inputform"> 
    <table class="divtest"> 
    <tr><td>Localid:</td><td> <input type="text" id="localid"></td></tr> 
    <tr><td colspan="2" align="center"><input type="submit" id="submitbutton" value="Submit" /></td></tr> 
    </table> 
    </form> 
    
    <div id="loadmehere" class="divtest"></div> 
    
    <script type="text/javascript"> 
    $(document).ready(function(e) { 
    
    $("#submitbutton").click(function() { 
    
    var localid = document.getElementById("localid").value; 
    
    $.ajax({ 
         type: "POST", 
         url: "testajaxbackend.php", 
         data: {localid: localid}, 
         dataType : 'json', 
         success: function(result) { 
                alert(result['fn'] + result['ln'] + result['zip'] + result['gender'] + result['dob']); 
                }, 
         error : function() { alert("error"); } 
    });//End of ajax call 
    });//End of click 
    });//End of ready 
    </script> 
    
    </body> 
    </html> 
    

    당신이 만들 우려가 사전에 어떤 도움을 주셔서 감사합니다

다음은 PHP 파일입니다. 추신 - 다른 놈들이 내 짐승 코드 때문에 도움이 될 수도 있기 때문에이 사실을 알려드립니다.

+0

lol 반환 변수를 VariableStopAss로 읽습니다. – 75inchpianist

+0

Sidenote - 당신은'$ _POST [ 'localid']'를 위생적으로 보이지 않습니다. 또한 $ firstname 등을 검색하는 것을 이해하지 못합니다. while 루프를 수행하지만 다음에 루프가 실행되면 vars가 겹쳐 쓰입니다. – jdepypere

+0

생각. 클릭 함수의 첫 번째 줄에'e.preventDefault();'를 추가하십시오. 물론 e를 클릭에 대한 입력으로 추가하십시오. 제출 기능이 모르게 기본값을 수행 중일 수 있습니다. – foochow

답변

1

Ajax를 사용하려면 양식 제출을 옆으로 두어야합니다. 둘 다 사용할 수 없습니다. 그것은 혼란 스러울 것입니다. 제출 버튼을 클릭하면이 버튼이 다시로드되고 ajax 컨텍스트가 손실됩니다. 원하는 경우

<input type="button" id="submitbutton" value="Submit" />

, 당신은 form 태그를 제거 할 수 있습니다

는에 버튼을 변경

.

는 보안을 위해,이에 PHP를 변경합니다

<?php 
$localid = $_POST['localid']; 

if (!is_numeric($localid)) { echo "Error!"; exit; }// Prevention of SQL injection 

$host = "hostname"; 
$user = "username"; 
$password = "password"; 
$dbname = "dbname"; 

$cxn = mysqli_connect($host,$user,$password,$dbname); 
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error(); exit;} 

$localid = mysqli_real_escape_string($localid, $cxn); // Double prevention of SQL injection 

$query = "SELECT * FROM testtable WHERE localid = $localid LIMIT 0, 1"; 
$result = mysqli_query($cxn, $query) or die ("could not query database 1"); 

if (mysqli_num_rows($result) > 0) 
{ 
    $row = mysqli_fetch_array($result); 

    $variablestopass = array 
    (
     'ln' => $row['lastname'], 
     'fn' => $row['firstname'], 
     'zip' => $row['physzip'], 
     'gender' => $row['gender'], 
     'dob' => $row['dob'] 
    ); 

    echo json_encode($variablestopass); 
} 
else 
{ 
    echo "Erro selection id"; 
} 
?> 

글쎄, 당신은 내가 어떤 SQL 주입 방지 및 mysqli_num_rows와 결과 체크를 추가 한 볼 수 있습니다. 내가 이해한다면,이 코드는 단지 하나의 결과를 리턴 할 것입니다. 그래서 while 블록을 제거하고 쿼리에 LIMIT 절을 추가했습니다. 따라서 프론트 엔드는 단 하나의 결과 만받을 것이라고 확신합니다. 내가 바꿀 것, 마지막으로

$variablestopass = array(); 
while ($row = mysqli_fetch_array($result)) 
{ 
    $variablestopass[] = array 
    (
     'ln' => $row['lastname'], 
     'fn' => $row['firstname'], 
     'zip' => $row['physzip'], 
     'gender' => $row['gender'], 
     'dob' => $row['dob'] 
    ); 
} 

: 내가 잘못했다 경우에, 당신은 당신의 방법은 더 이상의 레코드를 반환하는 실패의 원인이 방법을 LIMIT 절을 제거하고 while을 다시 설정하지만해야 할 수 있습니다

sucess: function(result) 
{ 
    var result = jQuery.parseJSON(result); 

    alert(result.fn + " - " + result.ln + " - " + result.zip); // and so on... 
} 

참고 :이 귀하의 success 아약스 개체 조금이 success 기능은 하나의 결과를 spects.

의심의 여지가 있으면 알려주십시오. 행운을 빕니다!

+0

동의를 실행합니다. 'type = "button"'을 사용하는 것이 submit보다 낫습니다. 이전의 내 의견은 유형을 전환하는 것과 비슷한 효과를 나타 냈습니다. 프로젝트가 당신이 아닌 다른 사람에 의해 사용된다고 가정 할 때, 물론 도망 치는 것이 좋습니다. 나는 'from'태그를 제거 할 이유가 없다. – foochow

+0

감사합니다! 고맙습니다! 고마워! 지난 2 시간 동안이 결과를 얻었으며 결과는 다음과 같습니다. 1 - 버튼 유형을 "제출"에서 "버튼"으로 변경하는 것은 천재적이었습니다 - 모든 것이 바뀌 었습니다! 이제는 100 %의 시간 동안 작동합니다. – TimSPQR

+0

2 - 주입 보호를 위해 두 줄을 추가하면 충돌이 발생하여 아무 것도하지 않았습니다. 나는 그것이 내가 제출 한 숫자가 실제로는 숫자가 아닌 문자열이라는 사실과 관련이 있다고 확신 할 것이다. - 그 점에 관해 더 많은 숙제가 필요하다. 3 - 쿼리 문에 "LIMIT"가 추가 된 것을 본 적이 없으며 매우 효과적입니다. 4 - 결과를 반환하는 쿼리는 항상 한 줄입니다. 그러나 WHILE 문을 사용하지 않고 한 줄을 꺼내는 방법을 모릅니다. 코드가 훌륭하게 작동합니다! – TimSPQR

관련 문제