Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在foreach()中优化SQL查询_Php_Android_Foreach - Fatal编程技术网

Php 在foreach()中优化SQL查询

Php 在foreach()中优化SQL查询,php,android,foreach,Php,Android,Foreach,我有一个Android应用程序,它是一个虚拟商店 在这个应用程序中,我查询了一个列表-->类别-->子类别-->产品。这里的问题是foreach中的优化 如何优化foreach Shop::setIdShop(Tools::getValue('boutique')); $cntxt = Context::getContext(); $cntxt->shop = new Shop(Tools::getValue('boutique')); $categorie = New Categor

我有一个Android应用程序,它是一个虚拟商店

在这个应用程序中,我查询了一个
列表-->类别-->子类别-->产品
。这里的问题是
foreach
中的优化

如何优化foreach

Shop::setIdShop(Tools::getValue('boutique'));
$cntxt =  Context::getContext();
$cntxt->shop = new Shop(Tools::getValue('boutique'));

$categorie = New Category(Tools::getValue('id_category')); 

   $result_product_count = Db::getInstance()->ExecuteS('
     SELECT COUNT(p.`id_product`) as totalProducts
     FROM `'._DB_PREFIX_.'product` p , `'._DB_PREFIX_.'product_shop` ps
     WHERE p.`active` = 1
     AND p.`id_product` = ps.`id_product`
     AND ps.`id_shop` = '.$cntxt->shop->id);
     $count = $result_product_count[0]['totalProducts'];



$promos = Product::getPricesDrop($id_lang = 1, $page_number = 0, $nb_products = $count, $count = false,
$order_by = null, $order_way = null, $beginning = false, $ending = false,  $context = $cntxt);

$products = $categorie->getProducts($context->language->id,0,$result_product_count[0]['totalProducts'] , null ,null , false , $active = true, $random = false, $random_number_products = 1, $check_access = true, $context = $cntxt);

$sql_gestion_stock = 'SELECT value FROM `ps_configuration` WHERE name="PS_STOCK_MANAGEMENT" AND id_shop="'.$cntxt->shop->id.'"';
$result_gestion_stock = Db::getInstance()->ExecuteS($sql_gestion_stock);

$sql_order_stock = 'SELECT value FROM `ps_configuration` WHERE name="PS_ORDER_OUT_OF_STOCK" AND id_shop="'.$cntxt->shop->id.'"';
$result_order_stock = Db::getInstance()->ExecuteS($sql_order_stock);

$resultat = array();
$row = array();


foreach($products as $p)
{
    $prod = new Product($p['id_product']);

    $order_out_of_stock = Configuration::get('PS_ORDER_OUT_OF_STOCK','','',$cntxt->shop->id);
    $stock_management = Configuration::get('PS_STOCK_MANAGEMENT','','',$cntxt->shop->id);
    $sql_stock = 'SELECT out_of_stock FROM ' ._DB_PREFIX_. 'stock_available WHERE id_product="'.$p['id_product'].'" AND id_shop="'.Tools::getValue('boutique').'"';
    $out_of_stock = Db::getInstance()->ExecuteS($sql_stock);
    $stock_dispo = $out_of_stock[0]['out_of_stock'];

    if( $stock_management == 0 ){
        $qty = 9999;
        $out_of_stock_mobile = 1;
    }
    else{
        if($stock_dispo == 0){
            $qty = $prod->getRealQuantity($p['id_product'],0,0,Tools::getValue("boutique"));
            $out_of_stock_mobile = 0;
        }
        elseif( $stock_dispo == 1 ){
            $qty = 9999;
            $out_of_stock_mobile = 1;
        }
        elseif( $stock_dispo == 2 ){
            if($order_out_of_stock == 1){
                $qty = 9999;
                $out_of_stock_mobile = 1;
            }
            else{
                $qty = $prod->getRealQuantity($p['id_product'],0,0,Tools::getValue("boutique"));
                $out_of_stock_mobile = 0;
            }
        }
    }

    $link = New Link();
    $img='';
    $imgLink = '';
    if (count($prod->getImages($cntxt->language->id ,$context = $cntxt ))>0) {
    $imgCover = Product::getCover($prod->id, $context = $cntxt);
    $imgLink = $link->getImageLink($prod->link_rewrite[1] , $imgCover["id_image"] , 'medium_default');
    $imgLink = 'http://'.$imgLink; 
    $largeImgLink = $link->getImageLink($prod->link_rewrite[1] , $imgCover["id_image"] , 'large_default');
    $largeImgLink = 'http://'.$largeImgLink; 
    }
    $row['hasSold']= 0; 
    if (count(promos)>0) {
        foreach($promos as $promo)
        {

            if ($promo['id_product'] == $p['id_product']) {
            $rowProd = array('id_product' => $p['id_product'],'out_of_stock' => $prod->out_of_stock);
            $productProp = $prod->getProductProperties($id_lang = 1 , $rowProd , $context = $cntxt );
            $now = time();
            $date1 = strtotime($productProp["specific_prices"]["to"]);
            $diff = abs($date1 - $now);
             $tmp = $diff;
             $retour = array();
                $retour['second'] = $tmp % 60;

                $tmp = floor( ($tmp - $retour['second']) /60 );
                $retour['minute'] = $tmp % 60;

                $tmp = floor( ($tmp - $retour['minute'])/60 );
                $retour['hour'] = $tmp % 24;

                $tmp = floor( ($tmp - $retour['hour'])  /24 );
                $retour['day'] = $tmp;
            $row['hasSold']= 1; 
            $row['temps_restant']= $retour['day'].'j '.$retour['hour'].':'.$retour['minute'].':'.$retour['second'];
            }

        }
    }


    $row['image']= $imgLink; 
    $row['titre']=$prod->name["1"];
    $row['description']=strip_tags($prod->description["1"]);
    $row['largeImage']= $largeImgLink; 
    $images = $prod->getImages((int)$cntxt->language->id);
    $imagesmeduim=array();
    $imageslarge=array();
    $j=0;
    foreach($images as $i)
    {
        if (!$i['cover'])
        {
        $imgLink_list = $link->getImageLink($prod->link_rewrite[1] , $i["id_image"] , 'medium_default');
        $largeImgLink_list = $link->getImageLink($prod->link_rewrite[1] , $i["id_image"] , 'large_default');
        $imagesmeduim[$j]=$imgLink_list;
        $imageslarge[$j]=$largeImgLink_list;
        $j++;
        }
    }


    $row['qty']= $qty;
    $row['out_of_stock'] = $out_of_stock_mobile;
    $row['id_product']=$p['id_product'];
    $row['sous_titre']=strip_tags($prod->description_short["1"]);
    $row['prix_promotion']= (string)$prod->getPrice(true,NULL,2);
    $row['prix_orig']= Tools::ps_round((string)$prod->getPriceWithoutReduct(), 2);
    foreach ($row as $key => $value) {
        if ($value == NULL) {
            $row[$key]='';
        }
    }
    $row['images_meduim']= $imagesmeduim;       
    $row['images_large']= $imageslarge; 
    $resultat[]=$row;
}

echo json_encode($resultat);

}

