在 cakephp 中使用存储过程 3.x

Using stored procedures with cakephp 3.x

我正在尝试将 SQL 服务器存储过程与 cakephp 3.x 一起使用,但出现数据库错误。

这是我的控制器:

use Cake\Datasource\ConnectionManager;

if($this->request->is('post')){
    $data = $this->request->getData();
    $param1 = $data['playId'];
    $param2 = $data['cardboard'];

    if(is_numeric($param1) && is_numeric($param2)){        
        $param1 = $data['playId'];
        $param2 = $data['cardboard'];

        $conn = ConnectionManager::get('ssql');

        $requested = $conn->query(
            'call searchPrem(?, ?)', 
            [$param1, $param2]
        )->fetchAll('assoc');


        //$exec = debug($requested);
    }
       echo json_encode( $requested );
}

我收到这个 SQL 错误:

Error: SQLSTATE[42000]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near '@P1'.

如何执行存储过程并检索结果数据?

在 Cake 2.x 中,我使用了如下解决方案:

if ($connection = $this->getDataSource()->connection) {
        $statement = oci_parse($connection, "DECLARE x number; BEGIN :x := searchPrem(" . $var1 . ", " . $var2 . "); END;");

        oci_bind_by_name($statement, ':x', $result, 10);

        if (oci_execute($statement)) {
            // Success
        }
}

此示例适用于 Oracle 方言。您应该修改为 Cake 3.x 和您的数据库方言。

我找到了解决方案:

$conn = ConnectionManager::get('ssql');
$sql = $conn->execute("yourfunction @id = $playId, @type = $type")->fetchAll('assoc');