2014-02-26 15 views
-1

下面是一組與我的問題相關的函數insert_array函數。在問它之前,是的,我試圖將錯誤輸出,但是在清理完單個小錯誤後,我發現它對我沒有任何回報,爲了您的閱讀便利,我將它清理乾淨。不要嘲笑亂碼(<是業餘的),但我做錯了什麼?我試圖插入一個使用白名單作爲字段名稱的動態數組,然後使用call_user_func_array作爲輸入數據的一種方式。然而它什麼都不做,甚至沒有錯誤。如何使用準備好的語句使用不同的數組數據庫插入?

我假設我犯了一個小錯誤,導致一些檢查失敗。我該如何正確地將未指定的數組放入數據庫中?

function field_whitelist($funcdb, $field) { 
    $query = mysqli_query($funcdb,"SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='database1' AND `TABLE_NAME`='table1';"); 
    $whitelist = array(); 
    while ($row = mysqli_fetch_row($query)) { 
     $whitelist[] = $row[0]; 
    } 
    if (empty(array_diff($field, $whitelist) === false)) { 
     return false; 
    } 
     return true; 
} 

function get_array_types($array) { 
    $rstring = ''; 
    foreach ($array as &$value) { 
     if (is_int($value)) { 
      $value = 'i'; 
     } elseif (is_string($value)) { 
      $value = 's'; 
     } 
     $rstring = $rstring.$value; 
     unset($value); 
    } 
    return $rstring; 
} 

function insert_array($inputarray, $funcdb) { 
    array_walk($inputarray, 'array_sanitize', $funcdb); 
    $data_array = array(); 

    foreach ($inputarray as &$array_val) { 
     $data_array[] = '?'; 
    } 

    $fields = implode(', ', array_keys($inputarray)); 
    $data = implode(', ', $data_array); 
    $type = get_array_types($inputarray); 

    if (field_whitelist($funcdb, array_keys($inputarray)) === true) { 
     if ($stmt = mysqli_prepare($funcdb, "INSERT INTO table1 (".$fields.") VALUES (".$data.")")) { 
      call_user_func_array('mysqli_stmt_bind_param', array_merge (array($stmt, $type), $inputarray)); 
      mysqli_stmt_execute($stmt); 
      mysqli_stmt_close($stmt); 
     } 
    } 
} 
+0

嘗試在你使用call_user_func_array的合併數組上做一個var_dump來查看實際的結果數組是什麼。那裏可能有問題。 – Tularis

回答

1

標題問題的答案是「有困難」。我懷疑問題在於bind_param only accepting parameters passed by reference(在該頁面的其中一個註釋中提到)。在該頁面上有一些真正有用的評論,爲這個問題提出瞭解決方案。我會建議檢查出來。

其中一個建議是嘗試這樣的:

$params = array_merge(array($stmt, $type), $inputarray); 
$refs = array(); 
foreach($params as $key => $value) { 
    $refs[$key] = &$params[$key]; 
} 
call_user_func_array('mysqli_stmt_bind_param', $refs); 

我用類似這樣的東西在過去,它爲我工作。

+0

雖然你的回答確實對我有幫助,但實際上是一個錯位的支架導致我的問題。 – Darkaaja

相關問題