2016-11-26 86 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.'); 
}