|
Przekazywanie danych za pomoc? foreach i implode
|
| przemokrosno |
Dodany dnia 31.07.2009 07:49:52
|

Przedszkolak

Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Witam.
Napisa?em skrypt który operuje na tablicy attendance (frekwencja) w bazie mysql w postaci:
---------------------------------------------------------------- --
| id | studentid | classid | lessons | date_absent |
---------------------------------------------------------------- --
Do pola lessons powinien wstawi? warto?ci pobrane z formularza (inputbox'ów) dla ka?dego studenta.
<?php
include '../includes/common.inc';
include '../includes/klasy.inc';
include '../includes/students.inc';
include '../includes/frekwencja.inc';
require_group(_TEACHER_GROUP);
define('_ATTENDANCE_DB_TABLE', $conf_settings['db_tblprefix'] . 'attendance');
if (isset($_GET['success'])) $success = success('Frekwencja', $_GET['success']);
if (!isset($_POST['class'], $_POST['toyear'], $_POST['tomonth'], $_POST['today'])) {
if (!isset($_GET['id'])) exit; }
page_header();
page_menu();
if (!isset($_GET['id'])) {
$absentdate = $_POST['toyear'] . '-' . $_POST['tomonth'] . '-' . $_POST['today'];
$classid = intval($_POST['class']);
$classinfo = classGetClassById($classid);
} else {
$absentdate = date('Y-m-d');
$classid = intval($_GET['id']);
$classinfo = classGetClassById($classid);
}
$confquery = 'SELECT * FROM `intra_config` WHERE `id`=1 ';
$confresult = mysql_query($confquery) or die(mysql_error());
$confrow = mysql_fetch_array($confresult);
$max=$confrow['lessonmax'];
// Wstawinie nieobecno?ci ------------------------------------------------------------------------
if ($_POST['todo'] == 'Wstaw') {
?>
<div id="content">
<h2>Wstawianie nieobecno?ci w klasie <?=$classinfo['name']?>, <?php echo $absentdate; ?></h2>
<div id="breadcrumb"><a href="<?=$conf_settings['site_url']?>">Strona g?ówna</a> -> <a href="/frekwencja/">Frekwencja</a> -> <em>Wstawianie nieobecno?ci</em></div>
<?php if ($success) echo "<strong class=\"success\">$success</strong>"; ?>
<div id="subnav">
<ul>
<li>
<form method="post" action="wstaw.php" class="search">
<label for="toyear">
<img src="/images/options/search.png"/>
Przejd? do:
</label>
<?php dateboxes(true, false); ?>
<label for="class">
Klasy:
</label>
<?php classSelectBox(); ?>
<input type="submit" name="submit" value="Przejd?" />
</form>
</li>
</ul>
</div>
<div style="clear: both;"></div>
<p>Umie?? znacznik obok ka?dego nieobecnego ucznia.</p>
<?php
$studentlist = classGetStudentsById($classid);
if (empty($studentlist)) {
?>
W tej klasie nie ma wpisanych uczniów. Aby zarz?dza? frekwencj?, musisz <a href="/klasy/addstudent.php">doda? uczniów do tej klasy</a>.
<?php
} else {
?>
<form method="post" action="take.php">
<table cellpadding="5" class="classlist">
<tr><th rowspan="2">ID ucznia</th><th rowspan="2">Imi?</th><th rowspan="2">Nazwisko</th><th rowspan="2">Nieobecny?</th><th colspan="<?=$max?>">Lekcje</th></tr>
<tr> <?php
for($j=0; $j < $max; $j++) {
echo "<th>";
$n=$j+1;
echo $n.'</th>';
}
echo '</tr>';
$i = 0;
foreach ($studentlist as $student)
{
$i++;
$studentinfo = studentGetStudentById(intval($student['studentid']));
if ($i % 2)
echo '<tr class="even">';
else
echo '<tr class="odd">';
echo '<td>'. $student['studentid'] .'</td>';
echo '<td>' . $studentinfo['firstname'] . '</td>';
echo '<td>' . $studentinfo['lastname'] . '</td>';
echo '<td><input type="checkbox" name="student['.$student['studentid'].']"/></td>';
for($j=1; $j <= $max; $j++) {
?> <td><input type="text" name="lessons[]" maxlength="1" size="1" class="inputbox" value="<?php if(isset($lessons[$j])) echo $lessons[$j];?>" /></td>
<?php }
echo '</tr>';
echo "\n";
}
echo '</table>';
}
?>
<input type="hidden" name="absentdate" value="<?=$absentdate?>" />
<input type="hidden" name="classid" value="<?=$classid?>" />
<input type="hidden" name="studentid" value="<?=$studentid?>" />
<input type="submit" name="todo" value="Wstaw" />
</form>
<!-- Koniec wstawiania nieobecno?ci -->
</div> <!-- content -->
<?php
page_footer();
?>
Kliknij i zaczekaj na załadowanie kodu ...
Kod pliku wstaw.php:
<?php
include '../includes/common.inc';
include '../includes/klasy.inc';
include '../includes/students.inc';
include '../includes/frekwencja.inc';
require_group(_TEACHER_GROUP);
if (!isset($_POST['classid'], $_POST['absentdate'])) { header('Location: /frekwencja/'); exit; }
$date = $_POST['absentdate'];
$classid = intval($_POST['classid']);
if (isset($_POST['student'])) {
foreach ($_POST['student'] as $studentid => $status) {
$query = "INSERT INTO `intra_attendance` VALUES ('', '".$classid."', '".$studentid."', '". $lessons = implode("|",$_POST['lessons'])."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
}
}
header('Location: /frekwencja/index.php?success=1');
exit;
?>
Kliknij i zaczekaj na załadowanie kodu ...
Który dla ka?dego nieobecnego studenta powinien pobra? warto?ci lessons jako nieobecno?ci. I wszystko jest w porz?dku (wszystko dzia?a i poprawnie przesy?a) je?li dodaj? warto?ci nieobecno?ci tylko dla jednego studenta. w przypadku kilku studentów ??czy wszystkie nieobecno?ci w jednym polu i dla ka?dego dodaje te same warto?ci do bazy danych czyli od pierwszego studenta do ostatniego zaznaczonego jako nieobecny. Je?eli kto? wie gdzie pope?ni?em b??d to bardzo prosz? o pomoc.
PW od moderatora:
- Zmiana nazwy tematu - Pieka 31.07 - 09:42
Edytowane przez przemokrosno dnia 31.07.2009 10:30:44
|
| |
|
|
| W?cibski Go?? |
Dodany dnia 26.10.2025 07:18:39
|
Pan Kontekstualny
Postów: n^x
Data rejestracji: Zawsze
|
|
| IP: localhost |
|
|
| kefirek |
Dodany dnia 31.07.2009 08:58:00
|

Zaawansowany

Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Po co ci tam implode ? Skoro wstawiasz klika rekordów w p?tli. Jakby? wstawia? jeden rekord to tak.
Proponuje tak
$ile = count($_POST['student']);
for ($lp=0; $lp<=$ile; $lp++) {
$query = "INSERT INTO `intra_attendance`
VALUES ('', '".$classid."', '".$_POST['student'][$lp]."', '".$_POST['lessons'][$lp]."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
}
Edytowane przez kefirek dnia 31.07.2009 09:39:05
|
| |
|
|
| przemokrosno |
Dodany dnia 31.07.2009 09:18:18
|

Przedszkolak

Postów: 11
Data rejestracji: 23.07.2009 08:01
|
kefirek napisa?/a:
Po co ci tam implode ? Skoro wstawiasz klika rekordów w p?tli. Jakby? wstawia? jeden rekord to tak.
Proponuje tak
$ile = count($_POST['student']);
for ($lp=0; $ile<=9; $lp++) {
$query = "INSERT INTO `intra_attendance`
VALUES ('', '".$classid."', '".$_POST['student'][$lp]."', '".$_POST['lessons'][$lp]."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
}
Implode s?u?y do po??czenia inputboxów w jeden rekord, które s? pobierane dla maksymalnej liczby lekcji ($max)czyli dla ka?dej lekcji jest osobny inputbox np. dla $max = 10 lekcji wi?c ??cze 10 inputboxów
Edytowane przez Pieka dnia 31.07.2009 09:42:37
|
| |
|
|
| kefirek |
Dodany dnia 31.07.2009 09:30:40
|

Zaawansowany

Postów: 1191 Pomógł: 418 Ostrzeżeń: 1
v6.00.xxx Data rejestracji: 06.04.2008 21:59
|
Ja wiem do czego jest implode. Czyli co wstawiasz do jednej kolumny o nazwie lessons klika warto?ci ?
$max = 10 lekcji wi?c ??cze 10 inputboxów
Czyli co do jednej kolumny chcesz wstawi? 10 warto?ci oddzielonych | z tego kodu co pod??e? tak to wynika.
Czyli wybieraj?c 10 studentów ka?dy otrzyma takie same dane w lessons.
Wiec zamiast p?tli foreach daj for
Czyli tak ten kod
foreach ($_POST['student'] as $studentid => $status) { $query = "INSERT INTO `intra_attendance` VALUES ('', '".$classid."', '".$studentid."', '". $lessons = implode("|",$_POST['lessons'])."', '".$date."')";
Zamieniasz na
$ile = count($_POST['student']);
for ($lp=0; $lp<=$ile; $lp++) {
$query = "INSERT INTO `intra_attendance`
VALUES ('', '".$classid."', '".$_POST['student'][$lp]."', '".$_POST['lessons'][$lp]."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
}
Edytowane przez kefirek dnia 31.07.2009 09:39:28
|
| |
|
|
| przemokrosno |
Dodany dnia 31.07.2009 16:34:28
|

Przedszkolak

Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Niestety ten sposób nie dzia?a.
My?la?em o zrobieniu takiej konstrukcji:
foreach ($studentlist as $student)
{
$i++;
$studentinfo = studentGetStudentById(intval($student['studentid']));
if ($i % 2)
echo '<tr class="even">';
else
echo '<tr class="odd">';
echo '<td>'. $student['studentid'] .'</td>';
echo '<td>' . $studentinfo['firstname'] . '</td>';
echo '<td>' . $studentinfo['lastname'] . '</td>';
echo '<td><input type="checkbox" name="student['.$student['studentid'].']"/></td>';
foreach ($student as $student_id=>$lessons){
for($j=1; $j <= $max; $j++)
{
?> <td><input type="text" name="lessons[]" maxlength="1" size="1" class="inputbox" value="<?php if(isset($lessons[$j])) echo $student_id => $lessons[$j];?>" /></td><?php
}
}
echo '</tr>';
echo "\n";
}
echo '</table>';
}
Kliknij i zaczekaj na załadowanie kodu ...
Tylko teraz pytanie jak przekaza? to wszystko do bazy. Je?li chodzi o samo zapytanie do bazy to by wygl?da?o co? takiego:
foreach ($_POST['student'] as $studentid => $status) { $query = "INSERT INTO `intra_attendance` VALUES ('', '".$classid."', '".$studentid."', '"$lessons = implode('|',$_POST['studentid']['lessons']), '".$date."')";
Kliknij i zaczekaj na załadowanie kodu ...
Edytowane przez przemokrosno dnia 31.07.2009 16:35:59
|
| |
|
|
| slawekneo |
Dodany dnia 31.07.2009 23:26:02
|

Bywalec

Postów: 915 Pomógł: 41
Data rejestracji: 12.03.2006 07:28
|
Petla dla checkboxa:
for($j=1; $j <= $max; $j++) echo '<td><input type="checkbox" name="student_lessons_'.$student['studentid'].'[]" value="'.$j.'" /></td>';
No i plik wstaw.php
<?php
include '../includes/common.inc';
include '../includes/klasy.inc';
include '../includes/students.inc';
include '../includes/frekwencja.inc';
require_group(_TEACHER_GROUP);
if (!isset($_POST['classid'], $_POST['absentdate'])) { header('Location: /frekwencja/'); exit; }
$date = $_POST['absentdate'];
$classid = intval($_POST['classid']);
if (isset($classid)) {
$studentlist = classGetStudentsById($classid);
foreach($studentlist as $student) {
$sl_name = 'student_lessons_'.$student['studentid'];
$student_lessons = (isset($_POST[$sl_name]) && is_array($_POST[$sl_name])) ? implode("|", $_POST[$sl_name]) : "";
if($student_lessons){
$query = "INSERT INTO `intra_attendance` VALUES ('', '".$classid."', '".$student['studentid']."', '".$student_lessons."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
$student_lessons = FALSE;
}
}
}
header('Location: /frekwencja/index.php?success=1');
exit;
?>
Kliknij i zaczekaj na załadowanie kodu ...
Wiadomo, zabezpieczenia musisz dodac :]
Pozdro!!
Edytowane przez Pieka dnia 31.07.2009 23:57:08
|
| |
|
|
| przemokrosno |
Dodany dnia 31.07.2009 23:54:38
|

Przedszkolak

Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Witam ponownie
Tym razem mam kolejny problem z pobraniem danych z bazy danych.
Efekt ko?cowy powinien wygl?da? tak:
Klasa | Przedmioty klasy
Klasa1 | Przedmiot1
| Przedmiot2
| ...
Klasa2 | Przedmiot1
| Przedmiot2
| ...
Po klikni?ciu na dowolny przedmiot powinno si? przej?? do edycji ocen w tej klasie z danego przedmiotu.
Napisa?em taki kod:
<?php
include '../includes/common.inc.php';
include '../includes/klasy.inc.php';
include '../includes/students.inc.php';
include '../includes/oceny.inc.php';
require_group(_TEACHER_GROUP);
if (isset($_GET['classid'])) {
$classid = intval($_GET['classid']);
$classinfo = classGetClassById($id);
$classname = $classinfo['name'];
$_SESSION['LAST_CLASSID'] = $classid;
$_SESSION['LAST_CLASSNAME'] = $classname;
}
page_header();
page_menu();
if (isset($_GET['success'])) {
if ($_GET['success'] == 1) {
$success = 'Oceny zapisano pomy?lnie.';
}
}
?>
<div id="content">
<h2>Oceny</h2>
<div id="breadcrumb"><a href="<?=$conf_settings['site_url']?>">Strona g?ówna</a> -> <em>Oceny</em></div>
<?php if ($success) echo "<strong class=\"success\">$success</strong>"; ?>
<div style="clear: both;"></div>
<p>Witaj w systemie ocen. Tutaj mo?esz dodawa? oceny, przegl?da? i edytowa? oceny. Wybirz klas? i przedmiot w której zamierzasz wykona? te operacje.</p>
<?php
if (authUserInGroup($_SESSION['username'], _TEACHER_GROUP)) {
$classlist = classGetClassesByCreator($_SESSION['username']); // get array of classes since the beginning of time
} elseif (authUserInGroup($_SESSION['username'], _ADMIN_GROUP)) {
$classlist = classGetClassesAfterTime(0);
}
if (empty($classlist)) { // no classes
?>
W tej chwili nie ma dost?pnych klas. Kliknij tutaj aby <a href="/klasy/new.php">utworzy? now? klas?</a>.
<?php
} else {
?>
<div style="float: left;">
<p>Wybierz klas?:</p>
<p>
<?php
if (authUserInGroup($_SESSION['username'], _TEACHER_GROUP)) {
$classlist = classGetClassesByCreator($_SESSION['username']);
} elseif (authUserInGroup($_SESSION['username'], _ADMIN_GROUP)) {
$classlist = classGetClassesAfterTime(0);
}
if (!empty($classlist)) {
?>
<table cellpadding=5 class="classlist">
<tr><th>Nazwa</th><th class="classlist">Przedmioty Klasy <?=$classname?></th></tr>
<?php
$i = 0;
foreach ($classlist as $class)
{
$i++;
if ($i % 2)
echo '<tr class="even">';
else
echo '<tr class="odd">';
echo '<td rowspan="15">' . $class['name'] . '</a></td>';
$przedmiotlist = classGetPrzedmiotyById($id);
if (!empty($przedmiotlist)) {
$i = 0;
foreach ($przedmiotlist as $przedmiot)
{
$i++;
$przedmiotinfo = przedmiotGetPrzedmiotById(intval($przedmiot['przedmiotid']));
if ($i % 2) echo '<tr class="even">'; else echo '<tr class="odd">';
echo '<td><a href="/oceny/do.php?id=' . $przedmiot['przedmiotid'] . '">' . $przedmiotinfo['przedmiot'] . '</td>';
echo '</tr>';
echo "\n";
}
echo '</table>';
} else {
?>
W tej chwili nie ma przedmiotów w tej klasie. Tutaj mo?esz <a href="addprzedmiot.php">doda? przedmiot do tej klasy</a>.
<?php
}
echo '</tr>';
echo "\n";
}
echo '</table>';
}else {
?>
W tej chwili nie ma klas w bazie danych. Tutaj mo?esz <a href="newclass.php">utworzy? now? klas?</a>.
<?php
}
?>
</p>
</div>
</p>
</div>
<div style="clear: both;"></div>
<?php
}
?>
</div> <!-- content -->
<?php
page_footer();
?>
Kliknij i zaczekaj na załadowanie kodu ...
Je?eli kto? znajdzie gdzie pope?ni?em b??d to bardzo prosz? o pomoc.
Edytowane przez przemokrosno dnia 04.08.2009 13:22:40
|
| |
|