BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Projekte (http://www.black-board.net/board.php?boardid=108)
--- PHP Ministranteneinteilung online (http://www.black-board.net/thread.php?threadid=22174)


Geschrieben von inde am 20.05.2006 um 14:46:

  Ministranteneinteilung online

Hallo liebe BBler...

Also, bevor ich meine Sachen erläutre, wisst dass ich seit ca. 10 Jahren Ministrant in einer katholische Pfarrgemeinde bin. Seit 3 Jahren bin ich nicht mehr aktiv sondern kümmre mich verstärkt um Jugendarbeit.

Mir ist da jetzt ne neue Idee - vielleicht nur ne Spinnerei - gekommen und ich möchte das umsetzen. Viele Pfarreien haben eigene Ministrantenhomepages, so eine möchte ich nun auch basteln. Soweit kein Problem, ich hab das nötige Handwerkszeug und KnowHow.

Auf dieser Seite sollen in Zukunft auch die Diensteinteilungen gemacht werden. Ich erklär mal wie das bei uns so läuft:

Es gibt Einteilungen für Weihnachten, Hl. Drei Könige, Klappern, Ostern, Maiprozessionen, usw.

Die Einteilungen enthalten Dienste, z.B.
- Weihnachten -
* Kindermette
* Christmette
* Erster Weihnachtsfeiertag
* Zweiter Weihnachtsfeiertag

Diese Dienste wiederum haben noch genauere Angaben:
Kindermette, 18:00 Uhr (Uhrzeit), neue Kirche (Ort), Weihrauch: Person A, Person B, Leuchter: Person C, Person D, Ministranten: Person E, ... , Person H (also verschiedene Ämter)

Außerdem gibt es ein Minimum das jeder Messdiener erfüllen soll (bsp. zwei Dienste pro Einteilung)

Jetzt ist die Frage wie ich das umsetze in PHP mit Datenbank.

Bis jetzt hab ich mir üebrlegt man bräuchte folgende Tabellen:

code:
1:
2:
3:
4:
5:
6:
7:
TABELLE ministranten
SPALTEN
mini_id
name
email
...
code:
1:
2:
3:
4:
5:
6:
7:
TABELLE einteilungen
SPALTEN
e_id
titel
gültigkeit von bis
mindest_dien_anzahl
...
code:
1:
2:
3:
4:
5:
6:
7:
TABELLE dienste
SPALTEN
d_id
titel
uhrzeit
treffpunkt
...
code:
1:
2:
3:
4:
TABELLE ämterarten
SPALTEN
amtart_id
amtart
code:
1:
2:
3:
4:
5:
6:
TABELLE ämter
SPALTEN
amt_id
d_id
amtart_id
anzahl

code:
1:
2:
3:
4:
5:
6:
TABELLE eingetragene minis
eintrag_id
mini_id
e_id
d_id
amtart_id


Ja, das waren soweit meine überlegungen... jetzt ist das ganze aber ziemlich verschachtelt und ich überleg ob es nicht vielleicht auch einfacher ginge. Vielleicht fällt jemandem von euch dazu was ein. Vielleicht habt ihr selbst ähnliches mal gemacht und könnt mir n paar tips für die möglichst unkomplizierte umsetzung geben. Wär echt dankbar!



Geschrieben von phlox81 am 20.05.2006 um 16:17:

 

Hm, also ich würde das mit der Tabelle Ministranten schon mal anders machen.
Ministrant ist ja eigentlich nur eine Rolle. Z.b. du bist das ja nicht,
müsstest aber evtl. auch im System sein, um eintragungen etc. zu überwachen.
Also würde ich eine Tabelle User machen, wo alle Benutzerdaten und der Login drin ist.
Dann würde ich noch eine Tabelle mit Rollen machen, und diese mit den Nutzern
verknüpfen. So kannst du dann auch den Pfarrer z.b. in die Sache integrieren,
falls der mal wissen will, was seine Schäfchen so machen Augenzwinkern

Ansonsten sieht das schon ganz vernünftig aus.



Geschrieben von inde am 21.05.2006 um 15:39:

 

Jo, das war schon so geplant also "Usertabelle", ich hab sie jetzt nur als Ministrantentabelle dargestellt... also auf jedenfall in dieser Tabelle sollen alle (also auch ich, der Pfarrer, unser Gemeindereferent) verzeichnet sein. Weiter sollen die User verschiedenen Gruppen angehören (also verschiedene Rechte haben). Wie kann cih das dann am besten machen? Die Struktur der anderen Tabellen meinst du ist also in Ordnung. Gut, dann werd ich das so machen. Allerdings hat sich das Ziel ein wenig verändert, wenn auch nur minimal. Das Eintragen der Dienste für die Ministranten entfällt, die Dienste werden von einem authorisierten Oberministrant eingetragen. DIe normalen Minis können nur 1. einen ganzen EInteilungsplan runterladen und 2. einen Merkzettel für alle Dienste die sich machen runterladen.



Geschrieben von Misel am 22.05.2006 um 00:14:

 

Hast du vielleicht mal ne grafische Übersicht über die Tabellen? So in den reinen Tabellen-"Code" ist das irgendwie unübersichtlich.



Geschrieben von inde am 25.05.2006 um 15:52:

 

Danke für eure Hilfe... allerdings hat sich die Sache mit der Einteilung vorerst mal erledigt... ich hab nochmal alles überdacht und bin zu dem Schluss gekommen die Sache lohnt den Aufwand nicht. Wir werden wohl auch weiterhin unsere Einteilungen mit Word schreiben und dann austeilen.

Allerdings bin ich noch auf eine Sache gekommen die ich auf dieser Seite einbauen möchte:

Gibt es die möglichkeit verschiedene Dateien in einem Verzeichnis abzulegen und dieses Verzeichnis für normale Benutzer nicht zugänglich zu machen. Angemeldete User sollen auf das Verzeichnis zugreifen dürfen und die Dateien ansehen könne. Geht doch irgendwie? Nur wie?



Geschrieben von Champus am 25.05.2006 um 16:43:

 

Wäre z.B. über HTAccess möglich. Anleitung.



Geschrieben von inde am 26.05.2006 um 22:33:

  Danke - neues Problem :)

Danke ich glaub das werd ich verwenden. Falls ich dazu noch Fragen hab werd ich sie bringen.

Allerdings ist mir heute ein weiteres Problem entstanden. Ich weiß überhaupt nicht wie es dazu gekommen ist und könnte es mir nicht erklären. Ich hab so an einem Script gearbeitet und aktualisierte wieder und wieder die Seite um änderungen und deren Funktionen zu überprüfen. Plötzlich bekam ich mehrere Notice, Waring, und einen Fatal error.

Den Fehlermeldungen konnte ich entnehmen dass offenbar der Code zweimal hintereinander ausgeführt werden. Als Fehlerquelle kommt nur eine Datei in Frage, die zu Beginn jedes Scripts geladen wird.

Obwohl also die Datei zweimal abgearbeitet wird bekomme ich nur eine Ausgabe.

Nun meine Frage: Ist sowas möglich? Wo könnte ich da Fehler gemacht haben?

Ich hab momentan den Code nicht da aber morgen werd ich die entsprechende Datei mal posten... ich weiß echt nicht weiter und bin schon verzweifelt... es geht einfach gar nix mehr.

Falls es was nützt: Ich benutz Smarty als Templatesystem.



Geschrieben von LX am 27.05.2006 um 01:29:

Achtung

Verwende einfach require_once() bzw. include_once(), wenn du Dateien einbindest, bei denen du sicherstellen musst, dass sie auch nur einmal eingebunden werden. Ansonsten wäre eine genauere Fehlermeldung und der passende Code schon von essentieller Wichtigkeit Augenzwinkern



Geschrieben von inde am 27.05.2006 um 14:01:

 

Hab ich schon versucht.... vorher hatt ich alles per require eingebunden, jetzt teils mit require_once... behebt zwar einen teil der Probleme, dennoch wird der ganze Mist doppelt ausgeführt...

Hier mal der Code:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
<?php
error_reporting(E_ALL);

##### SESSION STARTEN
session_name("SID");
session_start();

$SID "";

if(empty($_COOKIE["cookies_act"])) {
 
 setcookie("cookies_act"1); 
 $SID session_name()."=".session_id(); 
 
}

echo "test";

##### SMARTY INITIALISIEREN

define('SMARTY_DIR''G:\xampp\htdocs\smarty\\');
// den Pfad entsprechend anpassen. Der Slash am ende muss
// vorhanden sein

require_once(SMARTY_DIR.'Smarty.class.php');
// Die Smarty-Klasse laden

$smarty = new Smarty;
// Neues Objekt erstellen

$smarty->compile_check true;
$smarty->debugging true;

require_once ("admin/data.php");
require_once ("admin/class_db_zugriff.php");
require_once ("functions.php");

##### DATENBANKZUGRIFF
$db = new db_zugriff;

$db->database=$mysql_dbname;
$db->host=$mysql_host;
$db->user=$mysql_user;
$db->pw=$mysql_pw;

$db->connect();

##### SESSION ID in Datenbank schreiben
##### Eintrag in user_onlinetable machen

$session_vorhanden "SELECT COUNT(sid) FROM minis_user_onlinetable WHERE sid LIKE '".session_id()."'";
$session_vorhanden $db->query_first($session_vorhanden);
$session_vorhanden $session_vorhanden[0];
if(!$session_vorhanden) {

 $sql "INSERT INTO minis_user_onlinetable (sid) VALUES ('".session_id()."')";
 $sql $db->query($sql);
 
} 

##### SESSION IP ÜBERPRÜFEN ######
if(!isset($_SESSION['IP'])) $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];

