Phalcon:异常:参数数量错误


Phalcon : Exception: Wrong number of parameters

我想执行一个准备好的插入:

<?php
function add_record($tab) {
        $champs= "";
        $value = "";
        $separateur ="";
        $ins = array();
        foreach ($tab as $k => $v){
            $champs .= $separateur . $k;
            $value .= $separateur . "?" ;
            $ins[] = $v;
            $separateur = ",";
        }
        $champs = '('.$champs.')';
        $value = '('.$value.')';
        $sSQL = "INSERT INTO facture $champs VALUES $value";
        executePreparedDML($sSQL, $ins);
    }
    function executePreparedDML($sSQL, $tab) {
    $config = array(
        "host" => SERVEUR,
        "dbname" => BDD,
        "port" => BDD_PORT,
        "username" => LOGIN_DB,
        "password" => PWS_DB);
    $connection = new 'Phalcon'Db'Adapter'Pdo'Mysql($config);
    $statement = $connection->prepare($sSQL);
    $pdoResult = $connection->executePrepared($statement, $tab);
}
?>

在执行add_record函数时,我得到了以下错误:异常:参数数量错误!那么怎么了?

根据手册:

公共PDOStatement executePrepared(PDOStatement$语句,array$占位符,array$dataTypes)

执行准备好的语句绑定。此函数使用从零开始的整数索引

在手册的其他部分中,我们可以看到Phalcon允许绑定名称,例如= :email或索引为?0, ?1的绑定。

由于您的函数是为[0 => 'first', 1 => 'second']的数组提供服务,所以我将测试创建类似(?0, ?1, ?2, ?3, ?4)的链,而不是(?,?,?,?,?)

你们也可以试着不按照问题示例中的方式进行准备,直接从自己的答案中获取版本。

此外,当使用模型时,它很容易:

$obj = new credentialModel();
$isOk = $obj->save(array(
    'name' => 'John',
    'surname' => 'Doe'
));

一旦你使用了Phalcon,我建议你实际使用它。

我手动编写了sql,但不是动态编写的:

$tab["fact_date"] = convertDateFormat5($tab["fact_date"]);
        $config = array(
        "host" => SERVEUR,
        "dbname" => BDD,
        "port" => BDD_PORT,
        "username" => LOGIN_DB,
        "password" => PWS_DB);
        $connection = new 'Phalcon'Db'Adapter'Pdo'Mysql($config);
        $sSQL = "insert into facture(user_code,clt_id,fact_ref,fact_lib,fact_date,fact_comm) values(?,?,?,?,?,?)";
        $statement = $connection->execute($sSQL, array($tab['user_code'], $tab['clt_id'], $tab['fact_ref'], $tab["fact_lib"], $tab['fact_date'], $tab["fact_comm"]));
        $id = $connection->lastInsertId();
        $connection->close();
        return $id;

使用这种方法,它是有效的,所以我不明白为什么它在动态编写时不起作用!

只需转到app/config/router.php并将这行代码$router->handle()替换为$router->handle($_SERVER['REQUEST_URI'])

这是一种有点圆滑的做事方式,但考虑到代码中的所有其他内容都是好的,即$tab值等。错误是…

$sSQL = "INSERT INTO facture $champs VALUES $value";应该是$sSQL = "INSERT INTO facture " .$champs. " VALUES ". $value;