2016-11-26 79 views
2

我嘗試使用預準備語句將多個值插入到mysql數據庫中時出現錯誤。使用php編寫語句插入多個值時出錯

我不斷收到此錯誤

Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables. 

我認爲它看到$數據作爲單個值,我不知道現在該做什麼

$keys = (?, ?, ?); 
    $types = "iii"; 
    $data = "1, 3, 500"; 
    if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?),$keys")) { 
    $ortype = 1;  
    $stmt2->bind_param("iii".$types, $userid, $ortype, $amount, $data); 
    $stmt2->execute(); 
    $stmt2->close(); 

    } 

回答

-1

我認爲它看到$數據作爲單個值當然

是的。爲什麼它會這樣做,否則如果以任何方式它單個值?

我不知道該怎麼辦,現在

嗯,你能做的最好的事情是問一個問題。不是你在這裏問的問題,而是一個真正的問題,解釋你想要做什麼以及爲什麼。由於沒有這樣的問題,我們只能猜想,你需要做一個多重插入,但一些奇特的方法。

爲此,創建一個包含所有數據的單個數組。

$data = []; 
$data[] = $userid; 
$data[] = $ortype; 
$data[] = $amount; 
$data[] = 1; 
$data[] = 3; 
$data[] = 500; 
$count = count($data); 

然後創建佔位符字符串

$values = implode(',', array_fill(0, $count, '(?, ?, ?)')); 

然後創建類型

$types = str_repeat("iii", $count); 

最後一個字符串創建查詢和執行它

$stmt = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES $values"); 
$stmt->bind_param($types, ...$data); 
$stmt->execute(); 
+0

由於它的工作..不得不調整它有點你 – joshua

+0

是這個調整有關的代碼,或只是自己的數據源?如果前者請分享,所以我可以修復答案,因爲這顯然是現場草圖,未經測試 –

+0

不,它關於我的數據源 – joshua

-1

你試圖用綁定變量,但您可以手動分配它們。除此之外,您的參數數量不匹配。

你有3個佔位符,3個類型定義,還有4個值。這些是一對一的關係,因此類型定義(您的iii)的數量需要與佔位符的數量?和您綁定的值的數量(按佔位符的順序)匹配。

// $keys = (?, ?, ?); // Removed this, syntax error and you bind it manually anyway later 
// $types = "iii"; // You bind it manually later 
$data = "1, 3, 500"; 

// Removed ',$keys' from your query, you manually put the placeholders 
if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)")) { 
    $ortype = 1; 

    // removed '.$types' - you bind it manually 
    // Also removed $data - you have 3 values, 3 columns, not 4 
    $stmt2->bind_param("iii", $userid, $ortype, $amount); 
    $stmt2->execute(); 
    $stmt2->close(); 
} 

是的,你的$data是一個值,而不是參數列表。

該文檔也有很好的例子。

參考

0

試試這個邏輯,看看是否工程或不:)

$data = array(array(1,3,5), array(2,4,6)); 
$sql = 'INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)'; 

if($stmt = $conn->prepare($sql)){ 

$stmt->bind_param("iii", $usr, $type, $amt); 

foreach ($data as $v) { 

$usr = $v[0]; 
$type = $v[1]; 
$amt = $v[2]; 

$stmt->execute(); 

if($stmt->insert_id <= 0){ 
trigger_error('Insert fail. Error: ' . $stmt->error); 
break; 
} 
} 
$stmt->close(); 
$conn->close(); 
} 
else{ 
trigger_error('Prepare fail.'); 
}