2013-02-22 90 views
0

我有一個應該從數據庫中獲取API令牌的函數。 已經測試我發現,準備SQL語句中的行是查殺腳本腳本:準備好的陳述式查殺腳本

static function get_tokens($platform, $is_breaking_news = 0, $in_test_mode=0) // 1-android, 2-ios 
{ 

    global $dbh; 
    $paid =2; 
    $status = 1; 
    $result = array(); 
    $query = ' 
     SELECT 
      mobile_install_device_token, mobile_install_id 
     FROM 
      ' . TABLE_PREFIX . 'mobile_installs 
     WHERE 
      mobile_install_platform = :platform 
     AND 
      mobile_install_app_type = :paid 
     AND '; 
    if ($is_breaking_news) 
    { 
     $query .= ' 
      mobile_install_pn_status > :status 
     '; 
     $status = 0; 
    } 
    else 
    { 
     $query .= ' 
      mobile_install_pn_status = :status 
     '; 
    } 

    $stmt = $dbh->prepare($query); // **THIS IS THE KILLER!** 

    try 
    { 
     $stmt->bindParam(':platform', $platform); 
     $stmt->bindParam(':paid', $paid); 
     $stmt->bindParam(':status', $status); 

     $stmt->execute(); 
    } 
    catch(PDOException $e) 
    { 

     Utils::sql_fail($query, $e->getMessage()); 
    } 

    while($row = $stmt->fetch()) 
    { 
    if ($in_test_mode) 
    { 

     if (!in_array($row['mobile_install_id'], array(4, 5, 13, 8))) 
     { 

      continue; 
     } 
    } 
    echo 'send to ' . $row['mobile_install_id'] . PHP_EOL; 
     $result[] = $row['mobile_install_device_token']; 
    } 

    return $result; 
}//end function get_tokens 

我發現這是一個known bug,但所提供的解決方案有沒有似乎工作。 任何想法?

+1

究竟是哪裏的事情失敗和錯誤信息? (編輯:啊,我現在看到了,閱讀bug報告,或者澄清它完全消失) – 2013-02-22 10:42:15

回答

2

您鏈接的bug幾乎是十年舊。
在開始考慮錯誤之前,必須執行某些操作集

  • PDO::ATTR_ERRMODEERRMODE_EXCEPTION驗證,如果它被設置和工作
  • 呼應你的最終查詢出來。
  • 實際樣本數據指定的佔位符
  • 替代品,在一個控制檯上運行它帶有問號
  • 替代命名佔位符,並試圖準備在控制檯

這樣的:

PREPARE stmt1 FROM 'put your query here'; 

從你的問題目前還不清楚你是否完成了上述任何項目。
如果你完成了所有工作,所有工作都正常 - 那麼,就有一個錯誤。在PHP.NET bugtracker上發佈可複製的代碼。
但是,如果你從任何一個錯誤中得到一個錯誤 - 只需要處理錯誤。

更新
就察覺到而已:
出於某種原因,你把prepare遠離try塊。
難怪它正在悄悄地殺死你的代碼。

因此,在try塊內移動prepare
另外,設置錯誤報告也很重要。

在開發服務器上,您必須將display_errors設置爲,,以通知錯誤而不是無聲死亡。
在生產服務器上display_errors關閉log_errors - 並在這種情況下查找日誌中的錯誤。

+0

此外,還有一個'try ... catch'塊,但是'$ stmt = $ dbh-> prepare($ query);'被排除在外。 – 2013-02-22 11:23:54