2013-03-18 3 views
1

그래서 값을 사용할 배열이 데이터베이스에 삽입되는 메소드에 전달됩니다. 내 문제는 매개 변수가 바인딩되는 방식입니다.PHP로 복수 값을 PHP로 삽입하기

public function insertValues($table, $cols, $values) 
{ 
    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE); 

    $colString = implode(', ', $cols); // x, x, x 
    $valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ? 

    $sql = "INSERT INTO $table ($colString) VALUES($valString)"; 
    if (!$stmt = $mysqli->prepare($sql)) 
     echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 

    // THIS IS THE PROBLEM AREA 
    foreach ($values as $v) 
     if (!$stmt->bind_param('s', $v)) 
      echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; 

    if (!$stmt->execute()) 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 

    $stmt->close(); 
    $mysqli->close(); 
} 

은 내가 생각 한 번에 모든 매개 변수를 결합하는 방법이 필요하고, 한 번에하지 한, 그러나 나는이 작업을 수행 할 수있는 유용한 방법을 알아낼 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

실제 문제는 무엇입니까? 문서를 읽는 것을 기본으로, 내가 직접 테스트 할 곳은 없지만 올바른 작업을 수행해야합니다. – siride

+1

한 번에 여러 var를 바인딩 할 수 있지만, 경우에 따라 var 수를 모르기 때문에 최선의 방법은 반복하는 것입니다. 당신의 솔루션이 잘 작동하고 있습니까? 그렇지 않다면,'foreach ($ index => $ v)'를 쓰고'$ stmt-> bind_param ('s', $ values ​​[$ index])'를 바인드하려고 했습니까? – MatRt

답변

3

PHP.net (http://php.net/manual/en/mysqli-stmt.bind-param.php)에서 찾고있는 문제에 대한 답을 찾았습니다. 내가 편의를 위해 여기에 붙여 넣기하고있어, 모든 신용은 사람이 이메일로가는로 이동 Nick9v ^에^핫메일 -remove- -dot- 닷컴

을 준비하는 동안 필드 값의 동적 수를 다룰 때 나는이 수업을 유용하다고 생각한다.

[편집자 주 : 변경 BindParam :() 참조 에 의해 $의 값을 수락함으로써 PHP의 최신 버전에 경고를 방지하기 위해 추가 할 수 있습니다.]

<?php 
class BindParam{ 
    private $values = array(), $types = ''; 

    public function add($type, &$value){ 
     $this->values[] = $value; 
     $this->types .= $type; 
    } 

    public function get(){ 
     return array_merge(array($this->types), $this->values); 
    } 
} 
?> 

사용법은 아주 간단합니다. 인스턴스를 만들고 add 메서드를 사용하여 채 웁니다. 실행할 준비가되면 get 메소드를 사용하십시오.

<?php 
$bindParam = new BindParam(); 
$qArray = array(); 

$use_part_1 = 1; 
$use_part_2 = 1; 
$use_part_3 = 1; 

$query = 'SELECT * FROM users WHERE '; 
if($use_part_1){ 
    $qArray[] = 'hair_color = ?'; 
    $bindParam->add('s', 'red'); 
} 
if($use_part_2){ 
    $qArray[] = 'age = ?'; 
    $bindParam->add('i', 25); 
} 
if($use_part_3){ 
    $qArray[] = 'balance = ?'; 
    $bindParam->add('d', 50.00); 
} 

$query .= implode(' OR ', $qArray); 

//call_user_func_array(array($stm, 'bind_param'), $bindParam->get()); 

echo $query . '<br/>'; 
var_dump($bindParam->get()); 
?> 

이 당신에게이 같은 보이는 결과를 가져옵니다

SELECT * WHERE hair_color = 사용자 FROM를? 나이 =? 또는 균형 =? array (4) {[0] => 문자열 (3) "sid" => 문자열 (3) "빨간색"[2] => int (25) [3] => float (50)

0

bind_param은 각 매개 변수에 대한 여러 호출 대신 함수에 대한 단일 호출에서 모든 쿼리 매개 변수를 가져야하므로 코드가 작동하지 않습니다. 또한 foreach 호출에서 항상 참조로 전달되는 변수가 필요합니다. 동일한 변수를 루프의 마지막 반복에서 갖는 값과 비교합니다. bind_param 의해 전달 될 변수를 예상하는

$params = array(); 
$types = ''; 

foreach ($values as $k => $v) 
{ 
    $types .= 's'; 
    $params[] = &$values[$k]; 
} 

$bind_params = array_merge(array($types), $params); 

if (!call_user_func_array(array($stmt, 'bind_param'), $bind_params)) 
    // ... 

참고

가장 쉬운 방법은, 예를 들어 타입 및 파라미터들에 어레이를 구성하고 call_user_func_array를 호출 bind_param에 전달하는 것 값으로 참조하지 않고, 그렇지 않으면 foreach 루프 대신 값을 사용하여 배열을 구성하는 두 줄이됩니다.