Neue DB-Struktur, altes Problem!

Alles, was nicht in die anderen Foren passt, kannst du hier loswerden.
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

An alle die mir helfen wollen / möchten:

Die Mitgliederstatistik habe ich hinbekommen. Ich habe zwar einige Zeit gebraucht, zu begreifen, dass die Berechnung des Geburtstages nur einmal durchgeführt werden darf, aber immerhin. :?

Mit den zusätzlichen Angaben ist sie sogar besser als vorher -> Danke Matze :D

Viele Grüße
Gerhard
Jochen
Team
Beiträge: 1506
Registriert: 22. Feb 2006, 18:11

Beitrag von Jochen »

Hallo Gerhard,

keine Sorge mir war nur heute Morgen kein besserer Wort eingefallen, deswegen hatte ich die Anführungszeichen benutzt. Sorry aber war nicht ganz ernst gemeint ;-).

Vielleicht find ich am Wochenende Zeit mir die einzelnen Dinge mal genauer anzuschauen.

Gruß Jochen
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Alles klar, kein Problem!

Ich weis, dass ich mit meinen Ideen ziemlich stressig bin.

Gruß
Gerhard
Jochen
Team
Beiträge: 1506
Registriert: 22. Feb 2006, 18:11

Beitrag von Jochen »

Hallo,

da will ich mal ans kleine Wiedergutmachung versuchen einen kleinen Beitrag zu Leisten. Hab wohl nicht getestet.

Code: Alles auswählen

include_once($_SERVER['DOCUMENT_ROOT']. "/admidio/adm_program/system/common.php");

//dieses Jahr
$this_year = date("Y");

function more_than_years($years, $intra_day)
{
   $intra_year = substr($intra_day,0,4);
   if($this_year - $intra_year < $years)
   {
   	return true;
   }
   else
   {
   	return false;
   }
}

$sql = "genau wie vorher";

$result = $g_db->query($sql);

echo "<h2>Seit mindestens 15 Jahren Mitglied</h2>"

while($row = $g_db->fetch_array($result))
{
   //Klein erklährung
   //Hier wird ein Userobjekt erzeugt welches alle Informationen über den User hat
   $user = new User($g_db, $row['usr_id']);
   
   //Jetzt wird z.B. das Eintrittsdatum abgefragt
   $intra_day = $user->getValue("Eintrittsdatum");//Hier deinen Feldnamen eintragen
   
	if(more_than_years(15, $intra_day))
	{
		echo $user->getValue("Nachname").", ".$user->getValue("Vorname")." seit ".$intra_day;
	}
}
Das Sql-Statement kannst du von vorher benutzen. Das mit den Userobjekten ist zwar etwas getrixt aber einfacher.

Wie fit bist Du denn in PHP? Auf diesem Weg kannst du dir nämlich eigentlich alles mit dem gleichen SQL-Statement zusammenbauen.

Gruß Jochen
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hi Gerhard,

wenn die Abfrage jetzt funktioniert ist es doch prima. Und Du bist für weitere Abfragen vermutlich auch etwas schlauer geworden. :wink:

Gruss,
Matze

Ps. Gern geschehen.
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Naja soviel schlauer bin ich noch nicht, aber ich lerne! Das ist zumindest das Positive daran.

Zu Jochens Abfrage bin ich jetzt noch nicht gekommen, da ich mich mit dem Problem der leeren Zeilen rumgerissen habe. Da müsst Ihr unbedingt mal nachsehen.

Schau mal hier:

http://forum.admidio.org/viewtopic.php?p=6707#6707

Ich brauch die User halt nicht mehr in der Historie und lösche sie darum komplett.

Gruß
Gerhard
Zuletzt geändert von Gerhard0964 am 21. Dez 2008, 17:52, insgesamt 1-mal geändert.
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Jochen,

wozu Weihnachten doch alles gut ist - ich habe heute morgen die Zeit, mich mit der Abfrage zu beschäftigen.

Nachdem ich hier:
echo "<h2>Seit mindestens 15 Jahren Mitglied</h2>";
noch ein Semikolon am Ende gesetzt hatte lief die Abfrage. Hier das Ergebnis:


