2012-09-04 55 views
2

如何在循環中傳遞變量以執行?從這裏一個答案 例子...從數組構建準備語句並傳遞變量執行

$placeholders = array_fill(0, count($array), '?'); 

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

$stmt = $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(); 

而是多個陣列什麼。我想添加到db 10000值,但不建立和綁定聲明每一個通過。 這可能嗎? 所以我想從數組構建語句,綁定參數(我不知道如何)。比環通變量(由鍵identificated),並執行...

普遍的東西,如果我不慣於寫的語句爲每個表(只是使列名和變量數組)

+0

PDO讓生活* soooo *在這方面更容易。它在您的服務器上可用嗎? – DaveRandom

+0

希望是的...你能幫助我....我知道它是相似的,但我沒有經驗與它.... –

+1

以及與PDO,你可以只傳遞'$ array'到'execute()'作爲一個參數,不需要用'bind_param()'搞亂 – DaveRandom

回答

0

當使用預處理語句和mysqli所有你需要做的是改變存儲在綁定參數中的值並且再次運行執行。這是綁定參數的點,允許語句執行多次,而不重新將查詢發送

的開銷舉個例子(也有很大的安全加上自然但那是題外話。):

$param1 = ''; 
$param2 = ''; 
$param3 = ''; 
$param4 = ''; 
$query = 'INSERT INTO table VALUES (?, ?, ?, ?)'; 
$format = 'ssss'; 
$params = array(&$param1, &$param2, &$param3, &$param4); 
$stmt = $mysqli->stmt_init(); 
$stmt->prepare($query); 
$params = array_merge(array($format), $params); #set up format and parameters for binding 
call_user_func_array(array($stmt, 'bind_param'), $params); #parameters specified so bind them 


foreach($data as $data_point){ 
    $param1 = $data_point[0]; 
    $param2 = $data_point[1]; 
    $param3 = $data_point[2]; 
    $param4 = $data_point[3]; 
    $stmt->execute(); 
} 

這將準備好您的語句,然後循環存儲在$ data中的數據,獲取每個值,將其放入準備好的參數中,然後使用新參數執行語句。

對於此特定代碼,里程會有所不同,因爲它不會對sql錯誤語句執行任何檢查,並且對於許多應用程序在一個插入中執行多行可能效率更高。