if($_SESSION['IP']!=$_SERVER['REMOTE_ADDR']) {

    end_session();
    $smarty->assign("content_file""session_error.tpl");
    $smarty->display("html_body.tpl");
    exit();

}

##### Seitenvariablen #######

if(isset($_GET['p'])) {
$PAGE $_GET['p'];
$PAGE explode(",",$PAGE);
for($i=0;$i<count($PAGE);$i++) {

  $PAGE[$i] = intval(current($PAGE));
  next($PAGE);
  
}
}
else
 $PAGE 0;

$IP $_SERVER["REMOTE_ADDR"];
$smarty->assign("IP"$IP);
$TIME time();
$smarty->assign("TIME"$TIME);
if(isset($SID))
 $smarty->assign("SID"$SID);
$ACTION_MENU = array();
 $smarty->assign("ACTION_MENU"$ACTION_MENU);


##### USERDATEN ABFRAGEN

if(isset($_SESSION['ID'])) {

 $userdata get_userdata($_SESSION['ID']);
 $smarty->assign("userdata"$userdata);   
  
}

##### USER ONLINE Tabelle aktualisieren

$sql "UPDATE minis_user_onlinetable SET last_activity = '".$TIME."' WHERE sid LIKE '".session_id()."'";
$sql $db->query($sql);

