Прошу у вас совета, и если знаете где можно почитать литературку по данному вопросу, буду очень благодарен.
Вопрос касается автоматического пересчета, и как это реализовать.
У меня есть таблица, в которой есть какойто маршрут.
Вопрос заключается в том что после вывода данного маршрута, нужна возможность автоматического пересчета данных. Попробую обьяснить.
id doroga station prib stoyanka otpravka
1 40 Kiev 1010 5 1015 951
2 40 Lvov 1100 5 1105 951
3 40 Kitay 1200 15 1215 951
4 40 Lohvica 1300 1 1301 951
5 40 Odessa 1400 3 1403 951
Вот такие данные у меня в таблице. Это выводится расписание определенного маршрута.
Задача заключается в том что у меня есть переменная, в которой находится 30 минут на проезд от одной станции в другую. Нужно сделать так чтоб данная переменная прибавлялась к полю отправки, автоматически переходила по циклу к следующему полу (prib) и записывалась в это поле. Потом человек сам руками ставит время стоянки например 5 мин. и чтоб в поле (otpravka) подставлялась сумма
prib+stoyanka=otpravka
И снова чтоб сумма (otpravka) к ней прибалялась переменная в которой 30 мин, переходила по циклу ниже и подставлялась в поле ( prib ) - прибытие
Ну и чтоб по этому принципу так все стоянки прошол в зоне действия этого цикла.
Прошу у вас совета и если вы предложите вариант реализации или где можно почитать по этому вопросу информацию буду очень благодарен.
Спустя 27 минут, 28 секунд (20.12.2011 - 12:26) Панч написал(а):
Если я правильно понял, то поле `doroga` это номер маршрута.
И если таблица рассчитана для нескольких маршрутов, я бы добавил еще одно
поле `stnumber` и вписывал бы в него порядковый номер станции(это поможет при
работе с циклом). Потом делаем выборку по полю `doroga`, и сортируем ее по полю
`stnumber`, ну а дальше простая арифметика.
И если таблица рассчитана для нескольких маршрутов, я бы добавил еще одно
поле `stnumber` и вписывал бы в него порядковый номер станции(это поможет при
работе с циклом). Потом делаем выборку по полю `doroga`, и сортируем ее по полю
`stnumber`, ну а дальше простая арифметика.
Спустя 15 минут, 59 секунд (20.12.2011 - 12:42) kolyabis написал(а):
Впринципе вы правы. Надо попробовать, единственное на чем я теряюсь, это как указать скрипту чтоб он переходил по циклу на одну позицию ниже чтоб установить сумму которую мы получим. prib+stoyanka=otpravka
Спустя 1 час, 1 минута, 29 секунд (20.12.2011 - 13:44) Панч написал(а):
Наверное так
// Полученный массив из базы
$array = array(
0 => array(
"id" => 1,
"doroga" => 40,
"station" => "Kiev",
"prib" => 1010,
"stoyanka" => 5,
"otpravka" => 1015
),
1 => array(
"id" => 2,
"doroga" => 40,
"station" => "Lvov",
"prib" => 1100,
"stoyanka" => 5,
"otpravka" => 1105
)
);
for ($i=0; $i<count($array); $i++) {
if (0 == $i)
$prib = $array[$i]["prib"];
else
$prib = $newArray[$i-1]["otpravka"] + 30;
$stoyanka = $array[$i]["stoyanka"];
$otpravka = $prib + $stoyanka;
$newArray[$i] = array(
"id" => $array[$i]["id"],
"doroga" => $array[$i]["doroga"],
"station" => $array[$i]["station"],
"prib" => $prib,
"stoyanka" => $stoyanka,
"otpravka" => $otpravka
);
}
Спустя 2 дня, 20 часов, 31 минута, 7 секунд (23.12.2011 - 10:15) kolyabis написал(а):
Уважаемые разработчики. тему с массивами я немного пропустил, по этому прошу совета как мне сделать.
Вопрос который я ставил више, уже отпал, так как решил это подобным образом.
Все отрабатывает отлично, так как надо.
Но вот я столкнулся с проблемкой.
В переменную $return
попадает масив такого вида.
Array (
[0] => Array ( [0] => 1 [1] => 40 [2] => Kiev [3] => 1000 [4] => 45 [5] => 1045 [6] => 951 [7] => 1 )
[1] => Array ( [0] => 2 [1] => 40 [2] => Lvov [3] => 1045 [4] => 25 [5] => 1110 [6] => 951 [7] => 1 )
[2] => Array ( [0] => 3 [1] => 40 [2] => Kitay [3] => 1110 [4] => 30 [5] => 1140 [6] => 951 [7] => 1 )
[3] => Array ( [0] => 4 [1] => 40 [2] => Lohvica [3] => 1140 [4] => 12 [5] => 1152 [6] => 951 [7] => 1 )
[4] => Array ( [0] => 5 [1] => 40 [2] => Odessa [3] => 1152 [4] => 5 [5] => 1157 [6] => 951 [7] => 1 )
)
Мне надо вывести данные в переменные. Но так как там получилось несколько масивов, то у меня вопрос. Мне надо каждую строчку, а точнее массив, засунуть в промежуточную табличку. И засунуть в таком виде как показано в массиве. Но не получается занести в переменные. Подскажите пожалуйста.
Пробовал использовать функцию list() но что то не получилось, хотя делал как в мануале.
Вопрос который я ставил више, уже отпал, так как решил это подобным образом.
//Переменные с базы.
$id = $sql_row["id"];
$kod_dor = $sql_row["kod_dor"];
$station = $sql_row["station"];
$prib = $sql_row["prib"];
$ostanov = $sql_row["ostanov"];
$otpravka = $sql_row["otpravka"];
$num_train = $sql_row["num_train"];
$status = $sql_row["status"];
$arr[] = $sql_row;
echo "<form action=".$_SERVER['PHP_SELF']." method='post'>
<tr>
<td><input type='hidden' name='id' value=".$id.">".$id."</td>
<td><input type='hidden' name='kod_dor' value=".$kod_dor.">".$kod_dor."</td>
<td><input type='hidden' name='station' value=".$station.">".$station."</td>
<td><input type='edit' name='prib' value='".$prib."'></td>
<td><input type='edit' name='ostanov' value='".$ostanov."'></td>
<td><input type='edit' name='otpravka' value='".$otpravka."'></td>
<td><input type='hidden' name='num_train' value=".$num_train.">".$num_train."</td>
<td>
<input type='radio' name='status' value='0'>не учитывать<br />
<input type='radio' name='status' value='1'>учитывать
</td>
<td><input type='submit' class='button' value='Зберегти'></td>
</tr>";
echo "</form>";
}
echo "</table>";
//echo "";//<a href=http://update.php?prib=$prib&ostanov=$ostanov&otpravka=$otp ;ravka>Сохранить</td></tr>";
?><br /><br />
<?php
echo $start_time = $arr['0']['3'];
echo "<br />";
echo $current_time = mktime(intval(substr($start_time,0,2)), intval(substr($start_time,2,2)));
echo "<br />";
echo "<table border=\"1\">
<tr><td>ID</td>
<td>KOD_DOR</td>
<td>STANCIYA</td>
<td>PRIB</td>
<td>STOYANKA</td>
<td>OTPRAVKA</td>
<td>NUM_TR</td>
<td>STATUS</td></tr>";
$return = array();
foreach($arr as $value){
echo $tmp_time = intval(substr($value['4'],0,2))*60;
echo "<br />";
if ($value[7]){
$time1 = date('hi',$current_time);
$time2 = date('hi',$current_time + $tmp_time);
$return[] = array($value[0],$value[1],$value[2],$time1,$value[4],$time2,$value[6],$value[7]);
echo "<tr>
<td>" . $value[0] . "</td>
<td>" . $value[1] . "</td>
<td>" . $value[2] . "</td>
<td> $time1 </td>
<td>" . $value[4] . "</td>
<td> $time2 </td>
<td>" . $value[6] . "</td>
<td>" . $value[7] . "</td>
</tr>";
}else{
echo "<tr>
<td>" . $value[0] . "</td>
<td>" . $value[1] . "</td>
<td>" . $value[2] . "</td>
<td> - </td>
<td>" . $value[4] . "</td>
<td> - </td>
<td>" . $value[6] . "</td>
<td>" . $value[7] . "</td>
</tr>";
}
$current_time += $tmp_time;
}
echo "</table>";
echo "<br />";
print_r($return);
Все отрабатывает отлично, так как надо.
Но вот я столкнулся с проблемкой.
В переменную $return
попадает масив такого вида.
Array (
[0] => Array ( [0] => 1 [1] => 40 [2] => Kiev [3] => 1000 [4] => 45 [5] => 1045 [6] => 951 [7] => 1 )
[1] => Array ( [0] => 2 [1] => 40 [2] => Lvov [3] => 1045 [4] => 25 [5] => 1110 [6] => 951 [7] => 1 )
[2] => Array ( [0] => 3 [1] => 40 [2] => Kitay [3] => 1110 [4] => 30 [5] => 1140 [6] => 951 [7] => 1 )
[3] => Array ( [0] => 4 [1] => 40 [2] => Lohvica [3] => 1140 [4] => 12 [5] => 1152 [6] => 951 [7] => 1 )
[4] => Array ( [0] => 5 [1] => 40 [2] => Odessa [3] => 1152 [4] => 5 [5] => 1157 [6] => 951 [7] => 1 )
)
Мне надо вывести данные в переменные. Но так как там получилось несколько масивов, то у меня вопрос. Мне надо каждую строчку, а точнее массив, засунуть в промежуточную табличку. И засунуть в таком виде как показано в массиве. Но не получается занести в переменные. Подскажите пожалуйста.
Пробовал использовать функцию list() но что то не получилось, хотя делал как в мануале.
list($id, $kod_dor, $station, $prib, $ostanov, $otpravka, $num_train, $status) = $return;
Спустя 16 минут, 16 секунд (23.12.2011 - 10:31) killer8080 написал(а):
kolyabis
нужно циклом перебирать массив
нужно циклом перебирать массив
foreach($return as $row){
// выводим отдельную табличку
}
Спустя 4 дня, 1 час, 13 минут, 14 секунд (27.12.2011 - 11:45) kolyabis написал(а):
Продолжение данной темы. Надеюсь что кому то кто столкнется с подобной проблемкой эта тема поможет разобратся.
Продолжение темы заключается в том, чтоб увеличить простоту работы для пользователя, но из-за этого код будет менятся. По этому прошу снова совета.
Показываю тестовый вариант, так как в оригинале все делается под орокал, и там черт ногу сломит, так как таблица очень огромная, я обьеденил етот результат и в тестовом варианте вывел все в одну табличку.
Вот есть такой вариант.
http://af.attachmail.ru/cgi-bin/readmsg/1....chment&channel=
Тут получается вот что. Данные берутся с БД, и выводятся в таблицу. Эти данные в этой же таблице можно поменять и в конце каждой строки есть кнопка (сщхранить).
Далее после нажатия сохранить идет автоматический просчет 3-х полей.
1-е поле это ( прибытие ) и тут время прибытия
2-е поле это ( стоянка ) и тут минути, сколько стоит на станции
3-е поле это ( отправка ) и тут время отправки со станции
Вот по этим 3-м полям идет автоматический пересчет по всему массиву.
Все вроде отрабатывает как надо, все пересчиталось, записалось во временную таблицу ну и потом обновились данные в основной таблице.
Но это очень не удобно со стороны пользователя. Неудобно то что кнопка ( сохранить ) есть в конце каждого поля. Я бы хотел вот как реализовать. Чтоб все было бы так как я описал, только чтоб кнопка ( сохранить ) была одна, в конце формы, и если человек ввел данные в 1-е поле ( время прибытия ), а потом по ( chekbox ) отметил те станции которые не просчитывать, и нажал (сохранить), чтоб точно также прошел автоматический пересчет, только с учетом всех чекбоксов.
Так как на данный момент если я ввожу данные в 1-е поле ( время прибытия )
и везбе прохожу по ( чекбоксу ) то всеравно так не сохраняется, так как ( сохранить ) находится в каждом поле.
Подскажите пожалуйста где я ошибся, или направьте на путь истенный, светлой сторы)))
Вот код который был написан.
Продолжение темы заключается в том, чтоб увеличить простоту работы для пользователя, но из-за этого код будет менятся. По этому прошу снова совета.
Показываю тестовый вариант, так как в оригинале все делается под орокал, и там черт ногу сломит, так как таблица очень огромная, я обьеденил етот результат и в тестовом варианте вывел все в одну табличку.
Вот есть такой вариант.
http://af.attachmail.ru/cgi-bin/readmsg/1....chment&channel=
Тут получается вот что. Данные берутся с БД, и выводятся в таблицу. Эти данные в этой же таблице можно поменять и в конце каждой строки есть кнопка (сщхранить).
Далее после нажатия сохранить идет автоматический просчет 3-х полей.
1-е поле это ( прибытие ) и тут время прибытия
2-е поле это ( стоянка ) и тут минути, сколько стоит на станции
3-е поле это ( отправка ) и тут время отправки со станции
Вот по этим 3-м полям идет автоматический пересчет по всему массиву.
Все вроде отрабатывает как надо, все пересчиталось, записалось во временную таблицу ну и потом обновились данные в основной таблице.
Но это очень не удобно со стороны пользователя. Неудобно то что кнопка ( сохранить ) есть в конце каждого поля. Я бы хотел вот как реализовать. Чтоб все было бы так как я описал, только чтоб кнопка ( сохранить ) была одна, в конце формы, и если человек ввел данные в 1-е поле ( время прибытия ), а потом по ( chekbox ) отметил те станции которые не просчитывать, и нажал (сохранить), чтоб точно также прошел автоматический пересчет, только с учетом всех чекбоксов.
Так как на данный момент если я ввожу данные в 1-е поле ( время прибытия )
и везбе прохожу по ( чекбоксу ) то всеравно так не сохраняется, так как ( сохранить ) находится в каждом поле.
Подскажите пожалуйста где я ошибся, или направьте на путь истенный, светлой сторы)))
Вот код который был написан.
<?php
$dbuser="al";
$dbpass="111";
$dbname="train1220011"; //the name of the database
$chandle = mysql_connect("localhost", $dbuser, $dbpass)
or die("Connection Failure to Database");
echo "Connected to database server<br>";
mysql_select_db($dbname, $chandle) or die ($dbname . " Database not found." . $dbuser);
echo "Database " . $dbname . " is selected";
//mysql_close($chandle);
?>
<?php
//Данный запрос к основной таблице, из которой выводим существующие данные
$sql="Select * from train where kod_dor = 40 and num_train = 951";
$sql_result=mysql_query($sql,$chandle) or exit("Sql Error".mysql_error());
echo "<table width =\"80%\" bgcolor=\"#F5F5FF\" border=\"1\">";
echo "<tr>";
echo "<td><b>Id</b></td> <td><b>kod_dor</b></td> <td><b>station</b></td> <td><b>prib</b></td> <td><b>ostanov</b></td><td><b>otpravka</b></td ><td><b>num_train</b></td> <td>SOHRONIT</td>";
echo "</tr>";
//$arr = array();
while($sql_row = mysql_fetch_array($sql_result))
{
//Переменные с базы. Выводим циклом
$id = $sql_row["id"];
$kod_dor = $sql_row["kod_dor"];
$station = $sql_row["station"];
$prib = $sql_row["prib"];
$ostanov = $sql_row["ostanov"];
$otpravka = $sql_row["otpravka"];
$num_train = $sql_row["num_train"];
$status = $sql_row["status"];
//Создали переменную, в которую будет попадать многомерный массив, именно этот масив мы и будем обрабатывать
$arr[] = $sql_row;
//Тут идет отрисовка таблицы с формой, для изменения данных
echo "<form action=".$_SERVER['PHP_SELF']." method='post'>";
echo "<tr>";
echo "<td><input type='hidden' name='id' value=".$id.">".$id."</td>";
echo "<td><input type='hidden' name='kod_dor' value=".$kod_dor.">".$kod_dor."</td>";
echo "<td><input type='hidden' name='station' value=".$station.">".$station."</td>";
echo "<td><input type='edit' name='prib' value='".$prib."'></td>";
echo "<td><input type='edit' name='ostanov' value='".$ostanov."'></td>";
echo "<td><input type='edit' name='otpravka' value='".$otpravka."'></td>";
echo "<td><input type='hidden' name='num_train' value=".$num_train.">".$num_train."</td>";
echo "<td>";
$stat=strpos($status, "1");
if ($stat===false)
echo "<label><input type='checkbox' name='status' value='1' />учитывать</label><BR>";
else echo "<label><input type='checkbox' checked name='status' value='0' />учитывать</label><BR>";
//echo "<input type='radio' name='status' value='0'>не учитывать<br />";
//echo "<input type='radio' name='status' value='1'>учитывать";
echo "</td>";
echo "<td><input type='submit' class='button' value='Зберегти'></td>";
echo "</tr>";
echo "</form>";
}
echo "</table>";
?>
<?php
//Данная переменная, это мы выводим начальную точку времени с которой начинаем пересчет
$start_time = $arr['0']['3'];
echo "<br />";
//Данную переменную мы создали для определения метки времени чтоб правильно велся пересчет
$current_time = mktime(intval(substr($start_time,0,2)), intval(substr($start_time,2,2)));
echo "<br />";
//тут отрисовываем таблицу для отображения того что мы делаем
echo "<table border=\"1\">
<tr><td>ID</td>
<td>KOD_DOR</td>
<td>STANCIYA</td>
<td>PRIB</td>
<td>STOYANKA</td>
<td>OTPRAVKA</td>
<td>NUM_TR</td>
<td>STATUS</td></tr>";
//Эту переменную мы создали для того чтоб в неё попадали данные поле пересчета и формировались как массив
$return = array();
//Этим циклом мы отрисовываем пересчет
foreach($arr as $value){
//В данную переменную мы кладем метку времени стоянки на станции
$tmp_time = intval(substr($value['4'],0,2))*60;
echo "<br />";
//от этого места мы начинаем отрисовывать таблицу и проверять условиями данные.
if ($value[7]){
//Эта переменная, это начальное время ( тоесть время прибытия на станцию )
$time1 = date('hi',$current_time);
//Эта переменная, в неё ложится время отправки со станции
$time2 = date('hi',$current_time + $tmp_time);
//Тут формируется массив данных с пересчетом
$return[] = array($value[0],$value[1],$value[2],$time1,$value[4],$time2,$value[6],$value[7]);
//Это отрисовка таблицы из условия. Что если есть все данные и все станции то отрисовка этой таблицы
echo "<tr>
<td>" . $value[0] . "</td>
<td>" . $value[1] . "</td>
<td>" . $value[2] . "</td>
<td> $time1 </td>
<td>" . $value[4] . "</td>
<td> $time2 </td>
<td>" . $value[6] . "</td>
<td>" . $value[7] . "</td>
</tr>";
}else{
//Тут отрисовывается таблица с условием, если в таблице нет времени прибытия и времени отправки
echo "<tr>
<td>" . $value[0] . "</td>
<td>" . $value[1] . "</td>
<td>" . $value[2] . "</td>
<td> - </td>
<td>" . $value[4] . "</td>
<td> - </td>
<td>" . $value[6] . "</td>
<td>" . $value[7] . "</td>
</tr>";
}
$current_time += $tmp_time;
}
echo "</table>";
echo "<br />";
//print_r($return);
echo "<br />";
//Таким циклом мы заносим данные в промежуточную таблицу, чтоб отструктурировать данные по порядку.
foreach($return as $row){
// выводим отдельную табличку
$result = mysql_query("INSERT INTO vremenaya (`id_v`, `kod_dor`, `station`, `prib`, `ostanov`, `otpravka`, `num_train`, `status`)
VALUES ('".mysql_real_escape_string($row['0'])."',
'".mysql_real_escape_string($row['1'])."',
'".mysql_real_escape_string($row['2'])."',
'".mysql_real_escape_string($row['3'])."',
'".mysql_real_escape_string($row['4'])."',
'".mysql_real_escape_string($row['5'])."',
'".mysql_real_escape_string($row['6'])."',
'".mysql_real_escape_string($row['7'])."'
)");
if ($result=='true'){
echo "Вы успешно добавиле данные.";
}else{
echo exit ("Ошибка! Данные не добавлены.");
}
}
?>
<?php
//в этом месте мы начинаем обновление данных с промежуточной таблицы в основную
$sqll="update train t, vremenaya v set t.prib=v.prib, t.ostanov=v.ostanov, t.otpravka=v.otpravka, t.status=v.status where t.id=v.id_v ";
$sql_result=mysql_query($sqll,$chandle) or exit("Sql Error".mysql_error());
//В этом месте мы отчищаем данные из промежуточной таблицы, чтоб освободить данные для новых.
$sqlll="DELETE FROM vremenaya";
$sql_result=mysql_query($sqlll,$chandle) or exit("Sql Error".mysql_error());
?>
<br />
<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
echo $id = $_POST['id'];
echo $prib = $_POST['prib'];
echo $ostanov = $_POST['ostanov'];
echo $otpravka = $_POST['otpravka'];
echo $status = $_POST['status'];
$sqll="update train set prib='$prib', ostanov='$ostanov', otpravka='$otpravka', status='$status' where id=$id";
$sql_result=mysql_query($sqll,$chandle) or exit("Sql Error".mysql_error());
}
?>
Спустя 2 часа, 19 минут, 17 секунд (27.12.2011 - 14:04) kolyabis написал(а):
Вопрос который меня интересовал, уже решил, и чтоб не оставлять данную тему не законченной, опишу что было сделано.
Впринципе, весь код остается не изменным, за исключением одного.
Был у нас вот такой код.
Заменил несколько строк.
Ну первое что надо изменить, это вывод кнопки в цикле таблицы. Её надо вынести за цикл, чтоб данная кнопка не отрисовывалась столько раз сколько записей нашлось в БД.
Второе, это нужно каждому элементу в форме установить состояние массива.
ну и самое главное что надо дописать, это вот так.
Ну и в таком варианте все отрабатывает как надо.
Надеюсь что данная тема кому то поможет. Так как мне пришлось разбиратся самому.
Единственное персональное спасибо это ( killer8080 )
Впринципе, весь код остается не изменным, за исключением одного.
Был у нас вот такой код.
<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
echo $id = $_POST['id'];
echo $prib = $_POST['prib'];
echo $ostanov = $_POST['ostanov'];
echo $otpravka = $_POST['otpravka'];
echo $status = $_POST['status'];
$sqll="update train set prib='$prib', ostanov='$ostanov', otpravka='$otpravka', status='$status' where id=$id";
$sql_result=mysql_query($sqll,$chandle) or exit("Sql Error".mysql_error());
}
?>
Заменил несколько строк.
Ну первое что надо изменить, это вывод кнопки в цикле таблицы. Её надо вынести за цикл, чтоб данная кнопка не отрисовывалась столько раз сколько записей нашлось в БД.
Второе, это нужно каждому элементу в форме установить состояние массива.
<input type='edit' name='prib[]' value='".$prib."'></td>";
ну и самое главное что надо дописать, это вот так.
<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
$id = $_POST['id'];
$prib = $_POST['prib'];
$ostanov = $_POST['ostanov'];
$otpravka = $_POST['otpravka'];
$status = $_POST['status'];
for($i=0; $i<$id; $i++){
$sqll="update train set prib='".$prib[$i]."', ostanov='".$ostanov[$i]."', otpravka='".$otpravka[$i]."', status='".$status[$i]."' where id=".$id[$i]."";
$sql_result=mysql_query($sqll,$chandle) or exit("Sql Error".mysql_error());
}
}
?>
Ну и в таком варианте все отрабатывает как надо.
Надеюсь что данная тема кому то поможет. Так как мне пришлось разбиратся самому.
Единственное персональное спасибо это ( killer8080 )