Bild

Davon mal abgesehen, dass die Umlaute nicht richtig angezeigt werden, wirft die Abfrage kein Datum aus. Stellt sich jetzt die Frage, ob ich Dich richtig verstanden habe. Du hast hier gesagt:
//Jetzt wird z.B. das Eintrittsdatum abgefragt
$intra_day = $user->getValue("Eintrittsdatum");//Hier deinen Feldnamen eintragen


Das habe ich dann so gelöst:
//Jetzt wird z.B. das Eintrittsdatum abgefragt
$intra_day = $user->getValue("20");//Hier deinen Feldnamen eintragen
Hier jetzt mal meine Daten aus der DB genauer adm_user_data:


Bild

Hier habe ich die "20" her. Ist das so richtig? Wenn ja, warum dann keine Ausgabe?

Ich habe aber noch ein Problem: Es sind zu viele Namen. Ich hatte die Ausgabe so gestaltet, dass ich die Mitglieder in fünf Jahres Schritten erhalten habe. Also immer von 15 - 19, 20 - 24, 25 - 29 Jahren usw.

Ich wollte das dann so lösen:
if(between("15" and "19", $intra_day))
leider mit dem Erfolg:
Fatal error: Call to undefined function: between() in /homepages/6/d137089371/htdocs/php/15_jahre_neu.php on line 53
Wie kann ich das noch machen?

----------------------------------------------------

Zum Thema PHP: Sagen wir es mal so: Ich übe noch. Ich habe zumindest die Ausgabe jetzt in einer Reihe untereinander.

Das Einbinden solch einer Ausgabe in eine Tabelle stellt mich noch vor Probleme, aber ich denke, dass ich das noch hinbekomme. :?

Gruß
Gerhard
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Jochen,

kaum hatte ich die Antwort losgejagt, kam mir auch schon die Erleuchtung, warum die function nicht lief: Ich hätte es oben auch ändern sollen. Gut das habe ich getan, aber leider dann doch ohne Erfolg. Ich habe das gleiche Ergebnis erhalten. Kurz alle Mitglieder die mind. 15 Jahre im Verein sind. Und natürlich erneut ohne Eintrittsdatum.

Gruß
Gerhard
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Jochen,

ich bin wieder etwas weiter. Hier mal die komplette Abfrage:
<?php
include_once($_SERVER['DOCUMENT_ROOT']. "/admidio_neu/adm_program/system/common.php");

//dieses Jahr
$this_year = date("Y");

function between($years, $intra_day)
{
$intra_year = substr($intra_day,0,4);
if($this_year - $intra_year < $years)
{
return true;
}
else
{
return false;
}
}

$sql ="SELECT usr_id, row1id1.usd_value, row4id2.usd_value, row7id10.usd_value, row10id11.usd_value, rol_id
FROM ". TBL_ROLES. ", ". TBL_CATEGORIES. ", ". TBL_MEMBERS. ", ". TBL_USERS. "
LEFT JOIN adm_user_data row1id1 ON row1id1.usd_usr_id = usr_id
AND row1id1.usd_usf_id = 1
LEFT JOIN adm_user_data row4id2 ON row4id2.usd_usr_id = usr_id
AND row4id2.usd_usf_id = 2
LEFT JOIN adm_user_data row7id10 ON row7id10.usd_usr_id = usr_id
AND row7id10.usd_usf_id = 10
LEFT JOIN adm_user_data row10id11 ON row10id11.usd_usr_id = usr_id
AND row10id11.usd_usf_id = 11
WHERE rol_id in (2)
AND rol_valid = 1
AND rol_cat_id = cat_id
AND cat_org_id = 1
AND mem_rol_id = rol_id
AND mem_valid = 1
AND mem_usr_id = usr_id
AND usr_valid = 1
ORDER BY row1id1.usd_value ASC";

$result = $g_db->query($sql);

echo "<center><h1>Seit mindestens 15 Jahren Mitglied</h1></center>";

