2013-07-02 2 views
0

그래서 기본적인 cms 응용 프로그램을 만들어 PDO를 좀 더 깊이 배우려고합니다.하지만 문제가 발생했을 것 같습니다. PHP PDO 데이터베이스 함수에 삽입

public function insert($table, $rows, $values) { 

     $data = $values; 

     $STH = $this->DBH->("INSERT INTO `" . $table . "` (". $rows . ") values (?, ?, ?)"); 

    } 

값에 대한 물음표를 수행

는 데이터의 수를 나타냅니다 ... 내가 MySQL 데이터베이스에 데이터를 삽입하는 기능을 사용할 수 있도록하려면, 지금까지 나는이 코드를 가지고 나는 데이터베이스에 들어갈 것인가? 그렇다면 $ 데이터 배열을 기반으로 입력 될 데이터 조각의 양을 어떻게 알 수 있습니까? (모든 $ 값은 'value, value2, value3'등의 형식으로 입력됩니다.)

바라기를 빌면 내가 묻고있는 것에 대해 분명히했습니다. 감사.

+0

예. 삽입 할 항목을 알아야합니다. 마술 적이 아닙니다. –

+0

@DanyCaissy의 말. 또한, 코드 샘플에서'$ rows'라고 부르는 것들은 행이 아니라 열이나 필드입니다. 아마도 이것은 혼란의 기원일까요? – fvu

+0

$ 행에 무엇이 있는지 보는 것이 도움이되지만,'foo, bar, baz'와 같은 것으로 나오지 않으면 유효하지 않은 SQL을 생성하고있는 것입니다. 필드 개수가 값 개수와 일치해야합니다 (예 : $ 행이 4 개 필드 인 경우 값의 자리 표시자를 3 개 지정하는 것은 구문 오류입니다). –

답변

0

값이 배열 인 경우 임의의 값을 사용하여 준비된 명령문을 수행 할 수 있습니다. 예 (안된) : (연관 배열로 $table$data) 두 개의 매개 변수를 전달

public function insert($table, $rows, $values) { 
    $params = rtrim(", ", str_repeat("?, ", count($values))); 
    try { 
    $stmt = $this->DBH->prepare("INSERT INTO $table ($rows) VALUES ($params)"); 
    for($i = 1; $i <= count($values); $i++) { 
     $stmt->bindValue($i, $values[$i-1]); 
    } 
    $stmt->execute(); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
    echo "Oops... {$e->getMessage()}"; 
    } 
} 

편집, 당신은 (테스트되지 않은) 같은 것을 할 수있는 :있는 한

public function insert($table, $data) { 
    $keys = array_keys($data); 
    $values = array_values($data); 
    $params = rtrim(", ", str_repeat("?, ", count($values))); 
    try { 
    $stmt = $this->DBH->prepare("INSERT INTO $table (`".implode("`,`", $keys)."`) VALUES ($params)"); 
    $stmt->execute($values); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
    echo "Oops... {$e->getMessage()}"; 
    } 
} 
0

당신의 $ 데이터 변수는 배열입니다. 준비가 끝나면 PDO :: Statement의 execute 메소드로 전달할 수 있습니다. 물음표가 바인딩을 사용하는 경우 그것은 단지 당신이 원하는 순서대로 값의 비 연관 배열을 필요로 그들을 결합

public function insert($table, $rows, $values) { 
    $data = $values; 
    $STH = $this->DBH->prepare("INSERT INTO `" . $table . "` (". $rows . ") values (?, ?, ?)"); 
    $STH->execute($data); 
} 

당신은 또한에 대한 이름을 사용할 수 있습니다 (귀하의 질문에 표시가 쿼리에 나타나는 순서대로) 바인딩 :

public function insert($table, $rows, $values) { 
    $data = array(":col1" => $values[0], ":col2" => $values[1], ":col3" => $values[2]); 
    $STH = $this->DBH->prepare("INSERT INTO `" . $table . "` (". $rows . ") values (:col1, :col2, :col3)"); 
    $STH->execute($data); 
}