2013-02-22 2 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

Где именно происходит ошибка, как и с каким сообщением об ошибке? (Edit: ах, я вижу сейчас, читая отчет об ошибке. Может быть, уточнить, что он полностью умирает) –

ответ

2

Ошибка, с которой вы связывались, составляет почти десятилетие старый.
Нужно выполнить определенный набор действий перед тем, как начать думать об ошибке.

  • очередь PDO::ATTR_ERRMODE к ERRMODE_EXCEPTION и проверить, если он был установлен и работает
  • эхо окончательный запрос из.
  • заменяющих названные заполнители с фактическими данными выборки и запустить его в консоли
  • замещающего имени заполнителей вопросительных знаков и попытаться подготовить в консоли

так:

PREPARE stmt1 FROM 'put your query here'; 

С ваш вопрос неясно, если вы выполнили какие-либо из перечисленных выше пунктов.
Если вы закончили их, все и все работали правильно - тогда есть ошибка. Отправьте воспроизводимый код на PHP.NET bugtracker.
Но если вы получите сообщение об ошибке из любого из них - просто выполните ошибку.

Update
Просто углядел:
По какой-то причине вы положили prepare от try блока.
Неудивительно, что вы убиваете свой код незаметно.

Итак, переместите prepare внутри try блок.
Также необходимо настроить отчет об ошибках.

на сервере разработки вы должны установить display_errors на номер на номер, чтобы получать уведомления об ошибках вместо молчания.
на производственном сервере display_errors к офф пока log_errors к на - и искать ошибки в журнале в таком случае.

+0

Кроме того, есть блок try ... catch, но '$ stmt = $ dbh-> prepare ($ query);' не учитывается. –

Смежные вопросы