2012-07-29 7 views
0

Jquery UI의 자동 완성 기능을 사용하여 데이터베이스의 사용자 이름을 쿼리하려고합니다. 그래서 사용자는 내 DB에있는 것과 비슷한 사용자 이름을 입력하고 자동 완성 기능을 사용하여 드롭 다운에서 찾고자하는 것을 추측 할 수 있습니다. 불행히도 백엔드 스크립트를 통해 제안을 얻을 수는 없습니다.Jquery 자동 완성 원격 데이터 소스

<?php 

sleep(3); 
// no term passed - just exit early with no response 
if (empty($_GET['term'])) exit ; 
$q = strtolower($_GET["term"]); 
// remove slashes if they were magically added 
if (get_magic_quotes_gpc()) $q = stripslashes($q); 

$sql = "SELECT * FROM users"; 
$r = mysql_query($sql); 
$items = array(); 
if ($r !== false && mysql_num_rows($r) > 0) { 
    while ($a = mysql_fetch_assoc($r)) { 
     $username = $a['username']; 
     array_push($items, $username);    
     } 
} 

$result = array(); 
foreach ($items as $key=>$value) { 
    if (strpos(strtolower($key), $q) !== false) { 
     array_push($result, array("id"=>$k, "label"=>$key, "value" => strip_tags($key))); 
    } 
    if (count($result) > 11) 
     break; 
} 

// json_encode is available in PHP 5.2 and above, or you can install a PECL module in earlier versions 
echo json_encode($result); 
/* echo $items; */ 

?> 

결과를 반환해야하는 경우에도 스크립트는 단순히 빈 배열을 반환합니다. 여기에 무엇이 잘못되었는지 전혀 모르겠다.

답변

1

먼저 데이터베이스를 쿼리하고 전체 테이블을 반환하여 결과를 살펴 보는 것은 좋지 않다. SQL 쿼리는 데이터베이스에서 데이터를 필터링하는 경우 더 빠르게 실행됩니다. 당신은 어쨌든 데이터를 불러 와야 만합니다. 필터링하지 않고 관련 결과 만 반환하는 이유는 무엇입니까? (. 난 당신이 SQL 주입 공격으로부터 보호하는 데 사용한다이 경우 매개 변수화 된 쿼리를 사용하고 있습니다)

$sql = "SELECT * FROM users where username like :term"; 

:

당신은 다음과 같이 쿼리에게 같이 매개 변수를 보낼 필요

또한 다음과 같은 더 위험한 방법을 사용할 수 있습니다 : 매개 변수화 된 쿼리에 대한

$sql = "SELECT * FROM users WHERE username = ". $term; 

참조 : How can I prevent SQL injection in PHP?

+0

흠,하지만 왜 스크립트가 빈 배열을 반환하는지 알 수 있습니까? – Thomas

+0

오프셋 값 $ q에 문자열이 할당 된 것처럼 보입니다. $ q = strtolower ($ _ GET [ "term"]); $ q는 오프셋이고 문서 당 strpos에서 검색을 시작할 숫자 값이어야합니다. offset 지정되면 검색은 문자열의 처음부터 계산 된이 문자 수를 시작합니다. –

관련 문제