|
|
|
|
<?php
// бонусный счёт
// Формула расчёта - 10% от суммы всех заказов с округлением
// запрос поля бонусов из БД
$points_res = mysql_query("SELECT * FROM inter_payment WHERE user_id = '".(int)$_SESSION['user_id']."' AND `state` = 'R'");
$points_num = mysql_num_rows($points_res);
echo "points_num = $points_num<br>";
$o_sum = 0;
if ($points_num > 0) {
for ($p = 1; $p <= $points_num; $p++) {
$points_obj = mysql_fetch_object($points_res);
$pr_price_arr = array();
$pr_price_arr = explode("_", trim($points_obj->prs, "_"));
$pr_count_arr = array();
$pr_count_arr = explode("_", $points_obj->count_);
for ($p2 = 0; $p2 < count($pr_price_arr); $p2++){
$o_sum += $pr_price_arr[$p2]*$pr_count_arr[$p2];
echo $pr_price_arr[$p2]." * ".$pr_count_arr[$p2]." = ".$o_sum."<br>";
}
}
}
$points_percent = 10;
$points = round($o_sum / 100 * $points_percent);
?>
|
В общем такая проблема: Если в заказе один товар то все верно высчитывает, а если товаров больше одног то считает не понятно что | |
|
|
|
|
|
|
|
для: maxim14
(04.04.2011 в 20:03)
| | Нужно больше подробностей, заказы хранятся в таблице inter_payment? Какова её структура? | |
|
|
|
|
|
|
|
для: cheops
(04.04.2011 в 22:04)
| | Структура таблицы:
CREATE TABLE IF NOT EXISTS `inter_payment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` enum('I','R','S','G','F','O') NOT NULL DEFAULT 'I',
`user_id` int(11) NOT NULL DEFAULT '0',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`payment` int(1) NOT NULL DEFAULT '2',
`wm_hash` varchar(8) NOT NULL DEFAULT '',
`LMI_SYS_INVS_NO` varchar(11) NOT NULL DEFAULT '',
`LMI_SYS_TRANS_NO` varchar(11) NOT NULL DEFAULT '',
`LMI_SYS_TRANS_DATE` varchar(17) NOT NULL DEFAULT '',
`LMI_PAYER_PURSE` varchar(13) NOT NULL DEFAULT '',
`LMI_PAYER_WM` varchar(12) NOT NULL DEFAULT '',
`name` varchar(300) NOT NULL,
`ids` varchar(400) NOT NULL,
`body` varchar(1000) NOT NULL,
`count_` varchar(1200) NOT NULL,
`prs` varchar(400) NOT NULL,
`tele` varchar(200) NOT NULL,
`dostavka` varchar(20) NOT NULL,
`cond` varchar(400) NOT NULL,
`times` varchar(100) NOT NULL,
`date_sel` varchar(100) NOT NULL COMMENT 'дата доставки',
`notele` tinytext NOT NULL,
`mtele` varchar(20) NOT NULL,
`nomtele` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=20 ;
|
| |
|
|
|
|
|
|
|
для: maxim14
(05.04.2011 в 05:42)
| | Вот в этих строках что хранится и в каком формате?
`count_` varchar(1200) NOT NULL,
`prs` varchar(400) NOT NULL,
|
PS Вообще можно было бы многих проблем избежать, если на каждую заказанную позицию в таблице приходилась бы одна строка. | |
|
|
|
|
|
|
|
для: cheops
(05.04.2011 в 12:08)
| | >Вот в этих строках что хранится и в каком формате?
>
`count_` varchar(1200) NOT NULL,
> `prs` varchar(400) NOT NULL,
|
>PS Вообще можно было бы многих проблем избежать, если на каждую заказанную позицию в таблице приходилась бы одна строка.
count 1;1;1
prs _1017__232__317_
Мне кажется проблема в том, что между цифрами стоит два подчеркивания | |
|
|
|
|
|
|
|
для: maxim14
(05.04.2011 в 17:03)
| | Тогда вместо explode() разумнее воспользоваться функцией preg_split() и разбить строки по регулярному выражению, включающему одно или большое количество подчеркиваний. | |
|
|
|
|
|
|
|
для: cheops
(05.04.2011 в 18:57)
| | >Тогда вместо explode() разумнее воспользоваться функцией preg_split() и разбить строки по регулярному выражению, включающему одно или большое количество подчеркиваний.
Извините! А не проще исправить код где заказы добавляются в базу, а то с этими функциями у меня еще туго
Заказал Вашу книгу Самоучитель PHP 5/6. Скажите по ней реально самому разобраться с PHP? | |
|
|
|
|
|
|
|
для: maxim14
(05.04.2011 в 19:04)
| | Это было бы самым лучшим вариантом, причем под каждую позицию в заказе отвести отдельную запись в таблице базе данных. В этом случае скорость и удобство работы многократно возрастают, так как именно на такой подход базы данных и были изначально ориентированы.
>Заказал Вашу книгу Самоучитель PHP 5/6. Скажите по ней реально самому разобраться с PHP?
Вполне, тем более вы уже делаете успехи в программировании. В любом случае, если что-то вызовет затруднения, их всегда можно будет разрешить тут на форуме. | |
|
|
|
|
|
|
|
для: cheops
(05.04.2011 в 20:51)
| | Премного благодарен! Сегодня пришло письмо с Озона, что книгу отправили. Ну просто (пока на больничном и много свободного времени) очень хочется попрактиковаться. Скажите пожалуйста - Можно обратится за помощью в переделке скрипта в движке где заносятся данные в базу данных? ( Я сам буду пытаться переделывать, а к Вам только за советом) Как у Вас хватает терпения на таких как я? | |
|
|
|
|
|
|
|
для: maxim14
(05.04.2011 в 21:15)
| | Вопросы только приветствуются, чем смогу - помогу :))) | |
|
|
|
|
|
|
|
для: cheops
(05.04.2011 в 21:40)
| | В скрипте который приведен выше нашел следующую ошибку -
скрипт из count вытаскивает сразу все данные вот так 1;1;1 А это количество каждого товара и он еденицы должен вытаскивать по очереди
пример работы скрипта
406 * 1;1;1 = 406
* = 406 и повторяет стоимость товара
744 * = 406
* = 406
294 * = 406
А вот знаний куда копать пока не хватает
вот в этой строке $pr_count_arr = explode("_", $points_obj->count_);
знак подчеркивания на точку с запятой пробовал менять - результата ноль | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 00:38)
| | В первую очередь нужно проконтролировать, разбивается ли строка $points_obj->count_ на массив, при помощи explode(), выведите дамп массива $pr_count_arr, в нем все элементы выглядят так, как вы ожидаете?
<?php
echo "<pre>";
print_r($pr_count_arr);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(06.04.2011 в 01:04)
| | Нет конечно! вот как выглядит:
Array
(
[0] => 1;1;1
)
А должно быть
Array
(
[0] => 1
)
(
[1] => 1
)
(
[2] => 1
)
Ну это я исправил заменив в строке $pr_count_arr = explode("_", $points_obj->count_); подчеркивание на точку с запятой но теперь с массива данные подставляются неверно
Array
(
[0] => 1
[1] => 1
[2] => 1
)
406 * 1 = 406
* 1 = 406 //вот эта строка лишняя получается, тут подставляется вторая запись с массива
744 * 1 = 1150 // тут подставляется третья запись с массива, а должна быть вторая
* = 1150 // и эта строка лишняя
294 * = 1150
* = 1150// тут должна быть сумма заказа 1444
Поэтому и не хватает еденичек | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 05:04)
| | >406 * 1 = 406
>* 1 = 406 //вот эта строка лишняя получается, тут подставляется вторая запись с массива
>744 * 1 = 1150 // тут подставляется третья запись с массива, а должна быть вторая
>* = 1150 // и эта строка лишняя
>294 * = 1150
>* = 1150// тут должна быть сумма заказа 1444
Здесь нужно больше подробностей, откуда эти значения и как они соотносятся с кодом? | |
|
|
|
|
|
|
|
для: cheops
(06.04.2011 в 10:24)
| | Эти значения ( то есть еденицы) заносятся в базу при оформлении заказа и означают количество каждого товара ( имеют формат 1;2;3) то есть первый товар 1 штука, второй товар 2 штуки, третий 3 штуки | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 15:21)
| | Хм... так они прямо вот с этими символами * и = хранятся в строках? | |
|
|
|
|
|
|
|
для: cheops
(06.04.2011 в 15:34)
| | нет, это уже скрипт подставляет, который в первом сообщении | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 16:54)
| | А теперь понял. Т.е. у вас получаются пустые переменные? Может тогда их просто проверять при помощи empty() и в зависимости от того, пустая переменная или нет осуществлять действие или пропускать итерацию цикла? Или это результат неправильного разбора? | |
|
|
|
|
|
|
|
для: cheops
(06.04.2011 в 17:04)
| | Вот это интересно:
пропускать итерацию цикла
Только знаний как обычно не хватает | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 17:28)
| | Обычно используют оператор continue - его вызов прекращает текущую итерацию цикла и заставляет цикл перейти к следующей. | |
|
|
|
|
|
|
|
для: cheops
(06.04.2011 в 17:50)
| | Спасибо! сейчас буду читать. Я еще просто в далёкие школьные годы писал программы на Бейсике тогда еще на синклер совместимом ZX-Spektrum 80 вот и путаюсь в синтаксисе php | |
|
|
|
|
|
|
|
для: maxim14
(06.04.2011 в 18:50)
| | Ну ничего, зато потом вы уже не будете путаться практически ни в чем, так как не С-подобных языков программирования практически уже не осталось. Когда освоите синтаксис одного С-подобного языка, изучить остальные (будь то ActionScript, Python, Java, C++, JavaScript, C#, Perl и т.д.) будет не в пример проще, так как большая часть языка будет вам уже знакома. | |
|
|
|