显示时从数组中获取数据非常慢

时间:2012-07-21 12:50:47

标签: php foreach mysqli

这是我的代码:

    <?php

        if(isset($_POST['submit']) & !empty($_POST['appid'])) {

        $app = mysql_real_escape_string($_POST['appid']);

        //database parameters

        $conp = mysqli_connect($hostname, $user, $password, $database) or die('error in connection' . mysqli_error());

        //actual data for appid's

        $appsi = mysqli_query($conp, "SELECT distinct package_name FROM `user_app` where `app_id` = '$app'");

        $all = array();

        while($row = mysqli_fetch_assoc($appsi)) {

        $all[] = $row["package_name"]; // array problem

    }


    foreach ($all as $value) {

        $install = mysqli_query($conp, "SELECT COUNT(*) AS installs from `install` where package_name = '$value'");

        $row = mysqli_fetch_assoc($install);
        $data[] =  '<b>' .$row["installs"] . '</b>';


        $reg = mysqli_query($conp, "SELECT COUNT( DISTINCT `imei_num` ) AS reg FROM `user_app` WHERE package_name = '$value'");

$row = mysqli_fetch_assoc($reg);

$regd[] =  '<b>' .$row["reg"] . '</b>';

    }



 }

    mysqli_close($conp);

    ?>



    <html>
    <head>

        <title>script</title>

    </style>
    </head>

    <body>

    <span style="text-align: center"><h1>Beta</h1></span>


        <form name="query" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">

        <p>Enter Application-Specific Id:</p> 

        <select name='appid'>

        <?php 

        $conp = mysqli_connect($hostname, $user, $password, $database) or die('error in connection' . mysqli_error());

        $getid = mysqli_query($conp, "SELECT distinct `app_id`, `appidt` from `user_app` group by `app_id`") or die('get data failed' . mysqli_error());

            while(($row = mysqli_fetch_assoc($getid)) != null)  {

                echo "<option value = '{$row['app_id']}' selected = 'selected'";

                    if ($selected == $row['app_id']) {

                        echo "selected = 'selected'";

                    }

                echo ">{$row['appidt']}</option>";
            }

    mysqli_close($conp);

    ?>

        </select>



        <p><input type="submit" name="submit" value="Go" /></p>

        </form>

        <div>

            <p><?php echo '<br />' .'<b>'. 'Application Id : '. $app . '</b>'; ?> </p>
            <hr />
            <table border=2px width=100%>
                <tr>
                    <th><b>App Packages</b></th>
                    <th><b>Registrations</b></th>
                    <th><b>Installs</b></th>
                </tr>


                <tr>
                    <td><?php echo implode("<br><br>", $all); ?></td>
                    <td align="center"><?php echo implode("<br><br>", $regd); ?></td>
                    <td align="center"><?php echo implode("<br><br>", $data); ?></td>
                </tr>

            </table>

            <p><?php echo "$name"; ?></p>

        </div>

    </body>
    </html>

我在一个数组中获取我的所有包名:all [],包在范围内可能是10或20,之后我想要所有下载对应于另一个表名downloads和包上的包另一张表app_packages

我不能使用join,因为package table包含特定的包,但是下载包含许多与包对应的下载。

所以,我将所有包放在所有[]并在foreach循环名称$ value中使用它们,现在我得到每个包的所有安装,我可以通过implode函数显示它。但是在我的前端,当我从下拉列表中选择appid时,你需要花费大量时间来检索每个包的下载数量。这不是我想要展示的,因为它是非常耗时的。

请看这个问题,如果我在解释中遗漏了一些内容,那么我道歉,提示我并提及它。

1 个答案:

答案 0 :(得分:1)

在循环中使用查询是个坏主意。这就是你得出缓慢结果的原因。它会在每次迭代时触及数据库。您可以使用子查询或以其他方式加入。