2012-05-17 70 views
1

我想用下面的代码中检索从我的MSSQL数据库的一些数据:PHP web服务与PDO

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)) 
+0

你从哪里看到'@'用于为PDOStatement参数添加前缀?它是':'对于命名参数,'''对于基于索引的参数。 –

+0

向我们展示您的存储过程。 – kba

+0

该过程不返回任何内容。 –

回答

3

尝试在查询和使用结合的:param_name代替@param_name两者。这由PDO manual推荐。

而且,如果该参数是一个输出参数,你应该把它标记为这样:

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

帕拉姆收益将在$request->postal_code属性。

+0

现在我得到:[Microsoft] [SQL Server Native Client 11.0] [SQL Server]形式参数“@postal_code”未被声明为OUTPUT参数,而是在请求的输出中传递的实际参数。 –

+0

我已经编辑了一个可能的解决方案的答案!让我知道这是否适合你。 – alganet

+0

我接受了你的答案,因为你先告诉我用户“:”而不是“@”,那是我的代码中的一个错误。我发布了真正的解决方案:-D –

3

使用:language_id而不是@language_id,因为它也在PDO manual中完成。该@用于在SQL变量,所以当你准备

EXECUTE areaGetCities @language_id, @country_id, @postal_code 

它被解释为

EXECUTE areaGetCities NULL, NULL, NULL 

自变量(最有可能)没有在SQL Server中定义。

+0

我编辑了我的问题。 –

0

我的问题是,POSTAL_CODE包含数字,我想因为有时数从0开始我改变了代码,将它发送一个字符串:

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

和它的工作就像一个魅力。

非常感谢你们!