while($row = $g_db->fetch_array($result))
{
//Kleine erklärung
//Hier wird ein Userobjekt erzeugt welches alle Informationen über den User hat
$user = new User($g_db, $row['usr_id']);

//Jetzt wird z.B. das Eintrittsdatum abgefragt
$intra_day = $user->getValue("Mitglied seit");//Hier deinen Feldnamen eintragen

if(between(15, $intra_day))
{
echo $user->getValue("Nachname").", ".$user->getValue("Vorname")." seit ".$intra_day;
echo "<br>";
}
}
?>
Das Ergebnis sieht jetzt so aus:


Bild

Davon abgesehen, dass es nicht zentriert ist, sieht das engl. Datum auch nicht gut aus. Was die Mitglieder angeht, ignoriert die Abfrage ncoh immer eine Begrenzung. Wenn ich hier:
if(between(15, $intra_day))
das so schreibe:
if(between(15 AND 19, $intra_day))
Bringt er mir kein Datum mehr?! :?

Woran liegt das? An der "Function" an sich?

Gruß
Gerhard
Jochen
Team
Beiträge: 1506
Registriert: 22. Feb 2006, 18:11

Beitrag von Jochen »

Hallo Gerhard,

nur ganz kurz bevor ich in den Urlaub abdüse. Nur weil Du was anderes in die Funktion reingiebst macht sie ja noch nichts anderes. Das AND ist jedenfalls ganz falsch, das hast Du wohl von SQL übernommen, bei PHP geht das so nicht.

Im neune Jahr guck ich mir es nochmal an. Guten Rutsch.

Gruß Jochen
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Jochen,

ich sag schon mal DANKE und wünsche Dir einen schönen Urlaub und einen guten Rutsch!

Gruß
Gerhard
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo Gerhard,

um die Mitglieder seit 15 Jahren zu bekommen, dann kannst du auch einfach dein SQL-Statement durch eine Zeile an der richtigen Stelle erweitern. Und zwar muss folgende Zeile hinter die Zeile mit der usf_id, die dein Eintrittsdatum repräsentiert. Ich weiß jetzt nicht, welche ID bei dir das Eintrittsdatum hat, nehmen wir mal an es wäre das mit der ID 11, dann steht jetzt folgender Code in deinem Statement:

Code: Alles auswählen

AND row10id11.usd_usf_id = 11 
danach fügst du nun folgenden Code ein

Code: Alles auswählen

and str_to_date(row10id11.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year)
somit werden dir alle Mitglieder, die länger als 15 Jahre dabei sind, angezeigt. Diese Zeile kannst du natürlich entsprechend manipulieren und auch auf andere Felder anwenden.

Gruß
Markus
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Markus,

ich habe die Zeilen jetzt mal eingefügt. Passt aber so auch nicht.
Wenn ich das so mache:
$sql ="SELECT usr_id, row1id1.usd_value, row4id2.usd_value, row7id10.usd_value, row10id11.usd_value, rol_id
FROM ". TBL_ROLES. ", ". TBL_CATEGORIES. ", ". TBL_MEMBERS. ", ". TBL_USERS. "
LEFT JOIN adm_user_data row1id1 ON row1id1.usd_usr_id = usr_id
AND row1id1.usd_usf_id = 1
LEFT JOIN adm_user_data row4id2 ON row4id2.usd_usr_id = usr_id
AND row4id2.usd_usf_id = 2
LEFT JOIN adm_user_data row7id10 ON row7id10.usd_usr_id = usr_id
AND row7id10.usd_usf_id = 10
LEFT JOIN adm_user_data row10id11 ON row10id11.usd_usr_id = usr_id
AND row10id20.usd_usf_id = 20
AND str_to_date(row10id20.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year)

WHERE rol_id = 2
AND rol_valid = 1
AND rol_cat_id = cat_id
AND cat_org_id = 1
AND mem_rol_id = rol_id
AND mem_valid = 1
AND mem_usr_id = usr_id
AND usr_valid = 1
ORDER BY row1id1.usd_value ASC";
meine ID ist 20, erhalte ich das:
S Q L - E R R O R

CODE: 1054
Unknown column 'row10id20.usd_usf_id' in 'on clause'

B A C K T R A C E

