【问题标题】:How does one use varied array database insert using prepared statements?如何使用准备好的语句使用不同的数组数据库插入?
【发布时间】:2014-02-26 11:08:23
【问题描述】:

下面是一组与我的问题相关的函数,insert_array 函数。在被问到之前,是的,我试图将其全部错误输出,但是在清除了单个小错误后,我发现它对我没有任何回报,为了您的阅读方便,我将其清除了。不要嘲笑凌乱的代码(

我假设我犯了一个小错误,导致某些检查失败。我如何正确地将未指定的数组放入数据库中?

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);
        }
    }
}

【问题讨论】:

  • 尝试对使用 call_user_func_array 的合并数组执行 var_dump 以查看实际生成的数组是什么。那里的某个地方可能有问题。

标签: php arrays mysqli prepared-statement


【解决方案1】:

标题中问题的答案是“有困难”。我怀疑这里的问题与bind_param only accepting parameters passed by reference (在该页面上的一个注释中提到)有关。该页面上有一些非常有用的 cmets,建议解决此问题。我建议您检查一下。

其中一个建议是尝试这样的事情:

$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);

我过去使用过类似的东西,它对我有用。

【讨论】:

  • 虽然您的回答确实对我有所帮助,但实际上是一个放错位置的括号导致了我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2017-11-29
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多