2013-04-29 63 views
0

在我的開發環境中,我有一個類中的靜態函數,其中我可以檢索表格數據列表並打印到屏幕上。它效果很好。這是我的代碼:MySQL查詢沒有生產結果,但在開發中沒有問題

public static function getList($numRows=1000000, $order="name ASC") { 

    $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM posttypes ORDER BY " . mysql_real_escape_string($order) . " LIMIT :numRows"; 
    $stmt = $conn->prepare($sql); 
    $stmt->bindValue(":numRows", $numRows, PDO::PARAM_INT); 
    $stmt->execute(); 
    $list = array(); 

    while ($row = $stmt->fetch()) { 
     $postType = new PostType($row); 
     $list[] = $postType; 
    } 

    //Now get total number of posts that match criteria 
    $sql = "SELECT FOUND_ROWS() AS totalRows"; 
    $totalRows = $conn->query($sql)->fetch(); 
    $conn = null; 

    return (array("results" => $list, "totalRows" => $totalRows[0])); 
} 

但是,在我的生產環境中,我無法檢索任何記錄。但是,如果我在phpMyAdmin中運行精確的查詢,我會得到我想要的確切記錄。

不確定發生了什麼事?這是我第一次設置生產環境。我正在使用藍色主機。

更新: 好吧,我通過刪除mysql_real_escape_string來修復它,但是我相信它是更安全的轉義字符串,但是這必須返回false並且失敗SQL語句。感謝大家的幫助。

+1

'$ conn->的setAttribute(PDO :: ATTR_EMULATE_PREPARES,FALSE);'(也許這在'php.ini'已配置您的dev的服務器?) – eggyal 2013-04-29 01:12:14

+0

你不能綁定限制,我很確定它會失敗。在這兩個環境 – ajreal 2013-04-29 01:38:44

+0

@ajreal:它在我的開發環境中工作正常,並且限制似乎可以綁定好。無論如何,我嘗試刪除綁定,結果仍然相同。 – TimNguyenBSM 2013-04-29 03:48:54

回答

1
  1. 它的PDO query fails but I can't see any errors. How to get an error message from PDO?
  2. 重複此功能是錯誤的,在多點反正
    • 決不不斷從應用功能連接,但連接只有每個應用程序一次,然後使用單一實例的PDO類,將其傳遞給函數。
    • 1000000行是一個方法太多。當你忘記設置LIMIT時,你會殺死你的服務器
    • ASC不是一個字符串通過任何手段。這是一個語法關鍵字。因此,逃避任何角色是完全沒有用的。儘管在本地服務器上使用默認憑據,它本身連接到服務器並返回相同的字符串,但在活動服務器上它無法連接,因此返回false。 What to do to properly bind a keyword
+0

謝謝你的答案。 – TimNguyenBSM 2013-04-29 14:33:11

0

簡單的測試,第一:

  1. 沒有您的生產SQL數據庫匹配您的發展datatbase?它看起來像你有phpMyAdmin。

打開筆記本:剪下並從PhpNyAdmin中刪除成功的查詢。將其粘貼到筆記本文件中。

將生產程序中的查詢剪切並粘貼到同一個文件中,以驗證兩個查詢是否相同。標點符號錯誤可能很難確定。

-1

聽起來像一個數據庫連接問題給我。也許仔細檢查你的主機/ un/pw?

+0

這裏沒有連接問題。我沒有提及,但應該有的是,我可以從用戶界面添加一個記錄到表中,我可以使用phpMyAdmin查看錶中的記錄,但無法獲得返回結果。 – TimNguyenBSM 2013-04-29 03:50:38

0

更新:好的,我通過刪除mysql_real_escape_string來修復它,但我相信它是更安全的轉義字符串,但是這必須返回false並失敗SQL語句。感謝大家的幫助。