$sql "DELETE FROM minis_user_onlinetable WHERE ".$TIME."-last_activity>60*15";
$sql $db->query($sql);

#####
?>


Und hier am Beispiel meiner home.php, die im Broser aufgerufen wird was weiter passiert...

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
<?php
### DATEI: home.php

require_once("global.php");

/* Irgendwelche Funktionen und Anweisungen...
...
...
...
*/

$smarty->assign("content_file""home.tpl");
$smarty->display("html_body.tpl");
?>


So, noch ver Vollständigkeit halber meine html_body.tpl:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
<html>
<head>
<title>{$seiten_titel}</title>
<link href="design/standart/style.css" type="text/css" rel="stylesheet">
</head>
<body>
<div class="logo">Hier ist das Logo</div>
<div class="content">

{include file="$content_file"}

</div>
<div class="footer">Footer</div>


<div class="left_navi">
{include file="navigation.tpl"}
{if !isset($userdata)}{include file="login_form.tpl"}{/if}
</div>

<div class="right_navi">{foreach from=$ACTION_MENU item=link key=menu_point}
<a href="{$link}&{$SID}">{$menu_point}</a>{/foreach}
</div>
</body>
</html>


Bitte helft! Ich glaub die global.php wird doppelt ausgeführt, hier die Fehlermeldungen die ich immer, unabhängig von der Datei die aufgerufen wird bekomme:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Notice: A session had already been started - ignoring session_start() in G:\xampp\htdocs\minis\global.php on line 6

--> Weißt jawohl darauf hin dass session_start(), dass in der global.php gnaz am Anfang steht zweimal versucht wird...

Warning: Cannot modify header information - headers already sent by (output started at G:\xampp\htdocs\minis\global.php:6) in G:\xampp\htdocs\minis\global.php on line 12

--> Gut, halt der Fehler...

Notice: Constant SMARTY_DIR already defined in G:\xampp\htdocs\minis\global.php on line 21

--> Hier ebenfalls, SMARTY_DIR wird in global.php nur einmal definiert... warum versucht das Script das nocheinmal zu machen???


EDIT: Wenn ich in der global.php eine Testausgabe, z.B. echo "test"; mache erscheint "TEST zweimal in der Ausgabe... hier:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
test
--> das erste mal geht alles klar... seht euch die position von test in der global.php an

