2013-02-13 3 views
1

행의 id가 주어진 배열에있는 mysql 데이터베이스의 테이블에서 요소를 선택하려고합니다.주어진 배열의 id가 어디에 있는지 선택하기

이 값을 반환

<?php 
    $ids = '1,2,3,4'; 
    $DBH = .... 
    $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN (:ids)"); 
    $getID->execute(array(':ids'=>$ids)); 
?> 

내가 그 코드에 어떤 문제가 있는지 이해할 수 없다 :

<?php 
    $ids = '1,2,3,4'; 
    $DBH = .... 
    $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN ($ids)"); 
    $getID->execute(); 
?> 

이 아무 것도 반환하지 않습니다.

+0

무엇입니까 : ids ?? 두 번째 쿼리에서 ........ 쿼리를 실행할 때 1,2,3,4 출력을 줄 것입니까? –

+0

$ ids를 문자열에서 배열로 변경하려고합니다. $ ids = array ('1', ' 2 ','3 ','4 ') – Ateszki

+0

첫 번째 코드가 작동해야합니다. 확실한 질문을하기 위해 테이블 ​​t1에 통조림으로 만들어진 'id'라는 열이 있습니까? 또한 영향을 미치지는 않지만 $ ids는 실제로 배열이 아닌 문자열입니다. – KevInSol

답변

1

처음에는 PHP를 사용하여 d로 이야기하기 전에 문자열 보간 작업을 수행했습니다. atabase; 실제로 PHP 변수를 사용하여 SQL 코드를 생성합니다. SQL 주입은 데이터베이스에서 데이터와 코드의 차이를 알지 못하기 때문에 "코드"공간으로 누출되는 "데이터"로부터 보호 할 수 없습니다. 둘째로, 바인드 된 매개 변수를 사용하여 데이터베이스에 "처리하십시오 : 단일 값으로 ID, 그 내용은 나중에 알려 드리겠습니다." 이러한 점에 대한 자세한 내용은

$sql = 'SELECT * from t1 where id in (' . str_repeat('?', count($ids)) . ')'; 
$stmt = $pdo->prepare($sql); 
$stmt->execute($ids); 

체크 아웃 this 튜토리얼 : 단절을 해결하는 쉬운 방법은 같은 것입니다.

0

PDO를 사용한다고 가정하면 다음을 시도하십시오. 원래 쿼리가 실행될

<?php 
    $ids = '1,2,3,4'; 
    $DBH = .... 
    $getID = $DBH->prepare("SELECT * FROM t1 WHERE id IN (:ids)"); 
    $getID->bindParam(":ids", $ids, PDO::PARAM_INT); 
    $getID->execute(); 
?> 

, 쿼리 당신이 정수로 바인딩 PDO를 말할 때, 실행됩니다

SELECT * FROM t1 WHERE id IN ("1,2,3,4")

같이 있도록 PDO는 입력을 탈출합니다

SELECT * FROM t1 WHERE id IN (1,2,3,4)

+0

params가 바인딩 된 PDO 개체를 인쇄하는 방법이 있습니까? –

+0

체크 아웃이 - http://php.net/manual/en/pdostatement.debugdumpparams.php –

+0

이 사용 사례에서 준비된 문장 중 하나는 값을 포함하는 SQL이 절대로 존재하지 않는다는 것입니다. 'select * from foo where bar = : baz'는 데이터베이스 엔진에 전달되는 내용으로, 데이터베이스 서버에 명령문으로 할당되고, 나중에 해당 명령문이 호출되며 그 시점에서 값이 제공됩니다. 데이터베이스는 ' "코드"가 전송 될 때 "데이터"가 무엇인지 알면 후자가 어떻게 든 전자로 (일반적으로 "SQL 주입"으로 알려진 문제점으로) 취급되지 않습니다. – TML

관련 문제