public function tearDown() { parent::tearDown(); $app = \FelixOnline\Core\App::getInstance(); $app['db']->dbh->close(); \FelixOnline\Core\App::setInstance(null); }
public function getSQL() { $app = \FelixOnline\Core\App::getInstance(); if (is_null($this->value) && $this->config['null'] == true) { return 'NULL'; } return $app['safesql']->query($this->placeholder, array($this->value)); }
/** * Test utilities */ function loginUser($user) { $app = \FelixOnline\Core\App::getInstance(); // Log in user $app['env']['session']['loggedin'] = true; $app['env']['session']['uname'] = $user; $app['db']->query("INSERT INTO `login` \n\t\t(`session_id`, `ip`, `browser`, `user`, `timestamp`, `valid`, `logged_in`)\n\t\tVALUES \n\t\t('1', '" . $app['env']['REMOTE_ADDR'] . "', '" . $app['env']['HTTP_USER_AGENT'] . "', '" . $user . "', NOW(), 1, 1)"); $app['currentuser']->setUser($user); }
public function getSQL() { $app = \FelixOnline\Core\App::getInstance(); if (is_null($this->value) && $this->config['null'] == true) { return 'NULL'; } $datetime = (new \DateTime("@{$this->value}"))->format('Y-m-d H:i:s'); return $app['safesql']->query($this->placeholder, array($datetime)); }
public function __construct($message, $code = self::EXCEPTION_UNIVERSAL, \Exception $previous = null) { try { $app = \FelixOnline\Core\App::getInstance(); if (isset($app['currentuser'])) { $this->user = $app['currentuser']; } else { $this->user = null; } } catch (\Exception $e) { // no app $this->user = null; } parent::__construct($message, $code, $previous); }
/** * Get cache item * * pk - primary key column */ protected function getCache($pk) { $app = \FelixOnline\Core\App::getInstance(); return $app['cache']->getItem($this->dbtable . '/' . $pk->getValue()); }
private function log($action, $fields, $pk = null) { if ($this->dontlog) { return; } if (is_null($pk)) { $pk = $this->fields[$this->pk]->getValue(); } $app = App::getInstance(); if (isset($app['currentuser']) && $app['currentuser']->isLoggedIn()) { $user = $app['currentuser']->getUser(); } else { $user = '******'; } $sql = $app['safesql']->query("INSERT INTO audit_log (`id`, `timestamp`, `table`, `key`, `user`, `action`, `fields`) VALUES (NULL, NOW(), '%s', '%s', '%s', '%s', '%s')", array($this->dbtable, $pk, $user, $action, json_encode($fields))); $app['db']->query($sql); }
function query($query_string, $query_vars) { $app = \FelixOnline\Core\App::getInstance(); $link_id = $app['db']->dbh; if (is_array($query_vars)) { $_var_count = count($query_vars); if ($_var_count != preg_match_all('!%[sSiIfFcClLqQnN]!', $query_string, $_match)) { $this->_error_msg('unmatched number of vars and % placeholders: ' . $query_string); } // get string position for each element $_var_pos = array(); $_curr_pos = 0; for ($_x = 0; $_x < $_var_count; $_x++) { $_var_pos[$_x] = strpos($query_string, $_match[0][$_x], $_curr_pos); $_curr_pos = $_var_pos[$_x] + 1; } // build query from passed in variables, escape them // start from end of query and work backwards so string // positions are not altered during replacement $_last_removed_pos = null; $_last_var_pos = null; for ($_x = $_var_count - 1; $_x >= 0; $_x--) { if (isset($_last_removed_pos) && $_last_removed_pos < $_var_pos[$_x]) { // already removed, skip continue; } // escape string $query_vars[$_x] = $this->_sql_escape($link_id, $query_vars[$_x]); if (in_array($_match[0][$_x], array('%S', '%I', '%F', '%C', '%L', '%Q', '%N'))) { // get positions of [ and ] if (isset($_last_var_pos)) { $_right_pos = strpos($query_string, ']', $_last_var_pos); } else { $_right_pos = strpos($query_string, ']', $_var_pos[$_x]); } // no way to get strpos from the right side starting in the middle // of the string, so slice the first part out then find it $_str_slice = substr($query_string, 0, $_var_pos[$_x]); $_left_pos = strrpos($_str_slice, '['); if ($_right_pos === false || $_left_pos === false) { $this->_error_msg('missing or unmatched brackets: ' . $query_string); } if (in_array($query_vars[$_x], $this->_drop_values, true)) { $_last_removed_pos = $_left_pos; // remove entire part of string $query_string = substr_replace($query_string, '', $_left_pos, $_right_pos - $_left_pos + 1); $_last_var_pos = null; } else { if ($_x > 0 && $_var_pos[$_x - 1] > $_left_pos) { // still variables left in brackets, leave them and just replace var $_convert_var = $this->_convert_var($query_vars[$_x], $_match[0][$_x]); $query_string = substr_replace($query_string, $_convert_var, $_var_pos[$_x], 2); $_last_var_pos = $_var_pos[$_x] + strlen($_convert_var); } else { // remove the brackets only, and replace %S $query_string = substr_replace($query_string, '', $_right_pos, 1); $query_string = substr_replace($query_string, $this->_convert_var($query_vars[$_x], $_match[0][$_x]), $_var_pos[$_x], 2); $query_string = substr_replace($query_string, '', $_left_pos, 1); $_last_var_pos = null; } } } else { $query_string = substr_replace($query_string, $this->_convert_var($query_vars[$_x], $_match[0][$_x]), $_var_pos[$_x], 2); } } } return $query_string; }
public function testRunNoWrongSafesqlException() { \FelixOnline\Core\App::setInstance(null); $this->setExpectedException('Exception', 'No safesql setup'); $app = new \FelixOnline\Core\App(array('base_url' => 'foo')); $db = new \ezSQL_mysqli(); $app['db'] = $db; $app['safesql'] = 'foo'; $app->run(); }
/** * Public: Add authors to article */ public function addAuthors($authors) { $app = App::getInstance(); foreach ($authors as $author) { $authorRecord = new ArticleAuthor(); $authorRecord->setArticle($this)->setAuthor($author)->save(); } return $authors; }
/** * Query sql */ protected function query($sql) { $GLOBALS['current_sql'] = $sql; $app = \FelixOnline\Core\App::getInstance(); $item = null; if ($this->cache == true) { $item = $app['cache']->getItem($this->table . '/' . md5($sql)); $results = $item->get(\Stash\Invalidation::PRECOMPUTE, 300); } if ($item && !$item->isMiss()) { return $results; } set_error_handler(function ($errno, $errstr) { $sql = $GLOBALS['current_sql']; // $sql in query function not in scope here - this is a nasty hack unset($GLOBALS['current_sql']); throw new SQLException($errstr, $sql); }); $results = $app['db']->get_results($sql); restore_error_handler(); // restore old error handler if ($app['db']->last_error) { unset($GLOBALS['current_sql']); throw new SQLException($app['db']->last_error, $app['db']->captured_errors); } if ($item) { if ($this->cacheExpiry) { $item->expiresAfter($this->cacheExpiry); } $app['cache']->save($item->set($results)); } unset($GLOBALS['current_sql']); return $results; }
public function testLogVisitRepeat() { $app = \FelixOnline\Core\App::getInstance(); $pdo = $this->getConnection()->getConnection(); $article = new \FelixOnline\Core\Article(1); $article->logVisit(); $stm = $pdo->prepare("SELECT COUNT(article) AS hits FROM article_visit WHERE repeat_visit = 0 AND article = :id"); $stm->execute(array(':id' => 1)); $row = $stm->fetch(); $this->assertEquals((int) $row['hits'], 2); $this->assertEquals(3, $this->getConnection()->getRowCount('article_visit')); $stm2 = $pdo->prepare("SELECT COUNT(*) as count FROM article_visit WHERE repeat_visit = 1"); $stm2->execute(array()); $row = $stm2->fetch(); $this->assertEquals((int) $row['count'], 1); $article->logVisit(); $this->assertEquals(4, $this->getConnection()->getRowCount('article_visit')); $stm->execute(array(':id' => 1)); $row = $stm->fetch(); $this->assertEquals((int) $row['hits'], 2); $stm2 = $pdo->prepare("SELECT COUNT(*) as count FROM article_visit WHERE repeat_visit = 1"); $stm2->execute(array()); $row = $stm2->fetch(); $this->assertEquals((int) $row['count'], 2); }
public function testCache() { $app = \FelixOnline\Core\App::getInstance(); $manager = $this->getManager(); $manager->cache(true); $selects = $app['db']->get_row("SHOW STATUS LIKE 'Com_select'")->Value; $this->assertEquals(0, (int) $selects); $all = $manager->all(); $selects = $app['db']->get_row("SHOW STATUS LIKE 'Com_select'")->Value; // 7 because of the selects when instantiating the models $this->assertEquals(7, (int) $selects); $this->assertCount(3, $all); $this->assertInstanceOf('FelixOnline\\Core\\Article', $all[0]); $all = $manager->all(); $selects = $app['db']->get_row("SHOW STATUS LIKE 'Com_select'")->Value; $this->assertEquals(7, (int) $selects); $this->assertCount(3, $all); $this->assertInstanceOf('FelixOnline\\Core\\Article', $all[0]); }