2012-05-17 118 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);  

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

非常感謝你們!