--> nun wird das ganze anscheinen nocheinmal gemacht, der erste Fehler erscheint:

Notice: A session had already been started - ignoring session_start() in G:\xampp\htdocs\minis\global.php on line 6

--> Hier die test ausgabe:

test

--> Der zweite Fehler:
Notice: Constant SMARTY_DIR already defined in G:\xampp\htdocs\minis\global.php on line 21



Geschrieben von LX am 27.05.2006 um 14:15:

Achtung

Das einzige, was mir hier noch einfallen würde, wäre, dass in der home.php noch irgendwo Dateien eingebunden werden oder Sessions gestartet werden... Ansonsten finde ich in dem geposteten Teil keinen Hinweis darauf, was da so schief läuft.

Hast du einen Debugger bei der Hand? Damit ließe sich die Fehlerquelle sicherlich einfach finden. Ansonsten

a) schick mir mal ein Archiv von dem ganzen Kram per PM oder hänge es an den Beitrag an, dann könnte ich mal einen Debugger drüber laufen lassen oder
b) packe mal eine Reihe Debugausgaben in dein Script (also `echo "MARKE 1 | ";` etc. an markanten Stellen, damit du weißt, wo das Script gerade ist, dann kannst du nachvollziehen, ob bestimmte Dateien tatsächlich doppelt eingebunden werden).



Geschrieben von inde am 27.05.2006 um 14:19:

 

Hab noch mal ge"editet"... ich denke das ist das mit der Marke... das merkwürdige ist ja ich ich hab ja vollkommen verschiedene Dateien auf die per Brwoser zugegriffen wird, also home.php, einteilung.php usw...

EDIT: Ich hab jetzt mal ne komplett "nackige" test.php erstellt:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?php
#### TESTDATEI

require_once("global.php");

$smarty->assign("seiten_titel""Hallo!");
$smarty->assign("content_file""");
$smarty->display("html_body.tpl");
?>


Es werden also nur noch
global.php, test.php, templates/html_body.tpl, templates/navigation.tpl sowie
design/standart/style.css geladen. Hier die Soucre von navigation.tpl
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<menu>
<li><a href="home.php?{$SID}">Startseite</a></li>
<li><a href="impressum.php?{$SID}">Impressum</a></li>
<li><a href="./forum/">Forum</a></li>
</menu>
{if isset($userdata)}
<h1>Internes Menü</h1>
<menu>
<li><a href="einteilung.php?{$SID}">Einteilungen</a></li>
<li>Telefonliste</li>
<li>Anmeldungen</li>
{if isset($userdata.r.set_permissions)}
<li>Berechtigungen verwalten</li>{/if}
<li><a href="logout.php?{$SID}">Logout</a></li>
</menu>
{/if}


und von style.css
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
body {
  
 font-family:Verdana; 
 margin:0px;
 padding:0px;
  
}

.logo {

border:1px solid black;
height:100px;

}


.content {
  
 font-size:0.8em;
 margin:0 140px 0 140px;
 padding:15px 40px 15px 40px;
 border:1px solid black;
 min-height:400px;
  
}

.footer {

 height:40px;
 border:1px solid black;

}

.left_navi {
  
 font-size:0.6em;
 position:absolute;
 left:20px;top:130px;
 width:150px;
 border:1px solid black;
 background-color:white; 
  
}

.right_navi {
  
 font-size:0.6em;
 position:absolute;
 right:20px;top:130px;
 width:150px;
 border:1px solid black;
 background-color:white; 
  
}


Aber an denen wird es nicht liegen...



Geschrieben von LX am 27.05.2006 um 14:22:

Achtung

Die einzelne Marke sagt dir aber nur, dass die global.php in der Tat mehrfach ausgeführt wird. Nur wo, das weißt du so noch nicht, also füge mal noch ein paar weitere Marken in die Dateien ein, aus denen die global.php aufgerufen wird, so kannst du dich rantasten, wo der 2. Aufruf erfolgt.



Geschrieben von inde am 27.05.2006 um 14:35:

 

Daaaaaaaaaaaaaamn... ich hab den Fehler lokalisiert... dicker Fisch!
Anscheinend hab ich gestern eine php Datei die über den Browser aufgerufen werden sollte versehens unter functions.php gespeichert und die wird ja in global.php aufgerufen. Schöne scheiße! Vor allem da jetzt meine functions.php futsch ist... hm... aber irgendwo werd ich noch eine rumliegen haben.

Vielen Dank LX für diesen kleinen Kurs in Debugging smile Schönen Tag noch!



