Funkcja foreach i przekazywane danych do mysql
|
przemokrosno |
Dodany dnia 23.07.2009 08:22:29
|
Przedszkolak
Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Witam
Napisałem skrypt który zwraca zwraca sukces ale mimo wszystko nic się nie wykonuje tzn nie dodaje rekordów do bazy danych. Jeśli dodam je ręcznie to wyświetla prawidłowo. Jeśli zamienię funkcję INSERT na DELETE to również działa bez problemu
Męczy mnie to już trzeci dzień i nie mogę znaleźć żadnego błędu. Dlatego bardzo proszę o pomoc Jeśli ktoś potrafi wskazać mi błąd to będę bardzo wdzięczny.
<?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($_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 `CONFIG_DB_TABLE` 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="do.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/dodajstudent.php">dodać uczniów do tej klasy</a>.
<?php
} else {
?>
<form method="post" action="wstaw.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>';
$absent = getStudentAttendance($absentdate, $classid, intval($student['studentid']));
$lesson = explode('|',$_POST['lesson']);
if ($absent == true) {
$absvalue = 'checked="checked" ';
}
echo '<td><input type="checkbox" name="student['.$student['studentid'].']" '.$absvalue.'/></td>';
for($j=0; $j < $max; $j++) {
if ($lesson[$j] == 1){
$lesson_value[$j] = 'checked="checked"';
} ?>
<td><input type="checkbox" name="<?php if(isset($lesson[$j])) echo $lesson[$j];?>" <?php echo $lesson_value[$j];?> ></td>
<?php
if ($lesson[$j] == true){
$lesson[$j] = 1;
} else {
$lesson[$j] = 0;
}
}
echo '</tr>';
echo "\n";
}
echo '</table>';
}
?>
<input type="hidden" name="absentdate" value="<?=$absentdate?>" />
<input type="hidden" name="classid" value="<?=$classid?>" />
<input type="hidden" name="classid" value="<?=$studentid?>" />
<input type="hidden" name="lesson" value="<?=$lesson = implode('|',$_POST['lesson'])?>" />
<input type="submit" name="todo" value="Wstaw" />
<?php
// Koniec wstawiania nieobecności -------------------------------------------------------------------
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 ($student as $studentid => $status)
{
$query = 'INSERT INTO `intra_attendance` (`classid`, `studentid`, `date_absent`) VALUES ('.$classid.', '.$studentid.', '.$date.');';
$result = @mysql_query($query) or die(mysql_error());
return mysql_insert_id();
}
}
header('Location: /frekwencja/index.php?success=1');
exit;
?>
Kliknij i zaczekaj na załadowanie kodu ...
Edytowane przez Pieka dnia 23.07.2009 13:30:28
|
|
|
|
Wścibski Gość |
Dodany dnia 25.11.2024 01:15:25
|
Pan Kontekstualny
Postów: n^x
Data rejestracji: Zawsze
|
|
IP: localhost |
|
|
slawekneo |
Dodany dnia 23.07.2009 18:13:39
|
Bywalec
Postów: 915 Pomógł: 41
Data rejestracji: 12.03.2006 07:28
|
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($_POST['student'])) {
foreach ($_POST['student'] as $studentid => $status){
$query = "INSERT INTO `intra_attendance` VALUES ('".$classid."', '".$studentid."', '".$date."')";
$result = @mysql_query($query) or die(mysql_error());
return mysql_insert_id();
}
}
header('Location: /frekwencja/index.php?success=1');
exit;
?>
Kliknij i zaczekaj na załadowanie kodu ...
I tu ciekawi mnie wiele spraw
- czy masz wlaczone register globals ?
jesli tak to polecam wylaczyc i przerobic caly skrytp pod dzialanie bez register globals
- w petli foreach masz wrzucona tablice $student pytanie moje czy jest to ta sama tablica co z $_POST['student'] jesli tak to polecam dac odpalic petle z tablicy _post bo w innym przypadku bedziesz mial bardzo grozna luke no i brak zabezpieczen na dane z post.
Pozdro!!
Edytowane przez Pieka dnia 23.07.2009 19:01:28
|
|
|
|
przemokrosno |
Dodany dnia 24.07.2009 07:25:10
|
Przedszkolak
Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Może to wszystko wyjaśni - plik index z którego pobieram klasę i datę:
<?php
include '../includes/common.inc';
include '../includes/klasy.inc';
include '../includes/students.inc';
include '../includes/frekwencja.inc';
require_group(_TEACHER_GROUP);
page_header();
page_menu();
if (isset($_GET['success'])) {
if ($_GET['success'] == 1) {
$success = 'Nieobecności zapisano pomyślnie.';
}
}
?>
<div id="content">
<h2>Frekwencja</h2>
<div id="breadcrumb"><a href="<?=$conf_settings['site_url']?>">Strona główna</a> -> <em>Frekwencja</em></div>
<?php if ($success) echo "<strong class=\"success\">$success</strong>"; ?>
<div id="subnav">
<ul>
<li>
<form method="post" action="/frekwencja/do.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="Go" />
</form>
</li>
</ul>
</div>
<div style="clear: both;"></div>
<p>Witaj w systemie Frekwencji. Tutaj możesz wstawić niobecność, dokonać zmian i obejrzeć historię frekwencji.</p>
<?php
if (authUserInGroup($_SESSION['username'], _TEACHER_GROUP)) {
$classlist = classGetClassesByCreator($_SESSION['username']);
} elseif (authUserInGroup($_SESSION['username'], _ADMIN_GROUP)) {
$classlist = classGetClassesAfterTime(0);
}
if (empty($classlist)) { // no classes
?>
<p>Aktualnie nie ma żadnych klas w bazie danych. Aby zarządzać frekwencją, musisz <a href="/klasy/new.php">utworzyć nowe klasy</a></p>
<?php
} else {
?>
<form method="post" action="do.php">
<div style="float: left;">
<p>Wybierz klasę:</p>
<p>
<select name="class">
<?php
foreach ($classlist as $class)
{
echo '<option value="'.$class['id'].'">' . $class['name'] . '</option>';
}
?>
</select>
</p>
</div>
<div style="float: left;">
<p>Wybierz datę:</p><p><?php dateboxes(); ?></p>
</div>
<div style="clear: both;"></div>
<p>
<input type="submit" name="todo" value="Wstaw" />
<input type="submit" name="todo" value="Przeglądaj" />
</p>
</form>
<?php
}
?>
</div> <!-- content -->
<?php
page_footer();
?>
Kliknij i zaczekaj na załadowanie kodu ...
Jeśli chodzi o zabezpieczanie kodu to jeszcze do tego nie dotarłem.
Najpierw chcę to uruchomić żeby to działało a została mi już tylko ta frekwencja (nadal nie działa). Może to jeszcze pomoże - struktura tabeli frekwencji(attendance):
---------------------------------------------------
| id | studentid | classid | lesson | date_absent |
---------------------------------------------------
|
|
|
|
bartek124 |
Dodany dnia 24.07.2009 09:31:00
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
Skoro w tabeli masz 4 pola do zapisu, a w zapytaniu przesyłasz tylko 3, to jakim cudem ma działać?
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
przemokrosno |
Dodany dnia 24.07.2009 11:08:17
|
Przedszkolak
Postów: 11
Data rejestracji: 23.07.2009 08:01
|
Nie wszystkie pola muszą być wypełnione. Nawet jak usunę kolumnę lesson to i tak nie działa. Więc jakie to ma znaczenie jakie pola są w bazie skoro wypełniam trzy pozostałe:
INSERT INTO `intra_attendance` (`classid`, `studentid`, `date_absent`) VALUES...
Edytowane przez Pieka dnia 24.07.2009 13:57:43
|
|
|
|
slawekneo |
Dodany dnia 24.07.2009 13:53:25
|
Bywalec
Postów: 915 Pomógł: 41
Data rejestracji: 12.03.2006 07:28
|
A jednak ma znaczenie kolejnosc zreszta tez o ile ta podana jako struktura jest prawidlowa ;]
$query = "INSERT INTO `intra_attendance` VALUES ('', '".$studentid."', '".$classid."', '', '".$date."')";
Kliknij i zaczekaj na załadowanie kodu ...
Pozdro!! |
|
|
|
bartek124 |
Dodany dnia 24.07.2009 14:15:41
|
Weteran
Postów: 3264 Pomógł: 236
v7.02.06 Data rejestracji: 26.05.2007 12:25
|
return mysql_insert_id();
To zatrzymuje pętle. Ale przynajmniej raz powinno się dodać...
Nie pomagam na komunikatorach oraz PW!
|
|
|
|
slawekneo |
Dodany dnia 24.07.2009 15:22:20
|
Bywalec
Postów: 915 Pomógł: 41
Data rejestracji: 12.03.2006 07:28
|
Blokuje nie przez zwrócenie funkcji ale przez samo zwrócenie czyli "return" linia ktora podal bartek jest do wywalenia gdyz jest zbedna !
A ja teraz przyczepie sie do kodu pierwszego z pierwszego postu a mianowicie do czesci formularza ktory pozniej operuje na wstaw.php.
1.najprawdopodobniej rypneles sie w nazwie dla inputa w obu jest ta sama nazwa ! w drugim inpucie chyba powinna byc nazwa "studentid" <input type="hidden" name="classid" value="<?=$classid?>" />
<input type="hidden" name="classid" value="<?=$studentid?>" />
Kliknij i zaczekaj na załadowanie kodu ...
2.brak zamkniecia formularza czyli </form>
Pozdro!!
Edytowane przez Chemikpil dnia 24.07.2009 16:24:51
|
|
|
|
przemokrosno |
Dodany dnia 24.07.2009 15:45:16
|
Przedszkolak
Postów: 11
Data rejestracji: 23.07.2009 08:01
|
slawekneo napisał/a:
Blokuje nie przez zwucenie funkcji ale przez samo zwrucenie czyli "return" linia ktora podal bartek jest do wywalenia gdyz jest zbedna !
A ja teraz przyczepie sie do kodu pierwszego z pierwszego postu a mianowicie do czesci formularza ktory pozniej operuje na wstaw.php.
1.najprawdopodobniej rypneles sie w nazwie dla inputa w obu jest ta sama nazwa ! w drugim inpucie chyba powinna byc nazwa "studentid" <input type="hidden" name="classid" value="<?=$classid?>" />
<input type="hidden" name="classid" value="<?=$studentid?>" />
Kliknij i zaczekaj na załadowanie kodu ...
2.brak zamkniecia formularza czyli </form>
Pozdro!!
To zauważyłem już wcześniej i poprawiłem i w końcu zadziałało po wyrzuceniu returna. Wielkie dzięki nie tylko dla Ciebie ale również dla Bartek124. Teraz pozostaje mi jeszcze dorobić lekcje nieobecności. Jakbym miał jeszcze jakieś problemy to już wiem gdzie pisać.
Pozdrawiam.
Edytowane przez Pieka dnia 31.07.2009 09:44:29
|
|
|