我试图通过几个数组循环来将数据插入到mysql数据库中。我试图绑定数据,以便我可以循环访问它。可以有不同数量的列绑定数据。循环遍历一个变量数组并使用bind_param插入
看来数据Im绑定未按预期进行处理,插入最终失败。
我有一个存储列名和数据类型的列数组。我也有一个值数组存储要插入的值。样本数据:
$colArr = array (
array('i', 'ID'),
array('s', 'Date')
);
$valArr = array(
array(1, 'now()'),
array(2, 'now()'),
);
//I create my type and query strings as well as the array referencing the columns for binding.
$valStrForQry = rtrim(str_repeat('?, ', count($v['colArr'])), ', '); //result: '?, ?'
$params = array();
$colsForQry = '';
$typeStr = '';
$cntr = 0;
foreach ($colArr as $cols) {
$colsForQry .= $cols[1] . ', ';
$typeStr .= $cols[0];
$params[] = &$valArr[$cntr][1];
$cntr++;
}
$colsForQry = rtrim($colsForQry, ', '); //result: 'ID, Date'
$qry = 'INSERT INTO table (' . $colsForQry . ') VALUES (' . $valStrForQry . ')';
$stmt = $mysqli->prepare($qry);
//Bind the parameters.
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($typeStr), $params));
//Loop through the values array, assign them using eval, and execute the statement. Im open to suggestions if theres a better way to do this.
foreach ($valArr as $vals) {
$cntr = 0;
foreach ($colArr as $c) {
eval('$' . $c[1] . ' = ' . $vals[$cntr] . ';');
$cntr++;
}
if ($stmt->execute() === FALSE) {
//show $stmt->error for this iteration
} else {
//show success for this iteration
}
}
第一个迭代的结果是不正确的数据的成功插入。也就是说,插入的ID是0,而不是1,并且没有其他信息被插入。第二次迭代(和所有连续的)导致以下错误消息:重复条目'0'键'PRIMARY'
我在做什么错在这里,它是评估还是别的?我不知道如何找出这一个。
只要添加,如果它不是很明显,数据库表设置与ID作为主键。 – envisteven
无法一目了然,但是把你正在构建的字符串放在一个var中,并在eval之前将其转储,也许在那里有什么不对的地方是不明显的。 – alzee
eval语句的字符串看起来正确:$ ID = 1;和$ Date = now(); – envisteven