2017-03-27 2 views
0

내 코드에서 요청을 보호하고 싶습니다.PDO exec (array())를 여러 피연산자와 함께 사용하십시오.

오늘 내 curent 함수는 다음과 같습니다.

public function UpdatePMS($table,$data,$where) { 
    $ret  = array(); 
    $set_data = ""; 
    foreach($data as $key => $value){ 
     $set_data .= $key."= '".$value."', "; 
    } 

    if (isset($where))  { 
     $where = "WHERE ".$where; 
    } 

    $sql  = "UPDATE ".$table." SET ".$set_data."".$where; 
    $sql  = str_replace(", WHERE", " WHERE", $sql); 
    $stm  = $this->db->prepare($sql); 
    $ret  = $stm->execute(); 
    return $ret; 
} 

이렇게하면 테이블, 데이터 및 조건을 모두 선택할 수 있습니다. 예를 들어 :

WHERE id = 1 and status < 10 

또는 단지

WHERE id = 10 

또는 때때로

WHERE id = 1 and status >= 5 

변경할 수있는 곳의 내용. 일종의 보편적 인 요청입니다. 삭제, 업데이트, 선택, 삽입과 동일합니다.

나는 이렇게하려고 시도했지만 작동하지 않습니다.

$db  = new PDO('mysql:host=localhost;dbname=asterisk','root',''); 
$table = "my_table"; 
$where = "WHERE id = 1"; 
$sql = 'SELECT * FROM :table :where'; 
$stm = $db->prepare($sql); 
$stm->execute(array(":table" => $table, ":where" => $where)); 
$ret = $stm->fetchall(PDO::FETCH_ASSOC); 

아이디어가 있으십니까?

+1

는 ** 테이블 및 열 이름은 PDO의 매개 변수로 대체 할 수 없습니다. ** –

+1

준비된 문은 당신의 쿼리가 안전하게 만드는 마법의 지팡이 아니다 prepare()를 호출하여 호출합니다. 따라야 할 규칙이 있습니다. 그리고 불행히도 열과 필드 이름에 대해 PDO는이를 안전하게 만드는 방법을 제공하지 않으므로 수동으로 화이트리스트를 만들어야합니다. –

+0

좋아, 그래서 내가 다른 요청 당 하나의 기능을 만들 필요가 있습니까? – Danard

답변

1

솔직히 말해서 이런 식으로 준비된 명령문을 사용할 수 없습니다. 따라야 할 규칙이 있습니다. 그래서 그냥 대신, 당신은 테이블과 필드 이름을 매개 변수화 할 수 없습니다 게다가이 코드

$sql = 'SELECT * FROM my_table WHERE id = ?'; 
$stm = $db->prepare($sql); 
$stm->execute(array($id)); 

를 작성해야이

$table = "my_table"; 
$where = "WHERE id = 1"; 
$sql = 'SELECT * FROM :table :where'; 
$stm = $db->prepare($sql); 
$stm->execute(array(":table" => $table, ":where" => $where)); 

같은 것을 작성하는 이해되지 않는다, 그래서는로 작성하는 것이 좋습니다.

그래서 다른 요청마다 하나의 기능을 만들어야합니다. 맞습니까?

솔직히 - 예. 그것은 두통의 많은에서 당신을 살릴 것입니다. 것입니다

public function UpdatePMS($data, $id) 
{ 
    $data[] = $id; 
    $sql = "UPDATE table SET f1 = ?, f2 = ? WHERE id = ?"; 
    $stm = $this->db->prepare($sql); 
    $ret = $stm->execute($data); 
    return $ret; 
} 

처럼 사용할 수
$obj->UpdatePMS([$f1, $f2], $id); 
+0

좋습니다. 지금은 분명합니다. ;) 고마워. – Danard

관련 문제