2016-08-14 2 views
0

MySQLi의 준비된 문 말하자면 나는 현재 (MySQLi에서의 이동) PDO를 배우고는, '짜증나'라고 할 수 있습니다. 그러나 이전에는이 ​​수준의 PDO를 완전히 실험 해본 적이 없습니다. 여러 함수를 포함하는 PDO 데이터베이스 클래스를 만들려고 시도 중입니다. 함수에서 제공된 정보를 사용하여 쿼리를 작성합니다.배열의

이 테이블에서 행을 삭제하는 데 사용됩니다 내 삭제() 함수입니다 : 당신이, 내가 매개 변수에서 배열의를 내파하고있는 MySQL의 문 내부에 다음에서 볼 수 있듯이

public function delete($table, $where = array(), $limit = '') { 
    $holders = array(); 
    $params = array(); 
    foreach($where as $field) { 
     $holders[] = '?'; 
    } 

    foreach($where as $field => $value) { 
     $value = $value; 
     $clause[] = "$field = " . implode('', array_values($holders )) . ""; 
     $params[] = $value; 
    } 

    $table = $this->prepend_table($table); 

    $sql = "DELETE FROM {$table} WHERE " . implode('AND ', $clause); 
    if(!empty($limit)) { 
     $sql .= " LIMIT {$limit}"; 
    } 

    try { 
     $stmt = $this->connection->prepare($sql); 
     $stmt->execute($params); 
     return true; 
    } catch(PDOException $e) { 
     die('Query Error: ' . $e->getMessage()); 
     exit; 
    } 
} 

작성된 쿼리를 준비하고 실행합니다. 내가 위에서 가지고있는 것처럼 매우 위험하고 내가 PDO에 대한 '탈출'을 사용하는 것을, -

지금 내 앞의 질문에, 누군가가 준비 진술과 내파()를 사용하는 방법에 대해 언급했다. 이제, MySQLi가 real_escape_string을 가지고 있다는 것을 알고 있었지만, 삭제 (및 다른 기능들)로 작업하고 가능한 한 보안을 유지하기 위해 어떻게해야할까요?

PDO를 처음 접했을 때 수표가 누락 된 경우 (또는 보안을 유지하기 위해 할 수있는 다른 방법이없는 경우) 알려 주시기 바랍니다. 일단 완료되면 코드 검토를 요청할 것입니다. 기지가 안전하다는 것을 확인하기 위해 수업을 들으십시오.

+0

당신은 $의 limit' 숫자 값이 '것을 유효성을 검사 할 수 있습니다 '$ table'은 정당한 테이블 이름입니다 ('prepend_table' 함수가 그렇게 할 수 있습니다). 하지만 이스케이프 측면에서 쿼리 매개 변수를 사용하는 경우 해당 필드를 벗어날 필요가 없습니다. 그것은 일종의 쿼리 매개 변수 사용의 요점입니다. 어쨌든 요점의 상당 부분. – Spudley

+0

당신 스스로 뭔가를하려고하는 것이 좋습니다. 이것은 내가 몇 년 전에 나에게 그것을 시도했을 때 생각 나게한다. (그것은 작동하지만 여전히 구문은 복잡하다. (참고 pastebin) (http://pastebin.com/rvqWLpjs)). 나는 완전히 새로운 클래스를 작성하여 Laravel의 querybuilder 클래스와 같은 쿼리를 작성했다. [Doctrine] (http://www.doctrine-project.org/)을 살펴 보거나 다른 오픈 소스 PDO 랩퍼를 자신의 프로젝트에 대한 참조로 사용하라고 제안합니다. 내가 제대로 이해한다면 –

답변

1

당신은 PHP의 설명서에서이 인용에 따라 필요하지 않습니다주의의 단어는 준비된 문을 사용하고 있기 때문이다.

당신은 SQL 문을 구축하기 위해이 기능을 사용하는 경우, 당신은 강하게에 사용자 입력을 보간 바인딩 매개 변수 대신 PDO :: 따옴표()를 사용하여 SQL 문을 준비 :: PDO를 사용) (준비하는 것이 좋습니다 SQL 문. 바인딩 매개 변수 준비된 문뿐만 아니라 휴대 성, 더 편리한 SQL 주입에 면역성이 있지만, 서버와 클라이언트 측 모두 쿼리의 컴파일 된 양식을 캐시 할 수 종종 훨씬 더 빨리, 보간 된 쿼리보다 실행된다.

그래서 당신은 전체 탈출 과정을 피할 수 있습니다.

그러나 PDO의 quote 기능이 찾고있는 것을 참고로,

<?php 
$conn = new PDO('sqlite:/home/lynn/music.sql3'); 

/* Simple string */ 
$string = 'Nice'; 

echo 'Unquoted string: ' . $string . '\n'; 
echo 'Quoted string: ' . $conn->quote($string) . '\n'; 
?> 

출력에 대한

Unquoted string: Nice 
Quoted string: 'Nice' 
+0

좋아, 내가 PDO의 견적을 usde하고 배열에 넣어 꿔 그래서? – Sutton

+0

그리고 '그들'나는 의미합니까? 매개 변수 – Sutton

+0

아니요. 첫 번째 부분과 견적을 다시 읽으십시오! 당신은 그것을 사용할 필요가 없습니다. – Script47