2013-07-30 45 views
0

這是我一直想弄清楚的一點,它是最簡單的查詢似乎並不想爲我工作(只在php mysqli中,在控制檯sql中工作)PHP MySQLi轉義語句中的轉義參數可能存在問題?

首先我我正在使用一個準備好的語句,只是在一個專門的id(來自另一個服務)上尋找一個匹配來更新關係,以便使用我的主鍵更容易搜索我的結尾。

查詢如下:

$query = "SELECT id 
      FROM {$this->config->dbprefix}{$table} 
      WHERE sf_id = ? 
      LIMIT 1"; 

我用這個作爲一條線,我把它分解了更好的可讀性這裏

然後我檢查準備語句是有效的(我做的這在多個地方,它在其他地方工作。

if(!($ret = $this->dbo->prepare($query))){ 
    //handle error, this part is never called 
}else{ 
    //everything is fine, code in here is below 
} 

到這裏一切似乎很好。檢查表和前綴manuall y顯示他們正在工作並引用適當的表格。

$ret->bind_param('s',$id); 
$ret->execute(); 
$ret->bind_result($retId); 
$ret->fetch(); 
$count = $ret->num_rows; 

問題是在這裏,查詢總是返回0爲num_rows。手動檢查查詢並在控制檯中嘗試返回1結果。到目前爲止,它只是一個簡單的查詢,我無法將我的頭圍繞在其他地方,但不在這裏。我相信這是構建它的正確方法(我有許多其他查詢結構相似)。

有沒有我可能遇到的任何混淆?容易錯過的東西可能導致這樣的查詢不返回結果?

編輯: 我已經嘗試進一步的錯誤處理,並嘗試執行一個if測試不會觸發錯誤,但我會嘗試更多。

擴大我有一個原始輸出$query變量和id變量。通過組合它們並在控制檯中手動嘗試查詢,我會得到正確的結果。我的想法在某種程度上準備聲明是逃避,導致字符串變量$id不正確匹配。儘管這只是猜測。

+0

您應該在這裏添加一些錯誤處理,因爲它不僅僅是可以產生錯誤的'prepare'語句。 – tadman

+0

數據庫中是'sf_id'' varchar'還是'int'?當你手動檢查查詢並且工作時,你的語法是什麼? – Phas1c

+0

我有一些,num_rows返回0,意思是沒有結果。所以根據準備顯示,因爲表和列是有效的,並且查詢執行並返回沒有任何可能與$ id有關的錯誤,這是我能看到的唯一合乎邏輯的事情。 'sf_id'是'varchar',我有查詢輸出,取代了?與由相同函數返回的實際ID相同,並在控制檯中正確返回1個結果。 –

回答

1

在嘗試訪問num_rows之前,您需要撥打store_result()。沒有它,語句句柄不知道結果集中有多少行。

$ret->bind_param('s',$id); 
$ret->execute(); 
$ret->bind_result($retId); 
$ret->store_result(); 
$count = $ret->num_rows; 
// perhaps add error handling based on number of rows here 
$ret->fetch(); 
+0

啊,我是在假設存儲結果是沒有綁定的情況下得到結果,並且獲取做了同樣的事情,但綁定。 –