2014-12-12 2 views
-1

이 주제에 대한 많은 힌트가 있는데, 이것을 시도했습니다 : How to create a secure mysql prepared statement in php? 및 그 밖의 많은 것들이 있지만 아무런 효과가 없습니다. 데이터베이스에서 무언가를 선택하고 매개 변수없이 쿼리하려면 괜찮습니다. 그러나 매개 변수가있는 열과 테이블에 대한 데이터를 원한다면 작동하지 않고 빈 배열을 반환합니다. 어떤 힌트?PDO 양식 선택 MYSQL db

function getDataByColumn($column, $table) { 
    try { 
     $connection = new PDO("mysql:dbname=vydap;charset=utf8;host=127.0.0.1", "...","..."); 
    } catch (PDOException $e) { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 
    $query = "SELECT ? FROM ?"; 
// $query = "SELECT :column FROM :table"; 
    $stmt = $connection->prepare($query); 
// $stmt->bindParam(':column', $column); 
// $stmt->bindParam(':table', $table);  
    $stmt->bindParam(1, $column); 
    $stmt->bindParam(2, $table); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    var_dump($result); 
} 
+0

맞아요, 그런 식으로 작동하지 않습니다. 이것은 자주 묻습니다. 자리 표시자는 임의의 SQL 문 작성을위한 것이 아닙니다. 이들의 목적은 준비된 명령문에서 스칼라 값을 대체하는 것입니다. 동적 테이블 또는 열 이름을 안전하게 사용하려면 허용 가능한 값의 배열 목록에 대해 입력 테이블 및 열 이름을 확인해야합니다. –

답변

2

이 플랫 아웃 잘못 :

$query = "SELECT ? FROM ?"; 

자리는 VALUES을 나타낼 수

내 코드가있다. 필드/테이블/db 이름 (값이 아닌)에 대한 자리 표시자를 사용할 수 없습니다. 이는 idenfifiers입니다. 즉, 전체 질의

SELECT foo FROM bar WHERE foo = 'baz' 
    a b c d e f g h 

a- sql keyword 
b- field identifier 
c- sql keyword 
d- table identifier 
e- sql keyword 
f- field identifier 
g- operator 
h- value 

는 단지 h 부는 틀을 사용하기위한 후보이다.

+0

새로운 종류의 레이아웃, 나는 그것을 좋아한다. 더하기 numero uno. (예 : in_array ($ _ POST [ 'table'], array ('table1', 'table2')) {// ok to proceed ...} –

0

테이블 또는 열 이름에 PDO 자리 표시자를 사용할 수 없습니다. 값에 대해서만 사용됩니다.

$query = "SELECT * FROM yourTable WHERE someCol = ?"; 

$stmt->bindParam(1, $value);