Php 如何使用准备好的语句使用不同的数组数据库插入?
下面是一组与我的问题相关的函数,Php 如何使用准备好的语句使用不同的数组数据库插入?,php,arrays,mysqli,prepared-statement,Php,Arrays,Mysqli,Prepared Statement,下面是一组与我的问题相关的函数,insert\u array函数。在它被问到之前,是的,我试图将其全部错误输出,但是在清除单个小错误后,我发现它没有为我返回任何内容,并且为了便于阅读,我将其清除。不要嘲笑凌乱的代码(
insert\u array
函数。在它被问到之前,是的,我试图将其全部错误输出,但是在清除单个小错误后,我发现它没有为我返回任何内容,并且为了便于阅读,我将其清除。不要嘲笑凌乱的代码(<是业余的),但我做错了什么?我试图使用字段名的白名单插入动态数组,然后使用call_user_func_数组作为输入数据的方式。然而,它什么也不做,甚至不会出错
我想我犯了一个小错误,导致一些检查失败。如何正确地将未指定的数组放入数据库
function field_whitelist($funcdb, $field) {
$query = mysqli_query($funcdb,"SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='database1' AND `TABLE_NAME`='table1';");
$whitelist = array();
while ($row = mysqli_fetch_row($query)) {
$whitelist[] = $row[0];
}
if (empty(array_diff($field, $whitelist) === false)) {
return false;
}
return true;
}
function get_array_types($array) {
$rstring = '';
foreach ($array as &$value) {
if (is_int($value)) {
$value = 'i';
} elseif (is_string($value)) {
$value = 's';
}
$rstring = $rstring.$value;
unset($value);
}
return $rstring;
}
function insert_array($inputarray, $funcdb) {
array_walk($inputarray, 'array_sanitize', $funcdb);
$data_array = array();
foreach ($inputarray as &$array_val) {
$data_array[] = '?';
}
$fields = implode(', ', array_keys($inputarray));
$data = implode(', ', $data_array);
$type = get_array_types($inputarray);
if (field_whitelist($funcdb, array_keys($inputarray)) === true) {
if ($stmt = mysqli_prepare($funcdb, "INSERT INTO table1 (".$fields.") VALUES (".$data.")")) {
call_user_func_array('mysqli_stmt_bind_param', array_merge (array($stmt, $type), $inputarray));
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
}
}
你标题中问题的答案是“困难重重”。我怀疑这里的问题与(在该页的一个注释中提到的)有关。该页面上有一些非常有用的评论,建议解决这个问题。我建议你去看看 其中一个建议是尝试以下方法:
$params = array_merge(array($stmt, $type), $inputarray);
$refs = array();
foreach($params as $key => $value) {
$refs[$key] = &$params[$key];
}
call_user_func_array('mysqli_stmt_bind_param', $refs);
我过去使用过类似的方法,它对我很有效。尝试在合并数组上执行var\u转储,您可以使用call\u user\u func\u array on来查看实际生成的数组是什么。这里面可能有个问题。虽然你的答案确实帮助了我,但实际上是一个放错位置的括号造成了我的问题。