В то время как Цикл в Цикле Пока Цикл - я должен использовать Цикл Foreach? - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь получить данные из нескольких таблиц в MySQL (таблицы содержат данные опций для каждого элемента, доступного для покупки на моем сайте электронной коммерции). Значения извлекаются из сеанса корзины покупок следующим образом:

foreach($_SESSION['cart'] as $id => $data)
            {

            // Calulate total for each item
            $subtotal = $data['quantity'] * $data['price'];
            $total += $subtotal;

            // This gets the Cart sessions unique ID, so I can get the options from the database using it!
            $sessionidforoptions = $data['uniquesessid'];


            //Out put shopping cart data
            echo    "TABLE ROWS WITH EACH ITEM GO HERE (Product, Qty, Price for item etc...";

Затем я использую значение $ sessionidforoptions , чтобы получить параметры из базы данных:

// Get options IDs from Database
            foreach($_SESSION['sessionoptions'][$sessionidforoptions] as $id2 => $data2) { $$id2 = $data2; }

                if (isset($option1) && ($option1 != "")) { $list = $option1; }
                if (isset($option2) && ($option2 != "")) { $list .= ",".$option2; }
                if (isset($option3) && ($option2 != "")) { $list .= ",".$option3; }

// Query Database
$optionsquerysql = "SELECT * from productOptions WHERE productOptionsID IN ('". $list ."')";
$optionsresultsql= mysql_query($optionsquerysql) or die(mysql_error());

Затем выведите параметры:

while   ($optionssql = mysql_fetch_array($optionsresultsql)) {

                            $optionNamesID = $optionssql["optionNamesID"];
                            $optionValue = $optionssql["optionValue"];

                            // Get option names from databsae
                            $optionsnamesquerysql = "SELECT * from optionNames WHERE optionNamesID = ".$optionNamesID."";
                            $optionsnamesresultsql= mysql_query($optionsnamesquerysql) or die(mysql_error());

                                //Output options names + options
                                while   ($optionnamessql = mysql_fetch_array($optionsnamesresultsql)) {

                                        $optionName = $optionnamessql['optionName'];    
                                        echo $optionName.': '.$optionValue.'<br />';                            
                                }

                    }

Это почти работает! Сессия имеет 3 варианта для каждого элемента в корзине (размер, цвет и т. Д.)

Я получаю следующее:

Товар 1 - £ 20,00 Размер: маленький

Товар 2 - £ 22,00 Размер: средний

Позиция 3 - £ 45.00 Размер: Большой

Вот что я должен получить:

Товар 1 - £ 20,00 - Размер: маленький - Цвет: черный - Пояс: маленький

Товар 2 - £ 22,00 - Размер: средний - Цвет: синий - Пояс: средний

Товар 3 - £ 45.00 Размер: большой - Цвет: розовый - Пояс: большой

Как видите, последний цикл while выводит только первый параметр каждый раз

while   ($optionnamessql = mysql_fetch_array($optionsnamesresultsql)) { OPTION OUTPUT }

Должен ли я использовать foreach здесь вместо цикла while?

Действительно ценю любой совет, который кто-либо может предложить. Я понимаю, что мой код не очень чистый. Я все еще учусь ... Я сожалею об этом.

Спасибо за любой совет, который вы можете предложить

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Попробуйте напечатать значения $optionsquerysql и $optionsnamesquerysql во время циклического перебора ваших данных. Затем убедитесь, что операторы SQL выглядят так, как вы ожидаете. Наконец, скопируйте SQL и запустите его для базы данных напрямую, используя PHPMyAdmin, SQLYog или просто утилиту командной строки mysql. Убедитесь, что результаты, которые вы получите, соответствуют вашим ожиданиям.

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

UPDATE

Не думаю, что ваш запрос SELECT * from productOptions WHERE productOptionsID IN ('". $list ."') будет работать так, как вы ожидаете. Каким бы ни было значение $list, вы помещаете его в набор одинарных кавычек в строке SQL, поэтому MySQL будет рассматривать его как одно строковое значение, которое затем пытается преобразовать в целое число. Я подозреваю, что это твоя проблема. Попробуйте удалить одинарные кавычки, чтобы запрос был просто SELECT * from productOptions WHERE productOptionsID IN (". $list .").

В качестве примечания вы должны ознакомиться с атаками с использованием SQL-инъекций и убедиться, что вы дезинфицируете свои данные, прежде чем использовать их в запросах SQL.

1 голос
/ 01 марта 2011

Лично я использую только тогда, когда размер цикла не может быть предварительно рассчитан.

For-next - отличная вещь.

// редактировать //

базовый цикл for-next:

for($i=0;$i<10;$i++) {
  echo $i . '<br />';
}

сейчас, не всегда вы знаете, сколько раз вы можете пойти (без конечного значения), как при чтении кусков больших файлов. Тем не менее, наборы записей падают где-то посередине.

Чаще всего наборы записей не слишком велики и могут быть легко загружены в массив, как

$rs = array();
while ($rs[] = mysql_fetch_assoc($result));

Теперь $ rs содержит гибкий массив со всеми вашими записями, и вы можете выполнять вычисления, расширенные модификации полей или что-либо еще до вывода, все с для следующего ...

for($i=0;$i<sizeof($rs);$i++) {
  //creating a new 'field'
  $rs[$i]['Fullname'] = $rs[$i]['Firstname'] . ' ' . $rs[$i]['Lastname'];
}

На выходе просто повторить цикл с for-next

(Следующее слово не используется в php, поскольку это форма производного от C, просто '}'. Basic и Pascal используют его, однако)

redgards, // т

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