2011-05-30 147 views
0

我有一個函數做一個簡單的插入,但我試圖通過傳遞一個數組使得該方法更健壯。 這就是我數組傳遞到它:PHP準備好的語句與數組

 $form_data = array(
     "sort_order"=>$_POST['sort_order'], 
     "name"=>$_POST['page_name'], 
     "text"=>$_POST['page_text'], 
     "image"=>$_POST['page_image'], 
     "meta_desc"=>$_POST['meta_desc'], 
     "meta_kw"=>$_POST['meta_kw'], 
     "meta_author"=>$_POST['meta_author'], 
     "image_thumb"=>"NULL", 
    ); 

這裏是功能代碼:

public function insert_data($array){ 
     $keys = array(); 
     $values = array(); 

     foreach($array as $k => $v){ 
      $keys[] = $k; 
      if(!empty($v)){ 
       $values[] = $v; 
      } else { 
       $values[] = "NULL"; 
      } 
     } 

     $stmt = self::$mysqli->stmt_init(); 
     $query = "INSERT INTO `".DB_TABLE_PAGES."` (".implode(",",$keys).") VALUES (?,?,?,?,?,?,?,?)"; 


     $stmt->prepare($query); 
     $stmt->bind_param('ssssssss',implode(",",$values)); 

     //$stmt->execute(); 
    } 

,但我得到這個錯誤: 在類型定義字符串元素不匹配數數綁定變量。

我知道問題是什麼,但我不明白我如何實現它。

我用Google搜索和整個這個線程傳來:

link to thread

可以在任何一個可以幫助我蘇斯這一點?

千恩萬謝

+0

什麼是'$ query'的價值? – 2011-05-30 17:00:57

+0

你的意思是我傳入函數來構建查詢的數組? – Adamski 2011-05-30 17:03:43

+0

$ query在使用前定義了1行。 – Evert 2011-05-30 17:04:11

回答

3

試試這個:

public function insert_data($array){ 
    $placeholders = array_fill(0, count($array), '?'); 

    $keys = $values = array(); 
    foreach($array as $k => $v) { 
     $keys[] = $k; 
     $values[] = !empty($v) ? $v : null; 
    } 

    $stmt = self::$mysqli->stmt_init(); 
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. 
      '('.implode(',', $keys).') VALUES '. 
      '('.implode(',', $placeholders).')'; 
    $stmt->prepare($query); 

    call_user_func_array(
     array($stmt, 'bind_param'), 
     array_merge(
      array(str_repeat('s', count($values))), 
      $values 
     ) 
    ); 

    $stmt->execute(); 
} 

或者更好的是,使用PDO來代替:

public function insert_data($array){ 
    $placeholders = array_fill(0, count($array), '?'); 

    $keys = $values = array(); 
    foreach($array as $k => $v){ 
     $keys[] = $k; 
     $values[] = !empty($v) ? $v : null; 
    } 

    // assuming the PDO instance is $pdo 
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. 
      '('.implode(',', $keys).') VALUES '. 
      '('.implode(',', $placeholders).')'; 
    $stmt = $pdo->prepare($query); 

    $stmt->execute($values); 
} 

注:我用的null不變,因爲"NULL"字符串將被轉義爲一個字符串(而不是空值)。

+0

對伴侶,歡呼聲,PDO一路砰砰響:-) – Adamski 2011-05-30 18:11:21

+0

爲什麼你將空值賦給NULL?如果我的數據中有一個零,我想插入一個零,而不是null。 – 2013-06-29 07:38:20

0

相反bind_param的(這在我的腦海中始終是混淆了),只是做:

$stmt->execute($values); 

還可以獲得通過使用array_keys()和array_values擺脫你的循環()

+0

它給了我這個錯誤:mysqli_stmt :: execute()期望完全0參數,給出1。謝謝你對數組函數的提示:-) – Adamski 2011-05-30 17:07:39

+0

出於某種原因,我認爲你使用PDO,這是可能的。我非常驚訝MySQLi沒有一次性傳遞所有參數的功能,但我似乎無法在文檔中找到它。在這種情況下,您需要分別綁定所有參數。 – Evert 2011-05-30 17:19:19

0

雖然這是一個古老的問題,但它已經出現在我的幾個搜索中,以找到同樣問題的雄辯答案。經過多次搜索,以及@netcoder提供的解決方案的實現後,我發現了一些更簡潔的內容。

聲明,這是使用拆包(圖示)運算符PHP 5.6:

public function genericQueryWithParams($query, $params, $types) 
{ 
    $db = new mysqli('localhost','username','password','schema'); 

    if($sql = $db->prepare($query)) 
    { 
     $sql->bind_param($types, ...$params); 
     $sql->execute(); 
     return $sql->get_result(); 
    } 
}