用数组编写php语句

用数组编写php语句,php,mysql,Php,Mysql,我有一个函数来做一个简单的插入,但是我试图通过传递一个数组来使这个方法更加健壮。 这是我传入的数组: $form_data = array( "sort_order"=>$_POST['sort_order'], "name"=>$_POST['page_name'], "text"=>$_POST['page_text'], "image"=>$_POST['page_image'],

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

        $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();
    }
但我得到了这个错误: 类型定义字符串中的元素数与绑定变量数不匹配

我知道问题是什么,但我不明白我怎样才能做到

我在谷歌上搜索并发现了以下线索:

谁能帮我解决这个问题吗


非常感谢

不要使用bind_param,因为在我的脑海中,bind_param总是让人困惑,只需执行以下操作:

$stmt->execute($values);

您还可以使用array_键和array_值来摆脱循环,而不是使用bind_参数,在我看来,bind_参数总是让人困惑,只需执行以下操作:

$stmt->execute($values);
您还可以使用array_键和array_值来摆脱循环,请尝试以下方法:

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字符串将作为字符串而不是null值进行转义。

尝试以下操作:

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字符串将作为字符串而不是null值进行转义。

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

免责声明,这是针对PHP5.6使用解包splat运算符:

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

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

免责声明,这是针对PHP5.6使用解包splat运算符:

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

$query的值是多少?您是指我传入函数以生成查询的数组吗?$query在使用前定义了一行。否。我是说$query!如中所示,如果回显$query,会得到什么?它是有效的SQL吗?在我看来是的:在页面中插入排序顺序、名称、文本、图像、元描述、元kw、元作者、图像值?、?、?、?、?、?、?、?、?、?、?、?、?是什么值?$query?你是说我传递到函数中构建查询的数组吗?$query在使用前定义了一行。否。我是说$query!如中所示,如果回显$query,会得到什么?它是有效的SQL吗?在我看来是的:在页面中插入排序顺序、名称、文本、图像、元描述、元描述、元描述、元作者、图像值?、?、?、?、?、?、?、?、?,?,?当我这样做时,它会给我以下错误:mysqli\u stmt::execute需要的参数正好是0,给定1。感谢您提供有关数组函数的提示:-出于某种原因,我认为您使用的是PDO,这是可能的。我完全惊讶于MySQLi没有一次传递所有参数的功能,但是我似乎也在文档中找不到它。在这种情况下,您将需要单独绑定所有参数。当我这样做时,它会给我以下错误:mysqli_stmt::execute正好需要0个参数,1个给定的参数。感谢您提供有关数组函数的提示:-出于某种原因,我认为您使用的是PDO,这是可能的。我完全惊讶于MySQLi没有一次传递所有参数的功能,但是我似乎也在文档中找不到它。在这种情况下,您需要分别绑定所有参数。为什么要将空值强制转换为NULL?如果我的数据中有一个零,我想插入一个零,而不是null。为什么要将空值强制转换为null?如果我的数据中有一个零,我想插入一个零,而不是null。对于在查询中使用准备好的查询而不是未初始化的值,请输入+1;对于在查询中使用准备好的查询而不是未初始化的值,请输入+1