php准备了一个带数组的语句

时间:2011-05-30 16:59:50

标签: php mysql

我有一个函数来做一个简单的插入,但我试图通过传递一个数组使该方法更健壮。 这是我传入它的数组:

        $form_data = array(
        "sort_order"=>$_POST['sort_order'],
        "name"=>$_POST['page_name'],
        "text"=>$_POST['page_text'],
        "image"=>$_POST['page_image'],
        "meta_desc"=>$_POST['meta_desc'],
        "meta_kw"=>$_POST['meta_kw'],
        "meta_author"=>$_POST['meta_author'],
        "image_thumb"=>"NULL",
    );

这是功能代码:

public function insert_data($array){
        $keys = array();
        $values = array();

        foreach($array as $k => $v){
            $keys[] = $k;
            if(!empty($v)){
                $values[] = $v;
            } else {
                $values[] = "NULL";
            }
        }

        $stmt = self::$mysqli->stmt_init();
        $query = "INSERT INTO `".DB_TABLE_PAGES."` (".implode(",",$keys).") VALUES (?,?,?,?,?,?,?,?)";


        $stmt->prepare($query);
        $stmt->bind_param('ssssssss',implode(",",$values));

        //$stmt->execute();
    }

但我收到此错误: 类型定义字符串中的元素数与绑定变量数不匹配。

我知道问题是什么,但我不明白我是如何实现它的。

我用Google搜索并遇到了这个帖子:

link to thread

任何人都可以帮我解决这个问题吗?

非常感谢

3 个答案:

答案 0 :(得分:4)

试试这个:

public function insert_data($array){
    $placeholders = array_fill(0, count($array), '?');

    $keys = $values = array();
    foreach($array as $k => $v) {
        $keys[] = $k;
        $values[] = !empty($v) ? $v : null;
    }

    $stmt = self::$mysqli->stmt_init();
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
             '('.implode(',', $keys).') VALUES '.
             '('.implode(',', $placeholders).')';
    $stmt->prepare($query);

    call_user_func_array(
        array($stmt, 'bind_param'), 
        array_merge(
            array(str_repeat('s', count($values))),
            $values
        )
    );

    $stmt->execute();
}

或者更好的是,使用PDO代替:

public function insert_data($array){
    $placeholders = array_fill(0, count($array), '?');

    $keys = $values = array();
    foreach($array as $k => $v){
        $keys[] = $k;
        $values[] = !empty($v) ? $v : null;
    }

    // assuming the PDO instance is $pdo
    $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '.
             '('.implode(',', $keys).') VALUES '.
             '('.implode(',', $placeholders).')';
    $stmt = $pdo->prepare($query);

    $stmt->execute($values);
}

注意:我使用了null常量,因为"NULL"字符串将作为字符串进行转义(而不是空值)。

答案 1 :(得分:1)

虽然这是一个古老的问题,但它已经出现在我的几个搜索中,以找到针对同一问题的雄辩答案。经过大量的搜索,以及@netcoder提供的解决方案的实现,我发现了一些更简洁的东西。

免责声明,这是针对使用解包(splat)运算符的php 5.6:

public function genericQueryWithParams($query, $params, $types)
{
    $db = new mysqli('localhost','username','password','schema');

    if($sql = $db->prepare($query))
    {
        $sql->bind_param($types, ...$params);
        $sql->execute();
        return $sql->get_result();
    }
}

答案 2 :(得分:0)

而不是bind_param(在我看来总是令人困惑),只需:

$stmt->execute($values);

您还可以使用array_keys()和array_values()

来摆脱循环