2012-09-24 85 views
3

這太令人費解了,我一定會錯過簡單的東西。我有一個查詢來檢查我要插入的事務是否已經存在,以防止重複。代碼如下:PHP Mysqli語句返回一行,-1行受到影響,並且沒有錯誤

function isaDupe($portableDB, $transactArray) 
{ 
    $ref = $transactArray["reference"]; 
    $date = $transactArray["qdate"]; 
    $time = $transactArray["time"]; 

    //prints the query so I can run by hand to test 
    print "SELECT `counter` FROM transactions WHERE (`reference` = '$ref' AND `qdate` = '$date' AND `time` = '$time') "; 

    if ($dupeSelectStmt = $portableDB->prepare("SELECT `counter` FROM transactions WHERE (`reference` = ? AND `qdate` = ? AND `time` = ?)")) 
    { 
     $dupeSelectStmt->bind_param('sss',$ref, $date, $time); 
     $dupeSelectStmt->bind_result($counter); 
     $dupeSelectStmt->execute(); 

     while ($dupeSelectStmt->fetch()) 
     { 
      break; 
     } 

     $numRows = $portableDB->affected_rows; 

     if ($numRows > 0) 
      return TRUE; 
     else if ($numRows == -1) 
     { 
      print " ERROR: "; 
      print_r($portableDB->error); 
      print_r($dupeSelectStmt->error); 
      return FALSE; 
     } 
     else 
      return FALSE; 
    } 
} 

- 如果我通過Workbench在同一臺服務器上手動執行查詢,則返回24行。

- 如果我手動準備,設置和執行語句,這是一樣的。

-affected_rows返回-1

--same如果我做了NUM_ROWS的聲明

-there沒有存儲在聲明或MySQLi的對象錯誤。

- 如果我把打印的取()語句,它打印數據

- 如果我存儲提取的行到一個數組並計算一行結果的價值,這是1

- 我試着用每個變量分別運行它,同樣的事情。

-在同一臺服務器上的其他查詢(heck,在同一個MySQLi對象上)工作正常。選擇,更新和插入。

+1

您提到它適用於其他查詢,它們是否也有多個行響應? – shortstuffsushi

+0

是的,它們是通過相同的MySQLi構造函數完成的 –

+0

您的實際代碼是否具有while(fetch)不做任何事情?如果你回顯每一行? while($ row = $ dupeSelectStmt-> fetch())){ print_r($ row); } – shortstuffsushi

回答

3

答案是我忘了在mysqlistmt :: execute()之後調用mysqlistmt :: store_result。

一旦我添加了$ dupSelectStmt-> store_result();我可以調用$ dupSelectStmt-> num_rows和$ portableDB-> affected_rows,並且他們都顯示了我知道應該看到的24個。

0

您需要使用$dupeSelectStmt->num_rows()才能獲得SELECT結果集中的行數。您需要調用affected_rows(用於INSERT,DELETE,UPDATE)或對象mysqli_stmt而不是數據庫句柄($portableDB),正如您當前所做的那樣。

+0

a。)affected_rows像SELECT語句上的num_rows一樣工作 –

+0

b。)我提到我也嘗試過num_rows。這個問題不叫「Store_results」 –

+0

@ RembrandtQ.Einstein我不認爲你是對的。這是直接從PHP手冊:'此功能只適用於更新表的查詢。爲了從SELECT查詢中獲取行數,請改用mysqli_stmt_num_rows()。http://php.net/manual/en/mysqli-stmt.affected-rows.php我的意思是關於'affected_rows() '在SELECT上像'num_rows()'一樣工作。你沒有調用'store_results()'這個問題是正確的。 –

相關問題