2010-01-09 4 views
0

주어진 post/get 매개 변수에 따라 mysql 결과를 리턴하는 작은 PHP 스크립트를 작성했습니다. 이 파일을 사용하여 jquery.post 또는 .get 명령을 사용하여 데이터베이스에서 항목을 검색 할 수 있습니다.함수의 리턴으로 jQuery ajax 출력

스크립트는 항상 1 값을 반환합니다. 그래서 데이터베이스에서 검색된 값을 반환하는 자바 스크립트 함수를 만들려고했습니다.

function mysql(args) { 
    $.post("scripts/ajax_mysql.php",args,function(data) { 
     return data; 
    }); 
} 

var value=mysql({ table:"user", where:"nickname='test'", get:"email" }); 

이 기능이 이미 통과 된 경우 데이터가 검색되는 것 같다

이것은 내가하고 싶은하지만 난 그게해야처럼 작동하지 않는 것입니다. 이 문제를 해결할 수있는 방법이 있습니까?

+3

이것은 끔찍한 보안 구멍처럼 보입니다. 모든 방문자가 효과적으로 전체 데이터베이스에 액세스 할 수 있습니다. 또한 체크 아웃 : http://en.wikipedia.org/wiki/SQL_injection –

+0

사실, 그것에 대해 생각하지 않았다. – Jens

+0

이것을 달성하기위한 안전한 방법이 있습니까? – Jens

답변

0

문제는 return data 문이 mysql 함수에서 "return"을 발생시키지 않는다는 것입니다.

내가 할 수있는 것은 mysql 함수에서 XMLHTTPRequest 객체를 반환하고 $.post 호출이 반환되고 성공적인 Ajax 호출을 위해 수신기를 추가하는 것입니다.

1

Ajax는 비동기입니다. 함수를 호출하면 요청이 실행되고 프로그램이 계속됩니다.

요청이 다시 돌아 오면 이벤트가 발생하고 연결된 이벤트 처리기가 데이터를 처리합니다.

XHR을 사용하여 동기식으로 만들 수는 있지만 권장하지 않습니다.

반환 된 변수가 아닌 콜백에서 검색된 데이터를 처리하도록 프로그램을 디자인하십시오.

2

사용자가 기본적으로 모든 종류의 SQL 명령을 작성하여 서버로 보내는 문제 - 보안 문제가 끔찍한 끔찍한 생각인데, 스크립트의 문제점은 AJAX의 본질을 이해하지 못하는 것입니다.

AJAX 호출이 비동기 적이므로 AJAX 호출이 완료되기 전에 메서드가 반환됩니다. 이 문제를 처리 할 수있는 두 가지 방법이 있습니다. 함수에 대한 콜백을 전달하고 AJAX 게시가 완료되면 콜백을 실행합니다. 이것은 요청의 비동기 특성을 유지합니다. 또는 전체 $ .ajax() 구문을 사용하여 게시를 수행하고 async 매개 변수를 true로 설정할 수 있습니다. 그런 다음 AJAX 요청의 결과를 함수의 외부 블록 범위에 저장하고 함수의 끝에서이를 반환 할 수 있습니다. async을 true로 설정하면 기본적으로 jQuery가 처리하는 것을 제외하고는 콜백을 사용하는 작업을 수행합니다.

function mysql(data, callback) { 
    $.post("scripts/ajax_mysql.php",args,function(data) { 
     if (callback) { 
      callback(data); 
     } 
    }); 
} 

mysql({ table:"user", where:"nickname='test'", get:"email" }, function(user) { 
    $('#email').val(user.email); 
    ... 
}); 

하거나 기존 통화 의미와

function mysql(data, callback) { 
    var value; 
    $.ajax({ 
     url: "scripts/ajax_mysql.php", 
     type: 'post', 
     async: false, 
     data: args, 
     success: function(data) { 
        value = data; 
       } 
    }); 
    return value; 
} 

.

+0

이 방법으로 나는 전체 mysql 함수를 삭제하고 $ .post 콜백을 사용해야한다. – Jens

+0

필요는 없습니다. 설정 반복을 줄이기 위해 일련의 코드를 패키지화하는 것이 편리 할 수 ​​있습니다.당신은 당신의 자바 스크립트 DRY도 유지하고 싶다. – tvanfosson