$SECTION_SQL=$dbTecDoc->query('SELECT DISTINCT
ART_ID, ART_ARTICLE_NR, SUP_BRAND, DES_TEXTS.TEX_TEXT AS STR_DES_TEXT, DES_TEXTS2.TEX_TEXT AS ART_COMPLETE_DES_TEXT
FROM LINK_GA_STR
INNER JOIN LINK_LA_TYP ON LAT_TYP_ID IN ('.implode(',',$TYP_ID_array).') AND
LAT_GA_ID = LGS_GA_ID
INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID
INNER JOIN SEARCH_TREE ON STR_ID = LGS_STR_ID
INNER JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = STR_DES_ID AND DESIGNATIONS.DES_LNG_ID = '.$LNG_ID.'
INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
INNER JOIN ARTICLES ON ART_ID = LA_ART_ID
INNER JOIN SUPPLIERS ON SUP_ID = ART_SUP_ID
INNER JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = ART_COMPLETE_DES_ID
INNER JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID AND DESIGNATIONS2.DES_LNG_ID = '.$LNG_ID.'
WHERE
LGS_STR_ID = '.$SECTION_ID.'
ORDER BY
LA_ART_ID
LIMIT '.$LIMIT);
Который вытаскивает из базы все ART_ARTICLE_NR для $TYP_ID_array из категории SECTION_ID, артикулов очень много для родительской категории, порядка 2000. Дальше формируется массив который идет по базе с запчастями, в которой больше миллиона записей и все так же вытаскивает совпадения и третий запрос это
function GetPropertys($ART_ID, $LNG_ID){
global $dbTecDoc;
$model_par = '';
$param_SQL=$dbTecDoc->query("SELECT DES_TEXTS.TEX_TEXT AS CRITERIA_DES_TEXT,
IFNULL(DES_TEXTS2.TEX_TEXT, ACR_VALUE) AS CRITERIA_VALUE_TEXT
FROM ARTICLE_CRITERIA
LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = ACR_KV_DES_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID
LEFT JOIN CRITERIA ON CRI_ID = ACR_CRI_ID
LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = CRI_DES_ID
LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
WHERE ACR_ART_ID = ".$ART_ID." AND
(DESIGNATIONS.DES_LNG_ID IS NULL OR DESIGNATIONS.DES_LNG_ID = ".$LNG_ID.") AND
(DESIGNATIONS2.DES_LNG_ID IS NULL OR DESIGNATIONS2.DES_LNG_ID = ".$LNG_ID.");");
while ( $model_param = $dbTecDoc->get_row($param_SQL) ) {
//$model_par .= $model_param['CRITERIA_DES_TEXT'] . ': ' . $model_param['CRITERIA_VALUE_TEXT'] . ';<br />';
$model_par .= '<tr><td>' . $model_param['CRITERIA_DES_TEXT'] . '</td><td>' . $model_param['CRITERIA_VALUE_TEXT'] . '</td></tr>';
}
return '<table class="table table-striped table-hover"><tbody>' . $model_par . '</tbody></table>';
}
который уже вытаскивает параметры для товара.
Первый запрос из базы TecDoc отрабатывает около 7-15 секунд, второй не меньше и третий уже в сравнении с остальными гораздо меньше, но все равно эти цифры приводят в ужас. Учитывая что перед ними ещё есть запрос который формирует TYP_ID_array.
Собственно нужна помощь в оптимизации работы всех этих запросов. Скорее всего я изначально не правильно подхожу к структуре и однозначно говнокодю, потому что я знаю у кого это реализовано и работает это быстро у них.
Готов отблагодарить финансово за консультации.
он работает только когда $stockArray[$keyEmail]['mask'] не пустое, как можно добавить условие чтобы если $stockArray[$keyEmail]['mask'] не пустое то срабатывала
if (isset($_SESSION['startRow'])) { $startRow = $_SESSION['startRow']; $file_handle = fopen("file.html", "a"); }
else { $startRow = 1; $file_handle = fopen("file.html", "w"); fwrite($file_handle, "<table border=\"1\">". "\n"); }
$inputFileType = 'Excel2007';
$aSheet = PHPExcel_IOFactory::createReader($inputFileType);
$aSheet->setReadDataOnly(true);
$chunkSize = 20;
$chunkFilter = new chunkReadFilter();
$empty_value = 0;
$exit = false;
$aSheet->setReadFilter($chunkFilter);
$chunkFilter->setRows($startRow,$chunkSize);
$objPHPExcel = $aSheet->load($fileName);
$aSheets = $objPHPExcel->getActiveSheet();
$array = array();
foreach($aSheets->getRowIterator() as $row){
$cellIterator = $row->getCellIterator();
$item = array();
fwrite($file_handle, "<tr>". "\n");
foreach($cellIterator as $cell){
//array_push($item, iconv('utf-8', 'cp1251', $cell->getCalculatedValue()));
$value = $cell->getCalculatedValue();
array_push($item, $value);
$results = "<td title=\"startRow: ".$startRow."\">" . $value . "</td>";
fwrite($file_handle, $results . "\n");
}
fwrite($file_handle, "</tr>". "\n");
array_push($array, $item);
}
for ($i = $startRow; $i < $startRow + $chunkSize; $i++) //внутренний цикл по строкам
{
$values = trim(htmlspecialchars($aSheets->getCellByColumnAndRow(0, $i)->getValue())); //получаем первое знаение в строке
if ( empty($values) ) //проверяем значение на пустоту
$empty_value++;
if ($empty_value == 3) //после трех пустых значений, завершаем обработку файла, думая, что это конец
{
$exit = true;
echo "The End";
}
}
//$objPHPExcel->disconnectWorksheets();
//unset($aSheet);
$startRow += $chunkSize;
if (!$exit) { $_SESSION['startRow'] = $startRow; }
else { unset($_SESSION['startRow']); }
if (isset($_SESSION['startRow'])) { }
else { fwrite($file_handle, "</table>". "\n"); }
fclose($file_handle);
работает как раз с шагом по 20, но на выходе почему-то получаю такое Screenshot [prntscr.com]
по какой-то причине при каждом вызове хавает первую строку, если итераций 20 то все 20 раз он выведет пустую строку и потом кучу пустых
Запустил без ошибок так, но помоему он просто 1000 делит на 20 и 50 раз проходит по одному и тому же списку, хотя я думал что он будет шагать, никто не делал такие извращения?
Вроде так начало читать, но судя по значению $i оно не работает пошагово, в добавок ко всему ругается на
Call to undefined method PHPExcel_Worksheet::setReadFilter()
Нашёл setReadFilter в PHPExcel_Reader_Abstract, но почему его не видит PHPExcel_Worksheet в упор не пойму.
require_once './Classes/PHPExcel/IOFactory.php';
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
session_start();
$fileName = 'file.xlsx';
if ($_SESSION['startRow']) $startRow = $_SESSION['startRow'];
else $startRow = 13;
//$inputFileType = 'Excel5';
$inputFileType = 'Excel2007';
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$chunkSize = 20;
$chunkFilter = new chunkReadFilter();
while ($startRow <= 65000) {
$chunkFilter->setRows($startRow,$chunkSize);
$objReader->setReadFilter($chunkFilter);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($fileName);
//Что-то с этими строками делаем
$startRow += $chunkSize;
$_SESSION['startRow'] = $startRow;
unset($objReader);
unset($objPHPExcel);
}
echo "The End";
unset($_SESSION['startRow']);
А оно ругается на
Notice: Undefined variable: objReader in /var/www/!!!!/data/www/!!!!/excel_reader.php on line 44 Fatal error: Call to a member function setReadFilter() on a non-object in /var/www/!!!/data/www/!!!!/excel_reader.php on line 44
Смотрю в код, вроде все ровно, а как запустить хз, мож кто подскажет где туплю
showValues создает кнопку Купить, в html уже есть select с выбором параметров, при изменении в нем значении #selectsize определяет их и заменяет в кнопке купить data-fancybox-href, но прикол в том что делает это оно все максимум 1 раз после загрузки страницы. После того как кнопка Купить нажал, data-fancybox-href больше не заменяется и добавляется в корзину с тем же размером что и ранее. Хотя судя по экспектору кода в FF оно меняет значение, но в корзину упорно идет то что было первое добавлено. Оно как-то не так дружит с fancybox?
$(document).ready(function() {
function showValues() {
var idquantity = $("input[name='cart_quantity']").val();
var idfield = $("input[name='products_id']").val();
var idvalue = $("#selectsize").val();
var idname = $("#selectsize").attr('name');
$("#addtocart").append('<button class="btn btn-lg btn-primary" id="addcart" data-fancybox-type="iframe" data-fancybox-href="index.php?products_id='+idfield+'&cart_quantity='+idquantity+'&action=add_product&'+idname+'='+idvalue+'"><span class="glyphicon glyphicon-shopping-cart"></span> Купить</button>');
return false;
}
showValues();
$("#selectsize").change(function(){
var idquantity = $("input[name='cart_quantity']").val();
var idfield = $("input[name='products_id']").val();
var idvalue = $("#selectsize").val();
var idname = $("#selectsize").attr('name');
$("#addcart").attr('data-fancybox-href', 'index.php?products_id='+idfield+'&cart_quantity='+idquantity+'&action=add_product&'+idname+'='+idvalue+'');
});
$("#addcart").fancybox();
...
Выдает мне такое фаталити:
Fatal error: Call to a member function display_price() on a non-object in /ajax.base.php on line 35
function search_in_base($manufacturers_id, $value, $languages_id) {
...
$currencies->display_price(tep_xppp_getproductprice($search['products_id']), tep_get_tax_rate($search['products_tax_class_id']))
...
}
Что самое примечательное затеял я всю эту идею, чтобы не повторять один и тот же код, который без функции отлично работает, а в функции на том же месте не хочет.
Я как бы мысленно понимаю, что проблема в каком-то наследовании $currencies->..., порылся почитал советы типо должно быть $this->display_price... но т.к. я собака, не могу понять ничего.
Есть у кого нибудь кость бросить в меня?