zend_db и присоединиться - PullRequest
       5

zend_db и присоединиться

1 голос
/ 22 апреля 2010

Я пытаюсь понять, как использовать Zend_DB в моей программе, но у меня есть некоторые проблемы. Класс ниже (DatabaseService) работает, когда я передаю ему простой запрос. Однако, если я передаю запрос с предложением соединения, моя страница просто зависает и ошибки не возвращается. Я вырезал и вставил qry в браузере запросов, и он действителен

Любая помощь будет отличной

$SQL = "select name from mytable"

$db = new DatabaseService($dbinfo)

$db ->fetchall($SQL )  // works

-----------------------------------------------------------
$SQL = "select count(*) as cnt from EndPoints join CallID on EndPoints.`CallID` = CallID.CallID where EndPoints.LastRegister >= '2010-04-21 00:00:01' and EndPoints.LastRegister <= '2010-04-21 23:59:59' "

$db = new DatabaseService($dbinfo)

$db ->fetchall($SQL )  // DOES NO WORK

class DatabaseService
{


 function DatabaseService($dbinfo,$dbname="")
 {

  try
  {
  $dbConfig = array( 
      'host'     => $this->host,
    'username' => $this->username,
    'password' => $password,
    'dbname'   => $this->dbname );

                 $this->db = Zend_Db::factory($this->adapter, $dbConfig); 

      Zend_Db_Table::setDefaultAdapter($this->db);
  }
  catch(Zend_Exception $e)
  {
   $this->error = $e->getMessage();
   Helper::log($this->error);
   return false;
  }
 }

 public function connnect()
 {
  if($this->db !=null)
  {
   try

   {
    $this->db->getConnection(); 
       return true; 
   }
   catch (Zend_Exception $e) 
   {   
    $err = "FAILED ::".$e->getMessage()." <br />";


   }
  }
  return false;
 } 

 public function fetchall($sql)
 {

  $res= $this->db->fetchAll($sql);
  return $res;

 }
}

1 Ответ

0 голосов
/ 21 ноября 2010

Не понимаю, почему это не сработает. Это может быть ошибка в конкретном выпуске ZF, но, насколько я могу судить, нет ошибок синтаксиса SQL. То, что вы могли бы сделать, - это запустить класс Zend_Db в вашей системе, как в файле index.php, так же, как вы делали это в классе DatabaseService:

$dbConfig = array(
    'host'     => 'hostname',
    'username' => 'username',
    'password' => 'password',
    'dbname'   => 'dbname'
);

$db = Zend_Db::factory('mysqli', $dbConfig);
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Db_Table::setDefaultAdapter($db);

И тогда Zend Framework должен обработать процесс подключения для вас. Затем вместо того, чтобы иметь класс DatabaseService, вы просто создаете модель для каждой таблицы, которая вам нужна, например:

<?php

class EndPoints extends Zend_Db_Table_Abstract
{
    protected $_name = 'EndPoints';

    /**
     * the default is 'id'. So if your table's primary key field name is 'id' you
     * will not be required to set this.  If your primary key is something like
     * 'EndPointsID' you MUST set this.
     * @var primary key field name
     */
    protected $_primary = 'EndPointsID';
}

Выполнение этого автоматически предоставит вам доступ к таким функциям, как fetchRow (), fetchAll (), find () и т. Д. Затем вы также можете использовать Zend_Db_Table_Select для ваших запросов, что может быть весьма полезно. Вот так:

<?php

$endPointsModel = new EndPoints();
$callIdCount = $endPointsModel->getCallIdCount('2010-04-21 00:00:01', '2010-04-21 00:00:01');

Тогда в вашей модели EndPoints вы бы создали эту функцию следующим образом:

...

public function getCallIdCount($fromDate, $toDate)
{
    $cols = array('cnt' => 'count(*)');
    $select = $this->select->setIntegrityCheck(false) // this is crucial
        ->from($this->_name, $cols)
        ->join('CallID', "{$this->_name}.CallID = CallID.CallID", array())
        ->where("{$this->_name}.LastRegister >= ?", $fromDate)
        ->where("{$this->_name}.LastRegister <= ?", $toDate); 

    // if you need to see what the whole query will look like you can do this:
    // echo $select->__toString();
    return $this->fetchAll($select);
{
...