所以我在几年前找到了这个问题/答案,它与我需要的相似,但我认为我没有正确理解它。如果表单中的可选字段导致$_POST字段计数和数据库字段计数不同,会发生什么情况?
function insertToDB($params, $db) { //Pass array and db
$fields = array();
$conn = new mysqli('localhost', 'root', 'root', 'db') or die('XXX');
$stmt = $conn->stmt_init();
$stmt->prepare("SELECT * FROM ".$db);
$stmt->execute();
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$fields[] = $field->name;
}
$fields = implode(", ", $fields);
$placeholders = implode(',', array_fill(0, count($params), '?'));
$types = '';
foreach($params as $value) {
$types.= substr(strtolower(gettype($value)), 0, 1);
}
$ins = "INSERT INTO MYDB (".$fields.") VALUES (".$placeholders.")";
$bind_names[] = $types;
for ($i = 0; $i < count($params); $i++) {
$bind_name = 'bind' . $i;
$$bind_name = $params[$i];
$bind_names[] = &$$bind_name;
}
if ($stmt->prepare($ins)) {
call_user_func_array(array($stmt,'bind_param'),$bind_names);
$insresult = $stmt->execute();
}
return $insresult;
$stmt->close();
}发布于 2015-11-17 09:47:33
如果一个字段是可选的,那么你应该检查是否设置了$_POST,你可以这样做:
if(isset($_POST["fieldsection"])) {
$var = $_POST["fieldsection"];
} else {
$var = "Default Value"
}这样,字段计数和mysql计数可以总是相同的,因为它会查看是否有选择,如果没有选择,它会为您设置一个。
发布于 2015-11-17 11:13:09
从一个简单的示例开始,假设您有以下表字段
$table_fields = array('foo', 'bar', 'baz');您输入的数据如下所示
$input_data = array('foo' => 1,
'bar' => 2);您所能做的就是为每个表字段设置一些默认输入数据(我很懒,所以默认都是NULL)
array_fill(0, count($table_fields), NULL)然后我们用array_combine将它们压缩在一起
array_combine($table_fields, array_fill(0, count($table_fields), NULL))这样,您的输入数据就可以随时使用array_merge覆盖默认值,如下所示
var_dump(
array_merge(
array_combine($table_fields, array_fill(0, count($table_fields), NULL)),
$input_data
)
);
# prints
# array(3) {
# ["foo"]=>
# int(1)
# ["bar"]=>
# int(2)
# ["baz"]=>
# NULL
#}但是,如果可能的话,您是否可以尝试将可选字段设置为真正可选的字段,以便在CREATE TABLE语句中确保为这些字段设置了默认值?在这种情况下,您还将保存一轮到数据库中以查询字段名($stmt->prepare("SELECT * FROM ".$db);,如果您确实需要的话,您可以使用LIMIT 1来加速它)。所以取而代之的是这行
$ins = "INSERT INTO MYDB (".$fields.") VALUES (".$placeholders.")";将会变成
$ins = "INSERT INTO MYDB (".implode(",", array_keys($params)).") VALUES (".$placeholders.")"; https://stackoverflow.com/questions/33747611
复制相似问题