Geschrieben von LX am 27.05.2006 um 14:36:

Achtung

In der admin/data.php, admin/class_db_zugriff.php und functions.php erfolgt auch kein weiterer Zugriff auf die global.php?

Am einfachsten wäre es wie gesagt, wenn du mal ein komplettes Archiv (am besten auch mit DB-Dump mit Testdaten) anhängen würdest.


[EDIT]
Okay, damit ist das wohl geklärt *g



Geschrieben von inde am 27.05.2006 um 16:29:

 

Ahhh... ich rast gleich aus... kaum ist man das eine Problem los kommt schon das nächste!

Der php Code wird nicht verarbeitet sondern direkt ausgegeben... allerdings nicht von vorne sondern erst ab einer bestimmten Stelle. Das gilt allerdings komischerweise nur für eine Datei, bei allen anderen tritt das Problem nicht auf. Keine Ahnung was ich wieder falsch gemacht hab.

Ich poste mal die Datei: einteilung.php

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
<?php

require_once("global.php");

if(empty($userdata['r']['einteilung_erstellen'])) {
  
 $smarty->assign("content_file""not_authorised.tpl");
 $smarty->display("html_body.tpl");
 exit; 
  
}

switch($PAGE[0]) {
  
 case 1:
  // Neue Einteilung erstellen
  $smarty->assign("seiten_titel""Neue Einteilung erstellen");

  ##### Alle Ämter (Rollen) in Array einlesen     
  $sql "SELECT * FROM minis_roles";
  $sql $db->query($sql);
  
  while($row $db->fetch_array($sql)) {

   $roles[$row['roleid']] = $row['role'];

  }
  $smarty->assign("roles"$roles);
 
   $e_arr = array();
   if(!isset($e_arr['titel']))
    $e_arr['titel'] = "";
   if(!isset($e_arr['from']))
    $e_arr['from'] = "";
   if(!isset($e_arr['to']))
    $e_arr['to'] = ""; 
   if(!isset($e_arr['infotext']))
    $e_arr['infotext'] = "";   
     
   $e_arr['termine'] = array(); 
  
  if(isset($PAGE[1]) AND $PAGE[1]==2) {
    
   $DatenOK 1;
   $error "";
   $t_error "";

   
   ##### Daten werden geprüft
   $e_arr['titel'] = $_POST['e_titel'];
   $e_arr['from'] = $_POST['e_from_Year']."-".$_POST['e_from_Month']."-".$_POST['e_from_Day'];
   $e_from_stamp strtotime($e_arr['from']);
   $e_arr['to'] = $_POST['e_to_Year']."-".$_POST['e_to_Month']."-".$_POST['e_to_Day'];
   $e_to_stamp strtotime($e_arr['to']);
   $e_arr['infotext'] = $_POST['e_infotext'];
   $e_arr['anz_termine'] = $_POST['anz_termine'];

   
   for($i=0;$i<$e_arr['anz_termine'];$i++) {
     
     if(!isset($_POST['drop_termin_'.$i])) {
      $wann mktime($_POST['termin_'.$i.'Hour'],
        $_POST['termin_'.$i.'Minute'], 0,
        $_POST['termin_'.$i.'Month'],
        $_POST['termin_'.$i.'Day'],
        $_POST['termin_'.$i.'Year']);
        
      $tmp_roles = array();  

      if($_POST['termin_'.$i.'Year']."-".$_POST['termin_'.$i.'Month']."-".$_POST['termin_'.$i.'Day'] !=
       date("Y-m-j",$wann)) {

       $DatenOK 0;
       $t_error .= "Das angegebene Datum ist ungültig.<br>\n";

       }
      if($wann $e_from_stamp OR $wann $e_to_stamp) {

       $DatenOK 0;
       $t_error .= "Das Datum liegt außerhalt der Gültigkeitsgrenzen.<br>\n";

      }

      ##### Ämter auslesen und in temporären Ämterarray speichern

      while(list($key,$val) = each($roles)) {
           
       if(isset($_POST[$i.'_role_'.$key]) 
        && count($_POST[$i.'_role_'.$key]>0){
        #&& in_array('drop_role', $_POST[$i.'_role_'.$key])==false) {
          
        $tmp_roles[$key] = $_POST[$i.'_role_'.$key]; 
         
       } 
        
      }      

      ##### Ämter hinzufügen
      if(isset($_POST['add_role_to_'.$i]) && $_POST['role_'.$i]>0) {

        $tmp_roles[$_POST['role_'.$i]] = array();

      }

      
      array_push($e_arr['termine'], array('titel' => $_POST['termin_'.$i.'_titel'],
       'wann' => $wann,
       'treffpunkt' => $_POST['termin_'.$i.'_treffpunkt'], 
       'infotext' => $_POST['termin_'.$i.'_infotext'],
       'roles' => $tmp_roles,
       'error' => $t_error));

      unset($wann$tmp_roles);
      $t_error "";
     }
     
    }
    
   ##### e_arr[termine] nach datum sortieren    
   function cmp ($a$b) {
 
    if ($a['wann'] == $b['wann']) return 0;
    return ($a['wann'] < $b['wann']) ? -1;

   }
   
   usort($e_arr['termine'], "cmp");
  
  
    
   
   if($e_arr['titel']=="") {
    
    $DatenOK 0;
    $error .= "Titel fehlt<br/>\n";  
      
   }
   
   if($e_arr['from']=="" 
    OR $e_arr['to']=="" 
#    OR checkdate(date("m", $e_to_stamp), date("d", $e_to_stamp), date("Y", $e_to_stamp))==false 
#    OR checkdate(date("m", $e_from_stamp), date("d", $e_from_stamp), date("Y", $e_from_stamp))==false 
    OR $e_to_stamp<$e_from_stamp) {
     
    $DatenOK 0;
    $error .= "Gültigkeitsdauer fehlerhaft<br/>\n"; 
     
   }
   
   ##### Termin hinzufügen
   if(isset($_POST['add_termin'])) {
     
     array_push($e_arr['termine'], array('titel' => 'neuer Termin', 
      'wann' => '', 
      'treffpunkt' => '', 
      'infotext' => '',
      'roles' => array(),
      'error' => ''));
     
     
    }
    
   if($DatenOK && isset($_POST['save_einteilung'])) {
    
    $e_titel strip_tags($e_titel);
    $sql "INSERT INTO minis_einteilung (titel, from_date, to_date, infotext) 
     VALUES ('$e_titel', '$e_from', '$e_to', '$e_infotext')"; 
    $sql $db->query($sql);
   
   } 
     
 }
  ##### Alle User in Array einlesen
  $sql "SELECT ID_MEMBER, memberName FROM smf_members ORDER BY memberName";
  $sql $db->query($sql);
  while($row $db->fetch_array($sql)) {
    
   $all_members[$row['ID_MEMBER']] = $row['memberName']; 
    
  }
  $smarty->assign("all_members"$all_members);    

 

 
  $e_arr['anz_termine'] = count($e_arr['termine']);
  $smarty->assign("e_arr"$e_arr);
  $smarty->assign("content_file""neue_einteilung.tpl"); 
 break;
 
 case 3:
  // Einteilungen Übersicht
  $smarty->assign("seiten_titel""Einteilungen");
  
  $ACTION_MENU['Neue Einteilung'] = "einteilung.php?p=1";
  
  $smarty->assign("content_file""einteilung.tpl"); 
 break;
 
 default:
  header("Location: einteilung.php?p=3&$SID"); 
 break;     
}

$smarty->assign("ACTION_MENU"$ACTION_MENU);  
$smarty->display("html_body.tpl");

?>


Und das ist was ich ausgegeben bekomme:
Zitat:
assign("content_file", "not_authorised.tpl"); $smarty->display("html_body.tpl"); exit; } switch($PAGE[0]) { case 1: // Neue Einteilung erstellen $smarty->assign("seiten_titel", "Neue Einteilung erstellen"); ##### Alle Ämter (Rollen) in Array einlesen $sql = "SELECT * FROM minis_roles"; $sql = $db->query($sql); while($row = $db->fetch_array($sql)) { $roles[$row['roleid']] = $row['role']; } $smarty->assign("roles", $roles); $e_arr = array(); if(!isset($e_arr['titel'])) $e_arr['titel'] = ""; if(!isset($e_arr['from'])) $e_arr['from'] = ""; if(!isset($e_arr['to'])) $e_arr['to'] = ""; if(!isset($e_arr['infotext'])) $e_arr['infotext'] = ""; $e_arr['termine'] = array(); if(isset($PAGE[1]) AND $PAGE[1]==2) { $DatenOK = 1; $error = ""; $t_error = ""; ##### Daten werden geprüft $e_arr['titel'] = $_POST['e_titel']; $e_arr['from'] = $_POST['e_from_Year']."-".$_POST['e_from_Month']."-".$_POST['e_from_Day']; $e_from_stamp = strtotime($e_arr['from']); $e_arr['to'] = $_POST['e_to_Year']."-".$_POST['e_to_Month']."-".$_POST['e_to_Day']; $e_to_stamp = strtotime($e_arr['to']); $e_arr['infotext'] = $_POST['e_infotext']; $e_arr['anz_termine'] = $_POST['anz_termine']; for($i=0;$i<$e_arr['anz_termine'];$i++) { if(!isset($_POST['drop_termin_'.$i])) { $wann = mktime($_POST['termin_'.$i.'Hour'], $_POST['termin_'.$i.'Minute'], 0, $_POST['termin_'.$i.'Month'], $_POST['termin_'.$i.'Day'], $_POST['termin_'.$i.'Year']); $tmp_roles = array(); if($_POST['termin_'.$i.'Year']."-".$_POST['termin_'.$i.'Month']."-".$_POST[
'termin_'.$i.'Day'] != date("Y-m-j",$wann)) { $DatenOK = 0; $t_error .= "Das angegebene Datum ist ungültig.
\n"; } if($wann < $e_from_stamp OR $wann > $e_to_stamp) { $DatenOK = 0; $t_error .= "Das Datum liegt außerhalt der Gültigkeitsgrenzen.
\n"; } ##### Ämter auslesen und in temporären Ämterarray speichern while(list($key,$val) = each($roles)) { if(isset($_POST[$i.'_role_'.$key]) && count($_POST[$i.'_role_'.$key]>0){ #&& in_array('drop_role', $_POST[$i.'_role_'.$key])==false) { $tmp_roles[$key] = $_POST[$i.'_role_'.$key]; } } ##### Ämter hinzufügen if(isset($_POST['add_role_to_'.$i]) && $_POST['role_'.$i]>0) { $tmp_roles[$_POST['role_'.$i]] = array(); } array_push($e_arr['termine'], array('titel' => $_POST['termin_'.$i.'_titel'], 'wann' => $wann, 'treffpunkt' => $_POST['termin_'.$i.'_treffpunkt'], 'infotext' => $_POST['termin_'.$i.'_infotext'], 'roles' => $tmp_roles, 'error' => $t_error)); unset($wann, $tmp_roles); $t_error = ""; } } ##### e_arr[termine] nach datum sortieren function cmp ($a, $b) { if ($a['wann'] == $b['wann']) return 0; return ($a['wann'] < $b['wann']) ? -1 : 1; } usort($e_arr['termine'], "cmp"); if($e_arr['titel']=="") { $DatenOK = 0; $error .= "Titel fehlt
\n"; } if($e_arr['from']=="" OR $e_arr['to']=="" # OR checkdate(date("m", $e_to_stamp), date("d", $e_to_stamp), date("Y", $e_to_stamp))==false # OR checkdate(date("m", $e_from_stamp), date("d", $e_from_stamp), date("Y", $e_from_stamp))==false OR $e_to_stamp<$e_from_stamp) { $DatenOK = 0; $error .= "Gültigkeitsdauer fehlerhaft
\n"; } ##### Termin hinzufügen if(isset($_POST['add_termin'])) { array_push($e_arr['termine'], array('titel' => 'neuer Termin', 'wann' => '', 'treffpunkt' => '', 'infotext' => '', 'roles' => array(), 'error' => '')); } if($DatenOK && isset($_POST['save_einteilung'])) { $e_titel = strip_tags($e_titel); $sql = "INSERT INTO minis_einteilung (titel, from_date, to_date, infotext) VALUES ('$e_titel', '$e_from', '$e_to', '$e_infotext')"; $sql = $db->query($sql); } } ##### Alle User in Array einlesen $sql = "SELECT ID_MEMBER, memberName FROM smf_members ORDER BY memberName"; $sql = $db->query($sql); while($row = $db->fetch_array($sql)) { $all_members[$row['ID_MEMBER']] = $row['memberName']; } $smarty->assign("all_members", $all_members); $e_arr['anz_termine'] = count($e_arr['termine']); $smarty->assign("e_arr", $e_arr); $smarty->assign("content_file", "neue_einteilung.tpl"); break; case 2: //$e_id = $_GET['e_id'] ? isset($_GET['e_id'] : 0; $smarty->assign("e_id", $e_id); if(isset($PAGE[1]) AND $PAGE[1]==2) { $DatenOK = 1; $error = ""; $e_id = $_POST['e_id']; $d_titel = $_POST['d_titel']; } $smarty->assign("seiten_titel", "Neuen Dienst erstellen"); $smarty->assign("content_file", "neuer_dienst.tpl"); break; case 3: // Einteilungen Übersicht $smarty->assign("seiten_titel", "Einteilungen"); $ACTION_MENU['Neue Einteilung'] = "einteilung.php?p=1"; $smarty->assign("content_file", "einteilung.tpl"); break; default: header("Location: einteilung.php?p=3&$SID"); break; } $smarty->assign("ACTION_MENU", $ACTION_MENU); $smarty->display("html_body.tpl"); ?>



Geschrieben von LX am 27.05.2006 um 16:45:

Achtung

Sieht fast so aus, als hätte er hier den '->' Operator mal als '?>' interpretiert. Schau einfach mal, ob der korrekt so geschrieben ist.



Geschrieben von inde am 27.05.2006 um 16:48:

 

Jo... die betreffende Zeile 7 ist korrekt!

php:
1:
$smarty->assign("content_file""not_authorised.tpl");


Ja, aber das ist wohl am naheliegensten... kann sowas passieren?

[Edit]
Ich hab mal vor dieser Zeile ein echo "->"; eingefügt... und siehe da! -> wird tatsächlich also ?> interpretiert!!! Was ist da los?

[edit2]
Das Problem hat sich gelöst, hab die Datei neu gespeichert und die alte ersetzt.. ka was da los war.

Nun hab ich aber noch ne Frage zu mysql:

Ich habe in einer Tabelle unter Werte mit entsprechender ID und einem dritten Feld, welches zur Festlegung der Reihenfolge dient. ID = 1 hat also Wert = "lala" und z.B. position = 4 usw.

Nun möchte ich eine zweite Tabelle auslesen in der werte unter angabe der ID der erste Tabelle gespeichert sind. Also z.B. Wert = "huhu" und ID_TAB1 = 1. Nun möchte ich diese Werte aus Tabelle 2 in der Reihenfolge von der in Tabelle eins angegebenen Positionen für die Werte in Tabelle eins abfragen. Geht das irgendwie?



Geschrieben von LX am 31.05.2006 um 10:34:

Achtung

Mit JOINs ist das kein Problem. Beispiel:


code:
1:
2:
3:
SELECT tabelle2.wert FROM tabelle1
LEFT JOIN tabelle2 ON tabelle2.id=tabelle1.id
ORDER BY position



Geschrieben von inde am 18.06.2006 um 22:55:

 

So... ich hab die Arbeit wieder aufgenommen und prompt kommt die nächste Frage: Diesmal MYSQL.

Ich möchte aus drei Tabellen Zeilen löschen die in einer in allen drei vorkommenden Spalte den selben Wert haben. Die Spalte heißt ID_EINTEILUNG.

Ich habe es erst so versucht:

code:
1:
2:
DELETE FROM minis_einteilung, minis_epunkt, minis_emds 
 WHERE ID_EINTEILUNG LIKE '".$PAGE[2]."'


Hat nicht funktioniert... Hier die Fehlermeldung:
code:
1:
2:
3:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ID_EINTEILUNG LIKE '3'' at line 2

1064


Dann so:
code:
1:
2:
3:
4:
DELETE FROM minis_einteilung t1, minis_epunkt t2, minis_emds t3
	 WHERE t1.ID_EINTEILUNG LIKE '".$PAGE[2]."' OR
	  t2.ID_EINTEILUNG LIKE '".$PAGE[2]."' OR
	  t3.ID_EINTEILUNG LIKE '".$PAGE[2]."'


Ebenso, Fehler:
code:
1:
2:
3:
4:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE t1.ID_EINTEILUNG LIKE '3' OR t2.ID_EINTEILUNG LIKE '3' OR t3.ID_EI' at line 2

1064


Geht das zu lösen, so dass ich vielleicht nur eine Abfrage brauche?



Geschrieben von LX am 18.06.2006 um 23:04:

Achtung

1. Wieso LIKE und nicht =?
2. Wozu alles in eine Abfrage packen? Die enstprechend längere WHERE-Klausel macht das auch nicht performanter (und ich bin mir nicht mal sicher, ob man in einem Zug aus mehreren Tabellen löschen kann).

Also:

code:
1:
2:
3:
DELETE FROM minis_einteilung WHERE id_einteilung=$PAGE[2];
DELETE FROM minis_epunkt WHERE id_einteilung=$PAGE[2];
DELETE FROM minis_emds WHERE id_einteilung=$PAGE[2];


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH