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 22.12.2024 18:23:06
|
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
|
|
|