Как запустить функцию пхп?

D
На сайте с 28.06.2008
Offline
1114
830

Есть у меня база объектов, для которых есть адреса и координаты. На фронте в одном месте выводится число - число объектов поблизости.

Давно это число не обновлял и насколько помню программист писал некий функционал на эту тему, но связи с ним нет.

Полез в код (хоть сам и не кодер) и вроде нашел то что нужно

	function mapcron(){


$this->_db->setQuery("SELECT geo_lat,geo_long,item_id,id FROM #__firms_address WHERE nearby=0 LIMIT 500");
$alladress = $this->_db->loadObjectList();

foreach($alladress as $item){
$address=array();
$this->_db->setQuery("SELECT t1.id FROM #__firms_items AS t1 INNER JOIN #__firms_address AS t4 ON t1.id = t4.item_id
WHERE
(t4.geo_long BETWEEN ".($item->geo_long - 0.01)." AND ".($item->geo_long + 0.01).") AND
(t4.geo_lat BETWEEN ".($item->geo_lat - 0.01)." AND ".($item->geo_lat + 0.01).") GROUP BY t1.id LIMIT 100");
$address = $this->_db->loadObjectList();

if(!empty($address))
{

$this->_db->setQuery("UPDATE #__firms_items SET nearby=".count($address)." WHERE id=".$item->item_id);
$this->_db->execute();

$this->_db->setQuery("UPDATE #__firms_address SET nearby=".count($address)." WHERE id=".$item->id);
$this->_db->execute();
}
$result=true;
}
return $result;
}

Вот мне как раз и нужно обновить поле nearby в таблице firms_items

Как теперь правильно все это дело запустить на сервере, чтобы скрипт пробежался по адресам (их 60.000) и обновил поле nearby?

кот Бегемот
На сайте с 07.12.2009
Offline
278
#1

А сервер локальный или на хостинге?

Яндекс Директ, Гугд адворс, не дорого и ответственно. Телеграмм @H_Ilin
edogs software
На сайте с 15.12.2005
Offline
775
#2

Dram,

Функция у Вас в принципе самодостаточная, даже по адресам пробегает сама.

Так что запросы и логика вся есть, достаточно заменить вызовы к БД.

Вместо подряд идущих ( set->query и loadobjectlist ) сделайте просто выборку в массив запроса из set-query

Вместо $item->geo_long пишите $item['geo_long'] и т.д.

Вместо ( set->query и execute ) достаточно просто запроса в БД.

И всё.

Или поищите откуда эта функция вызывалась. Она у Вас часть класса, так что вызов надо искать по принципу ->mapcron. Может будет очевидно как надо обратиться к сайту, что бы она сработала.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
T7
На сайте с 19.09.2018
Offline
63
#3
Она у Вас часть класса, так что вызов надо искать по принципу ->mapcron

Да, Просто упрощу.

<?php # файл содержащий класс с методом mapcron)

namespace "буквы\буквы\буквы"; #где то вначале, может и не быть, соответственно и при вызове не надо
....
class "имяКласса"
{
....
function mapcron(){
$this->_db ....
}
....
}

Выше прокрутите, найдите "имяКласса".

Вызов: \"буквы\буквы\буквы"\"имяКласса"->mapcron(); В том файле, в котором точно был require( файл содержащий класс с методом mapcron). Если вменяемый автолоадер, то в любом месте.

D
На сайте с 28.06.2008
Offline
1114
#4

Нашел -

class FirmModelAction extends JModelLegacy
{
var $_db = null;

ниже внутри этого класса более 10 разных функций.

Сделал поиск по всем файлам сайта - mapcron больше нигде не встречается.

Как теперь правильно запустить?

T7
На сайте с 19.09.2018
Offline
63
#5

Самое простое, найти, файл где есть что то похожее на

$var = new FirmModelAction

и потом

 $var->mapcron(); 
в этом скрипте;

Беглый взгляд говорит что в mapcron используется только $_db ($this->_db) из этого класса. Тогда можно просто написать какой то скрипт (судя по гуглу _db->loadObjectList, это у вас джумла). Быстро находится пример. Делаем по аналогии, вставляем в свой скрипт функцию, меняем в ней

function mapcron(){ 
$this->_db->setQuery(

на

function mapcron( $db ){ 
$db->setQuery(

Разбираемся почему в примере

defined('_JEXEC') or die('Restricted access');

Видимо _JEXEC определяется после каких то стартовых манипуляций в index.php.

В итоге получится что то типа, который положим в файл и запустим хттп://сайт.ру/мапкрон.пхп

<?php
//defined('_JEXEC') or die('Restricted access');
define('DS', DIRECTORY_SEPARATOR);

// Предполагаю, что 1 строка если этот файл require в индекс.пхп,
//а если запускать отдельно, то лучше скопировать нижестоящие строки до $db= из вашего индекс.пхп
define('_JEXEC', 1);
define('JPATH_BASE', realpath(dirname(__FILE__)));

require_once (JPATH_BASE.DS.'includes'.DS.'defines.php');
require_once (JPATH_BASE.DS.'includes'.DS.'framework.php');

$app = JFactory::getApplication('site');
$db = JFactory::getDbo();

function mapcron( $db )
{
//Код функции, с заменой $this->_db на $db
//вероятно в запросах с именами таблиц #__firms_address , что то придется сделать

}

echo mapcron( $db ) ? "Ok" : "Not Ok";
exit;
?>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий