2013-11-25 8 views
6

ID가 1,2,3,4,5와 같은 문자열이 있는데 그 목록에 ID가 들어있는 모든 행을 mysql에 나열 할 수 있기를 원합니다. Mysql 여기서 id는 배열입니다.

내가 가장 쉬운 방법은 문자열을 배열로 설정하고 ($ 배열)에 일치하는 것을지지 않습니다하지만 나를 위해 작동하지 않습니다 - 오류 등을하지만 행이 반환 :

$string="1,2,3,4,5"; 
$array=array_map('intval', explode(',', $string)); 
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')"); 
을 나는 $ 배열의 위해서 var_dump를 할 경우

내가 얻을 : 나는

array(5) { 
    [0]=> int(1) 
    [1]=> int(2) 
    [2]=> int(3) 
    [3]=> int(4) 
    [4]=> int(5) 
} 

어떤 생각을 속이고 있어요 어디? 그 영향

SELECT name FROM users WHERE id IN ('Array'); 

또는 뭔가 :

+0

ID 문자열 또는 정수가 있습니까? –

답변

17
$string="1,2,3,4,5"; 
$array=array_map('intval', explode(',', $string)); 
$array = implode("','",$array); 
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')"); 
+0

고마워요, 이건 – bhttoan

+1

@bhttoan이 효과가 있었을 지 모르지만, 취약점에 영향을받습니다. – qwertynl

+0

어떻게 그렇게 되나요? 불필요한 코드를 너무 많이 넣는 것을 피하기 위해 코드의 단순화 된 뷰 (실제 쿼리 자체 포함)를 보여주었습니다. 그러나 배열의 내용이 안전하고 위생적이라는 것이 기쁩니다. – bhttoan

6

귀하의 질의에 변환합니다.

처럼, 대신 뭔가를 준비 쿼리를 사용하여보십시오 :에

$array=array_map('intval', explode(',', $string)); 

$numbers = explode(',', $string); 
$prepare = array_map(function(){ return '?'; }, $numbers); 
$statement = mysqli_prepare($link , "SELECT name FROM users WHERE id IN ('".implode(',', $prepare)."')"); 
if($statement) { 
    $ints = array_map(function(){ return 'i'; }, $numbers); 
    call_user_func_array("mysqli_stmt_bind_param", array_merge(
     array($statement, implode('', $ints)), $numbers 
    )); 
    $results = mysqli_stmt_execute($statement); 
    // do something with results 
    // ... 
} 
1

변경 : 배열이 아닌 문자열을 반환 array_map

$array= implode(',', array_map('intval', explode(',', $string))); 

. WHERE 절에서 사용하려면 배열을 쉼표로 구분 된 문자열로 변환해야합니다.

+0

그러면 원래 문자열로 되돌립니다 ... 요점은 무엇입니까? – qwertynl

+0

나는 그것이 그가 요청한 것이라고 생각한다. – Darius

+0

이것은 내 선택한 답변과 같은 최종 결과처럼 보이지만 한 줄에 두 개가 아니기 때문에 확실하지 왜 downvote? FYI @Darius 나는 이것을 downvote하지 않았다 – bhttoan