%PDF- %PDF-
Direktori : /home1/lightco1/www/lightcolab.com/administrator/components/com_dbreplacer/models/ |
Current File : //home1/lightco1/www/lightcolab.com/administrator/components/com_dbreplacer/models/default.php |
<?php /** * @package DB Replacer * @version 6.1.0 * * @author Peter van Westen <info@regularlabs.com> * @link http://www.regularlabs.com * @copyright Copyright © 2018 Regular Labs All Rights Reserved * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL */ defined('_JEXEC') or die; use RegularLabs\Library\RegEx as RL_RegEx; /** * DB Replacer Default Model */ class DBReplacerModelDefault extends JModelLegacy { /** * Constructor */ public function __construct() { parent::__construct(); } /** * Method to replace in the database * * @access public * @return integer */ public function replace(&$params) { if (empty($params->columns)) { return; } $where = ''; $s = str_replace('||space||', ' ', $params->search); $r = str_replace('||space||', ' ', $params->replace); $likes = []; if ($s != '') { if ($s == 'NULL') { $likes[] = '= ""'; $likes[] = 'IS NULL'; } else if ($s == '*') { $likes[] = ' != \'something it would never be!!!\''; } else { $dbs = $s; $dbs = RL_RegEx::quote($dbs); // replace multiple whitespace (with at least one enter) with regex whitespace match $dbs = RL_RegEx::replace('\s*\n\s*', '\s*', $dbs); // escape slashes $dbs = str_replace('\\', '\\\\', $dbs); // escape single quotes $dbs = str_replace('\'', '\\\'', $dbs); // remove the lazy character: doesn't work in mysql $dbs = str_replace(['*?', '+?'], ['*', '+'], $dbs); // change \s to [:space:] $dbs = str_replace('\s', '[[:space:]]', $dbs); if ($params->case) { $likes[] = 'RLIKE BINARY \'' . $dbs . '\''; } else { $likes[] = 'RLIKE \'' . $dbs . '\''; } } } if ( ! empty($likes)) { $where = []; foreach ($params->columns as $column) { foreach ($likes as $like) { $where[] = '`' . trim($column) . '` ' . $like; } } $where = ' WHERE ( ' . implode(' OR ', $where) . ' )'; } $query = 'SHOW COLUMNS FROM `' . trim(RL_RegEx::replace('^__', $this->_db->getPrefix(), $params->table)) . '`'; $this->_db->setQuery($query); $all_columns = $this->_db->loadObjectList(); $index_columns = []; foreach ($all_columns as $column) { if ($column->Key != 'PRI') { continue; } $index_columns[] = $column->Field; } if (empty($index_columns)) { foreach ($all_columns as $column) { if (strpos($column->Type, 'float') !== 0) { continue; } $index_columns[] = $column->Field; } } $select_columns = array_merge($index_columns, $params->columns); $query = 'SELECT `' . implode('`,`', $select_columns) . '`' . ' FROM `' . trim(RL_RegEx::replace('^__', $this->_db->getPrefix(), $params->table)) . '`' . $where . ' LIMIT ' . (int) $params->max; $this->_db->setQuery($query); $rows = $this->_db->loadObjectList(); $count = 0; foreach ($rows as $row) { $set = []; $where = []; foreach ($row as $key => $val) { if (in_array($key, $index_columns) && $val != '' && $val !== null && $val != '0000-00-00') { $where[] = $this->_db->quoteName(trim($key)) . ' = ' . $this->_db->quote($val); } if ( ! in_array($key, $params->columns)) { continue; } if ($s == 'NULL') { if ($val == '' || $val === null || $val == '0000-00-00') { $set[] = $this->_db->quoteName(trim($key)) . ' = ' . $this->_db->quote($r); } continue; } if ($s == '*') { $set[] = $this->_db->quoteName(trim($key)) . ' = ' . $this->_db->quote($r); continue; } $dbs = $s; $dbs = RL_RegEx::quote($dbs); // replace multiple whitespace (with at least one enter) with regex whitespace match $dbs = RL_RegEx::replace('\s*\n\s*', '\s*', $dbs); $dbs = str_replace('\[[:space:]]', '\s*', $dbs); $options = 's'; if ( ! $params->case) { $options .= 'i'; } if ( ! @RL_RegEx::match($dbs, $val, $matches, $options)) { continue; } $set[] = $this->_db->quoteName(trim($key)) . ' = ' . $this->_db->quote(RL_RegEx::replace($dbs, $r, $val, $options)); } // No specific indexed columns found, so add search columns to where if (empty($where)) { foreach ($row as $key => $val) { $where[] = $this->_db->quoteName(trim($key)) . ' = ' . $this->_db->quote($val); } } if (empty($set) || empty($where)) { continue; } $where = ' WHERE (' . implode(' AND ', $where) . ')'; $query = 'UPDATE `' . trim(RL_RegEx::replace('^__', $this->_db->getPrefix(), $params->table)) . '`' . ' SET ' . implode(', ', $set) . $where . ' LIMIT 1'; $this->_db->setQuery($query); if ( ! $this->_db->execute()) { JFactory::getApplication()->enqueueMessage(JText::_('???'), 'error'); continue; } $count++; } if ( ! $count) { JFactory::getApplication()->enqueueMessage(JText::_('DBR_NO_ROWS_UPDATED'), 'notice'); return; } JFactory::getApplication()->enqueueMessage(JText::sprintf('DBR_ROWS_UPDATED', $count), 'message'); } }