2013-09-17 3 views
0

Мне нужно выполнить непрерывный синтаксический анализ нескольких потоков внешних точечных томов, вставить соответствующие поля в mysql db и регулярные запросы из db. Все это находится в защищенной среде - то есть я не имею дело с веб-формами или пользовательскими вводамиPDO Active Record подготовленный оператор в отдельных классах

Поскольку я реализую ряд вставок в + запросы из разных таблиц, я решил настроить PDO модель активной записи - в соответствии с рекомендациями Николаса Хуот и многих спонсоров SO.

У меня есть простая повторная вставка, работающая нормально, но после нескольких дней горя не может получить подготовленную вставку для полета. Я хочу использовать подготовленные вставки, учитывая, что их будет много (т.е. для производительности).

Соответствующие биты кода являются:

========= класс База данных:

private function __construct() 
    { 
     try { 
      // Some extra bad whitespace removed around = 
      $this->dbo = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPSW, $options); 
     } catch (PDOException $e) { 
      echo 'Connection failed: ' . $e->getMessage(); 
     } 
    } 

    public static function getInstance() 
    { 
     if(!self::$instance) 
     { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

public function prepQuery($sql) // prepared statements 

{ 
    try { 
     $dbo = database::getInstance(); 
     $stmt = new PDOStatement(); 
     $dbo->stmt = $this->$dbo->prepare($sql); 
     var_dump($dbo); 
    } 
    catch (PDOException $e) { 
     echo "PDO prepare failed : ".$e->getMessage(); 
    } 
} 


public function execQuery($sql)  // nb uses PDO execute 
{ 
    try { 
     $this->results = $this->dbo->execute($sql); 
    } 
    catch (PDOException $e) { 
     echo "PDO prepared Execute failed : \n"; 
     var_dump(PDOException); 
    } 
} 

========= класс Таблицы:

function storeprep() // prepares write to db. NB prep returns PDOstatement 
{ 
    $dbo = database::getInstance(); 
    $sql = $this->buildQuery('storeprep'); 
    $dbo->prepQuery($sql); 
    return $sql; 

} 

function storexecute($paramstring) // finalises write to db : 
{ 
    echo "\nExecuting with string : " . $paramstring . "\n"; 
    $dbo = database::getInstance(); // Second getInstance needed ? 
    $dbo->execQuery(array($paramstring)); 
} 

// класс таблицы также включает в себя функцию, которая возвращает buildQuery $ SQL строку - испытано о'кеы

=======

Контроллер:

$dbo = database::getInstance(); 

$movements = new trainmovts(); 

$stmt = $movements->storeprep(); // set up prepared query 

После этих начальных стадий, контроллер проходит через непрерывный цикл, выбирает поля, необходимые для хранения в массиве параметра $ Exec, затем вызывает $ movements-> storexecute ($ Exec);

Моя непосредственная проблема в том, что я получаю сообщение об ошибке «Catchable фатальная ошибка: Объект базы данных класса не может быть преобразован в строку» в функции prepquery Database (который называется в таблице storeprep Fn)

Can кто-нибудь советует по этой непосредственной проблеме, должны ли последующие повторные выполнения работать таким образом, и более широко следует изменить что-либо со структурой?

+0

[This] (http://stackoverflow.com/a/11369679/727208) должен объяснить, как вы можете совместно использовать один экземпляр PDO между несколькими объектами. –

ответ

0

Я думаю, что ваша проблема в этой строке $ dbo-> stmt = $ this -> $ dbo-> prepare ($ sql);, php хочет перевести $ dbo на строку и функцию вызова с этим именем из этого. На самом деле вам нужно использовать $ this-> dbo.

И на самом деле ваши функции не статичны, поэтому я думаю, что вам не нужно каждый раз называть getInstance, вы можете использовать $ this.

+0

Спасибо, но это все еще не исправляет. Изменение этой строки на $ this-> dbo = $ this-> dbo-> prepare ($ sql) приводит к ошибке Call to undefined database: prepare(). вырезание $ dbo = database :: getInstance(); выводит результат на вызов функции-члена prepare() на не-объекте – SteveAW

+0

Все отсортированные - еще раз за ваши отзывы. Теперь работает: $ this-> dbo-> stmt = $ this-> dbo-> prepare ($ sql); Затем следующее работает как довольно запутанный оператор выполнения: $ this-> results = $ dbo-> dbo-> stmt-> execute ($ sql); – SteveAW

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