Слишком много статей? - PullRequest
       2

Слишком много статей?

0 голосов
/ 25 октября 2011

Я написал довольно грязную функцию, которая возвращает 3 поля в зависимости от того, совпадают ли они с другими полями. Он имеет 3 результата, основанных на конечном результате, он вернет результат 2.

public function ListRoomTotals($room, $date, $dateTo = null) {

    // If dateTo hasn't been set, make it now

    if(!isset($dateTo) or $dateTo == "") {

        $dateTo = $date;

    }

    // Return an array with each bundle number and the quantity for each day

    $scanner = $this->GetScannerNumber($room);

    $sql = "SELECT * FROM `scanners` WHERE `Scanner` IN (";

        foreach($scanner as $x) {

            $sql .= $x . ",";

        }

    $sql .= "0)

            AND `Date` BETWEEN '" . $date . "' AND '" . $dateTo . "'

            GROUP BY `KordNo`, `BundleNumber`;";

    $result = mysql_query($sql);

    while($row = mysql_fetch_array($result)) {

        $sql = "SELECT `BundleReference`, `QtyIssued`, `WorksOrder`,

                FROM `ArchiveBundle`

                WHERE `KordNo` = '" . $row['KordNo'] . "'

                AND `BundleNumber` = '" . $row['BundleNumber'] . "';";

        $result2 = mysql_query($sql);

        while($row = mysql_fetch_array($result2)) {

        $sql = "SELECT `ArchiveBundle`.`QtyIssued`, `ArchiveBundle`.`WorksOrder`,

                        `ArchiveBundle`.`Colour`, `ArchiveBundle`.`Size`

                FROM `ArchiveBundle`

                WHERE `ArchiveBundle`.`KordNo` = '" . $x['KordNo'] . "' AND

                  `ArchiveBundle`.`BundleNumber` = '" . $x['BundleNumber'] . "';";

        $result3 = mysql_query($sql);
                        $row = mysql_fetch_row($result3);   


           // Now we need to query what the product group is

        $sql = "SELECT `Stock`.`ProductGroup`

            FROM `Stock`, `TWOrder`

            WHERE `TWOrder`.`WorksOrderNumber` = '" . $row[1] . "' AND

                `TWOrder`.`Colour` = '" . $row[2] . "' AND

                `TWOrder`.`Size` = '" . $row[3] . "' AND

                `Stock`.`ProductCode` = `TWOrder`.`Product`;";



        $result4 = mysql_query($sql);

        $row2 = mysql_fetch_row($result4);

        if(in_array($row2[0], array(50, 100, 150, 300 , 350 , 925 ,930, 940)))

        {


        while($row = mysql_fetch_array($result2)) {

            if($row[0] != "") {

                $final[] = $row;

            } else {

                $final[] = array("Can't find bundle number", "N/A");

            }

        }

    }

    return $final;

   }

У меня есть цикл for, использующий функцию на странице, как показано ниже.

 $result = $scanner->ListRoomTotals($_GET['room'], $_GET['date']);

            $total = 0;

            foreach($result as $x) {

                $content .= "<tr>

                    <td>" . $x[0] . "</td>

                    <td>" . $x[1] . "</td>

                </tr>";
                                    $total += $x[1];

            }

            $weeklyTotal += $total;

            $content .= "<tr><td>Total Pairage:</td><td>" . $total . "                    </td></tr>

                    <tr><td>Total Dozens:</td><td>" .      number_format($total/12,2) . "</td></tr></table>

        </td>

Я знаю, что это, вероятно, очень плохо написано, потому что это главная причина, по которой ничего не возвращается правильно. Есть ли у кого-нибудь совет, возможно, разделить его. Я довольно простой в php, так что мое понимание этого плохое. Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Форматирование вашего кода очень затрудняет просмотр происходящего.

После очистки кажется, что вы выполняете серию запросов SQL, каждый из которых зависит от предыдущего. Было бы гораздо разумнее выполнить один запрос с использованием JOIN, чтобы получить доступ к нужным данным.

Кроме того, вы делаете два запроса

 $sql = "SELECT `BundleReference`, `QtyIssued`, `WorksOrder`,
         FROM `ArchiveBundle`
         WHERE `KordNo` = '" . $row['KordNo'] . "'
           AND `BundleNumber` = '" . $row['BundleNumber'] . "';";

и

 $sql = "SELECT `ArchiveBundle`.`QtyIssued`, `ArchiveBundle`.`WorksOrder`,
                `ArchiveBundle`.`Colour`, `ArchiveBundle`.`Size`
         FROM `ArchiveBundle`
         WHERE `ArchiveBundle`.`KordNo` = '" . $x['KordNo'] . "' 
           AND `ArchiveBundle`.`BundleNumber` = '" . $x['BundleNumber'] . "';";

, которые кажутся излишними.

Кроме того, здесь вы ссылаетесь на $x, но $x была просто индексной переменной, используемой для создания списка сканеров через запятую; Я сомневаюсь, что ты это имел в виду.

Мой совет таков: выясните, какую информацию вы пытаетесь извлечь из БД, составьте правильный SQL для этого запроса данных и затем перейдите оттуда.

Из вашего кода я думаю запрос, который вам нужен:

   SELECT `scanners`.*, ArchiveBundle`.`QtyIssued`, `Stock`.`ProductGroup`
    FROM `Stock` INNER JOIN `TWOrder` ON 
                    `Stock`.`ProductCode` = `TWOrder`.`Product`
                 INNER JOIN `ArchiveBundle` ON
                    `TWOrder`.`WorksOrderNumber` = `ArchiveBundle`.`WorksOrder` AND
                    `TWOrder`.`Colour` = `ArchiveBundle`.`Colour` AND
                    `TWOrder`.`Size` = `ArchiveBundle`.`Size`
                 INNER JOIN `scanners` ON
                    `ArchiveBundle`.`KordNo` = `scanners`.`KordNo` AND 
                    `ArchiveBundle`.`BundleNumber` = `scanners`.`BundleNumber`
    WHERE `scanners`.`Scanners` IN (?...?)";
0 голосов
/ 25 октября 2011

Я внес пару небольших изменений в ваш код и удалил большую часть ненужных пробелов. Мой совет - разбить функцию ListRoomTotals на более мелкие функции. Например, getScanners может быть перемещен в свою собственную функцию. Таким образом, вместо того, чтобы вкладывать функцию, основанную на результатах, вы разбиваете каждую подзадачу на меньшую функцию. Также в вашем запросе у вас есть SELECT *. Это также проблема производительности, если вам нужны только два или три поля. Вы также можете выполнить рефакторинг ваших запросов.

public function ListRoomTotals($room, $date, $dateTo = null) {
    // If dateTo hasn't been set, make it now
    if(!isset($dateTo) || $dateTo == "") { //<-- Replaced or with ||
        $dateTo = $date;
    }

    // Return an array with each bundle number and the quantity for each day
    $scanner = $this->GetScannerNumber($room);
    $sql = "SELECT * FROM `scanners` WHERE `Scanner` IN (".implode(',', $scanner);

    // replace foreach loop with implode
    //foreach($scanner as $x) {
    //  $sql .= $x . ",";
    //}

    $sql .= "0)
    AND `Date` BETWEEN '" . $date . "' AND '" . $dateTo . "'
    GROUP BY `KordNo`, `BundleNumber`;";

    $result = mysql_query($sql);

    while($row = mysql_fetch_array($result)) {
        $sql = "SELECT `BundleReference`, `QtyIssued`, `WorksOrder`,
        FROM `ArchiveBundle`
        WHERE `KordNo` = '" . $row['KordNo'] . "'
        AND `BundleNumber` = '" . $row['BundleNumber'] . "';";

        $result2 = mysql_query($sql);

        while($row = mysql_fetch_array($result2)) {     
            $sql = "SELECT `ArchiveBundle`.`QtyIssued`, `ArchiveBundle`.`WorksOrder`,
            `ArchiveBundle`.`Colour`, `ArchiveBundle`.`Size`
            FROM `ArchiveBundle`
            WHERE `ArchiveBundle`.`KordNo` = '" . $x['KordNo'] . "' AND
            `ArchiveBundle`.`BundleNumber` = '" . $x['BundleNumber'] . "';";

            $result3 = mysql_query($sql);
            $row     = mysql_fetch_row($result3);

            // Now we need to query what the product group is
            $sql = "SELECT `Stock`.`ProductGroup`
            FROM `Stock`, `TWOrder`
            WHERE `TWOrder`.`WorksOrderNumber` = '" . $row[1] . "' AND
            `TWOrder`.`Colour` = '" . $row[2] . "' AND
            `TWOrder`.`Size` = '" . $row[3] . "' AND
            `Stock`.`ProductCode` = `TWOrder`.`Product`;";

            $result4 = mysql_query($sql);
            $row2    = mysql_fetch_row($result4);

            if(in_array($row2[0], array(50, 100, 150, 300 , 350 , 925 ,930, 940))) {
                while($row = mysql_fetch_array($result2)) {
                    if($row[0] != "") {
                        $final[] = $row;
                    } else {
                        $final[] = array("Can't find bundle number", "N/A");
                    }
                }
            }
            return $final;
        }
    }
}

и

$result = $scanner->ListRoomTotals($_GET['room'], $_GET['date']);
    $total = 0;

    foreach($result as $x) {
        $content .= "<tr>
            <td>" . $x[0] . "</td>
            <td>" . $x[1] . "</td>
        </tr>";
        $total += $x[1];
    }
    $weeklyTotal += $total;
    $content .= "<tr><td>Total Pairage:</td><td>".$total."                    </td></tr>
            <tr><td>Total Dozens:</td><td>".number_format($total/12,2)."</td></tr></table>
</td>"; //<-- adding the closing double quote

UPDATE:

Не уверен, где определяются:

$x['KordNo']
$x['BundleNumber']

Вы имели в виду

$row['KordNo']
$row['BundleNumber']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...