我认为您不必在SQL查询中的from语句中使用两个表,而应该使用内部联接,因为它比

SELECT COUNT(p.`id_product`) as totalProducts
   FROM `'._DB_PREFIX_.'product` p 
   inner join `'._DB_PREFIX_.'product_shop` ps
   on p.`id_product` = ps.`id_product`
   WHERE p.`active` = 1
   AND ps.`id_shop` = '.$cntxt->shop->id);
我不明白你为什么用这个

$order_out_of_stock = Configuration::get('PS_ORDER_OUT_OF_STOCK','','',$cntxt->shop->id);
$stock_management = Configuration::get('PS_STOCK_MANAGEMENT','','',$cntxt->shop->id);
在foreach中,它会一直保持不变,所以也许你应该在foreach中完成它

----编辑----

所以也许你可以做一些其他的事情,比如不要用foreach做你的宣传

而不是

if (count(promos)>0) {
    foreach($promos as $promo)
{ 
   if ($promo['id_product'] == $p['id_product']) {

但是,如果您确实获得了大量数据和操作,我不确定服务器速度是否会发生变化。

您好,谢谢您的回答。我更新了我的代码,很抱歉。我有34个类别和1500个产品。通常情况下,我用32段来填写列表。与内部连接28个分段。是foreach的问题还是服务器速度的问题?再次感谢你,但是这个应用程序将是法语的,我也会说法语。同时再次感谢你的回答,或者从产品数量来看这是正常的?我认为产品数量不是问题。因为我有一些查询,大约40000行20个文件,我的页面加载时间不到5秒。所以这可能更多的是因为你的foreach做了太多的动作,或者你在一个动作中遇到了一些问题,花费了很多时间,或者只是你的浏览器花费了很多时间来显示你想要的东西。当您计算php脚本结束或页面显示的时间时?
if (count(promos)>0) {
    foreach($promos as $promo)
{ 
   if ($promo['id_product'] == $p['id_product']) {