FILE: adm_program/system/mysql_class.php
LINE: 77
CALL: mysqldb->db_error()

FILE: homepages/6/d000000001/htdocs/php/15_jahre_neu.php
LINE: 43
CALL: mysqldb->query()
Ändere ich es dann so ab:
....
LEFT JOIN adm_user_data row10id11 ON row10id11.usd_usr_id = usr_id
AND row10id11.usd_usf_id = 20
AND str_to_date(row10id11.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year)
WHERE rol_id = 2
.....
Erhalte ich wie bisher alle Mitglieder von A-Z mit Ihren Eintrittsdaten. :?

Wenn ich dann noch in der Zeile darüber die 11 durch die 20 ersetzte:
AND row7id10.usd_usf_id = 10
LEFT JOIN adm_user_data row10id20 ON row10id20.usd_usr_id = usr_id
AND row10id20.usd_usf_id = 20
AND str_to_date(row10id20.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year)
WHERE rol_id = 2
erhalte ich ebenfalls den SQL-Fehler

Gruß
Gerhard *dervölligratlosist*
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo Gerhard,

ich wusste nicht , dass das entsprechende Feld (ID20) noch nicht in deinem SQL-Statement aufgeführt war. Dann musst du dein altes Statement 3 Posts vorher nehmen und folgendes Statement hinter dein ID11 hinzufügen:

Code: Alles auswählen

JOIN adm_user_data row10id20 ON row10id20.usd_usr_id = usr_id
AND row10id20.usd_usf_id = 20
AND str_to_date(row10id20.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year) 
Achte bitte darauf, dass hier das LEFT bewusst fehlt. Dies ist fast der Code deines 3. Versuches. Du bekommst den SQL-Fehler da du deine ID11 entfernt hast, aber im Select-Teil doch darauf zugreifst. Wenn du den ID11 Teil wieder hinzufügst, bzw. dein altes funktionierendes Statement nimmst und nur den Teil hier hinzufügst, sollte es laufen.

Gruß
Fasse
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Ich weis, ich nerve, aber leider ist immer noch Essig!
$sql ="SELECT usr_id, row1id1.usd_value, row4id2.usd_value, row7id10.usd_value, row10id11.usd_value, rol_id
FROM ". TBL_ROLES. ", ". TBL_CATEGORIES. ", ". TBL_MEMBERS. ", ". TBL_USERS. "
LEFT JOIN adm_user_data row1id1 ON row1id1.usd_usr_id = usr_id
AND row1id1.usd_usf_id = 1
LEFT JOIN adm_user_data row4id2 ON row4id2.usd_usr_id = usr_id
AND row4id2.usd_usf_id = 2
LEFT JOIN adm_user_data row7id10 ON row7id10.usd_usr_id = usr_id
AND row7id10.usd_usf_id = 10
LEFT JOIN adm_user_data row7id10 ON row7id10.usd_usr_id = usr_id
AND row7id10.usd_usf_id = 10
LEFT JOIN adm_user_data row10id11 ON row10id11.usd_usr_id = usr_id
AND row10id11.usd_usf_id = 11
JOIN adm_user_data row10id20 ON row10id20.usd_usr_id = usr_id
AND row10id20.usd_usf_id = 20
AND str_to_date(row10id20.usd_value, '%Y-%m-%d') < date_add(sysdate(), interval -15 year)
WHERE rol_id = 2
AND rol_valid = 1
AND rol_cat_id = cat_id
AND cat_org_id = 1
AND mem_rol_id = rol_id
AND mem_valid = 1
AND mem_usr_id = usr_id
AND usr_valid = 1
ORDER BY row1id1.usd_value ASC";

$result = $g_db->query($sql);
Ergibt:
S Q L - E R R O R

CODE: 1066
Not unique table/alias: 'row7id10'

B A C K T R A C E

FILE: adm_program/system/mysql_class.php
LINE: 77
CALL: mysqldb->db_error()

FILE: homepages/6/d000000001/htdocs/php/15_jahre_neu.php
LINE: 47
CALL: mysqldb->query()
:?

Gruß
Gerhard
Antworten