2013-11-25 7 views
0

pdo mysql 쿼리 함수를 만들려고합니다. 이 함수는 배열 값만 가져 오지만 두 개 이상의 값이있는 경우 bindParam() 부분의 값을 전환하면 잘 작동합니다. 난 다음 매개 변수 함수를 호출하는 경우 날짜가 그 금액이 삽입되고 양은 날짜 삽입 될 수 있도록PHP/PDO : MySQL 삽입 함수

public function db_qf($table, $fieldvalues, $where) 
{//query function 
    $sql = "INSERT INTO " . $table . " ("; 
    $parameters = ""; 
    $counter = 0; 
    foreach ($fieldvalues as $key => $value) 
    { 
     $sql .= $key; 
     $parameters .= ":" . $key; 
     if (++$counter != count($fieldvalues)){$sql .= ", "; $parameters .= ", ";} 
    } 
    $sql .= ") VALUES (" . $parameters . ") " . $where; 
    $this->dbquery = $this->dbh->prepare($sql); 
    foreach ($fieldvalues as $key => $value) 
    { 
     $this->dbquery->bindParam(":" . $key, $value); 
    } 
    $this->dbquery->execute(); 
} 

그래서 값이 전환된다.

$this->db_qf("bills", array("date" => "2013-11-24", "amount" => 30), ""); 

왜 이런 일이 발생하는지 알 수 없습니다.

+0

'fieldValues'의 배열을 바인딩 대신에 execute 함수에 전달해보십시오. 또한 키의 일부로 콜론을 갖도록 키를 변경해야합니다. 내가 생각할 수있는 유일한 것은'bindParam'은 값 (두 번째 인자)을 참조로 취하고 바인딩 루프의 두 번째 루프 반복에서'$ value'가 바운드 된 값을 변경하는'amount'로 덮어 쓰게된다는 것입니다 ': date'로 변경하십시오. 이것은 두 값이 서로 바뀌지 않고 동일하다는 것을 의미합니다. –

+0

난 그냥 bindParam 대신 bindValue를 사용해 보았는데 효과가 있었다. – Ralph

답변

1

$ value 변수가 모든 루프 반복 값을 변경하기 때문에 bindparam 대신 bindvalue를 사용하여 참조하는 대신 $ value 변수의 값을 잠글 필요가있었습니다.

+0

예, 이것은 내가 제안한 것과 거의 동일합니다. 내 코드에서'-> execute ($ array)'메소드를 사용하기 때문에 내 생각은 그것에 편향되어있다. 나는 모든 것을 바인드하기 위해 두 번째 루프를 반복 할 필요가 없다는 것을 좋아한다. 배열을 빌드/패스하여 실행할 수 있고 처리한다. –

0

내가 테스트하고 그것을 작동 :

public function insert($table,$columns_and_values) { 
      /* 
      * Columns Process 
      */ 
      $forms = [ 
        "columns" => "", 
        "values" => "" 
      ]; 

      /* 
      * Array to execute() method 
      */ 
      $array_to_execute = []; 
      foreach($columns_and_values as $key => $val) 
      { 
       $forms["columns"] .= "$key,"; 
       $forms["values"] .= ":{$key},"; 


       $array_to_execute[":{$key}"] = $val; 
      } 
      $forms["columns"] = substr($forms["columns"],0,-1); 
      $forms["values"] = substr($forms["values"],0,-1); 
      //-----------------End of Columns Process 


      $query = sprintf("INSERT INTO $table(%s) VALUES(%s)",$forms['columns'],$forms['values']); 
      $stmt = $this->prepare($query); 
      $stmt->execute($array_to_execute); 
} 

메서드를 호출하여 :

<?php 
class Database extends PDO {} 

$db = new Database(); 

$cols = [ 
    'email'  => '[email protected]', 
    'password' => '1234567890' 
]; 
$db->insert("account",$cols); 

그것을 시도를!

+0

왜 부정적인가요? 코멘트를 드롭, 감사합니다! – daison12006013

+0

누가 나를 싫어했지만, 작은 제안. '$ columns_and_values'를 두 번 반복 할 필요가 없습니다. 첫 번째 루프 안에'$ array_to_execute' 배열을 만들 수 있습니다. 또한'$ this-> insert ("account", $ cols);는'$ db-> insert (...')가되어야합니다. –

+0

그 점에 대해 감사드립니다. – daison12006013