1

我想使用以下代码从我的 mssql 数据库中检索一些数据:

public function areaGetCities($json){
        $request = json_decode($json);
        $response = '';
        $response->list = array();

        if (!empty($request->language_id) &&
            !empty($request->country_id) &&
            !empty($request->postal_code)){
            $this->db_stmt = new PDOStatement();
            $this->db_stmt = $this->db->prepare('EXECUTE areaGetCities :language_id, :country_id, :postal_code');
            $this->db_stmt->bindParam(':language_id', $request->language_id, PDO::PARAM_INT);
            $this->db_stmt->bindParam(':country_id', $request->country_id, PDO::PARAM_INT);
            $this->db_stmt->bindParam(':postal_code', $request->postal_code, PDO::PARAM_STR, 40);
            $this->db_stmt->execute();
            while ($obj = $this->db_stmt->fetchObject()){
                $response->list[] = $obj;
                unset($obj);
            }             
        }        
        return json_encode($response);         
    }

如果我打印 errorInfo() 我得到

尝试绑定参数号 0。SQL Server 最多支持 2100 个参数。IMSSP -29

我的问题是我没有从我的数据库中得到任何结果,我必须得到(我用相同的参数运行了这个过程,我得到了 2 个结果)。

想法?

编辑:我编辑了我的代码。现在我得到:

[Microsoft][SQL Server Native Client 11.0][SQL Server]形参“@postal_code”>没有声明为OUTPUT参数,而是传入请求的实际参数>输出。

CREATE PROCEDURE areaGetCities(@language_id TINYINT, @country_id INT, @postal_code VARCHAR(40))
4

3 回答 3

3

尝试在查询和绑定上使用:param_name而不是同时使用。@param_name这是PDO 手册推荐的。

此外,如果参数是输出参数,则应将其标记为:

$this->db_stmt->bindParam(':postal_code', $request->postal_code, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 40);

参数返回将在$request->postal_code属性中。

于 2012-05-17T11:52:41.680 回答
3

使用:language_id代替,@language_id因为它也在PDO 手册中完成。@用于 SQL 中的变量,所以当你准备

EXECUTE areaGetCities @language_id, @country_id, @postal_code

它被解释为

EXECUTE areaGetCities NULL, NULL, NULL

因为变量(很可能)没有在 SQL Server 中定义。

于 2012-05-17T11:56:16.130 回答
0

我的问题是 postal_code 包含数字,我想将其作为字符串发送,因为有时数字以 0 开头。我将代码更改为:

$this->db_stmt->bindParam(':postal_code', $request->postal_code);       

它就像一个魅力。

非常感谢你们!

于 2012-05-17T17:27:02.993 回答