PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1 - Altersbeschränkung einbauen



chackie
25.07.2013, 22:11
Guten Abend,
ich bin mit meinem Projekt nun fast fertig und mir ist ein wichtige Fehler aufgefallen, beziehungsweise was eig. zu jeder Anmeldung gehört.
Gerade in diesem Bereich wo man Slots spielen kann...
Gibt es schon ein Alterbeschränkungsaddon oder eine Erweiterung für die Anmelden.php ?

Und wenn nicht, würde sich jemand bereit erklären diese Erweiterung einzubauen?

Ich freue mich auf eure Rückmeldungen.

chackie
26.07.2013, 13:41
Keiner der helfen kann?

jpwfour
26.07.2013, 14:28
Wie stellst du dir das vor?
Eine Checkbox mit "Ich bin 18+",
oder eine Eingabemöglichkeit für das Gebursdatum
oder Upload für Personalausweis (so ein Addon hab ich iwo schonmal gesehen^^)
oder Anbindung an einen Altersverifikationsdienst (https://www.sofort.com/ger-DE/kaeufer/sofort-ident/, ....)

chackie
27.07.2013, 21:12
Hi jpwfour,
danke für die Antwort :)
Eine Eingabemöglichkeit für das Gebursdatum wäre perfekt.
Das der Nutzer 18 Jahre alt muss steht zwar in den AGBs, aber das ist nicht Rechts sicher... deswegen benötige ich unbedingt eine Eingabe des Gebursdatums.

Würde mich freuen, wenn du das hin kriegen könntest :)

SilentRunner
28.07.2013, 10:41
benötige ich unbedingt eine Eingabe des Gebursdatums.


die angebane wirste dann auch glauben müssen, kontrollieren kannste das nicht.

jpwfour
28.07.2013, 13:20
Ist schon eine Nickpage vorhanden (außer der im Grundscript)? Die meisten Nickpage Addons bringen schon Speichermöglichkeit fürs Geburtsdatum mit, dann kann man das einfach in die Anmeldung integrieren und brauchts dann nicht doppelt.

chackie
28.07.2013, 13:21
Hi SilentRunner,
das stimmt natürlich...aber es ist gang und gebe, dass der Nutzer sein Geburtsdatum selber eingeben muss.
So sichert der Betreiber sich ab.

Also wie gesagt, wenn es jemand dazu programmieren könnte würde ich auch Lose dafür zahlen!
Angebote nehme ich gerne entgegen :)

Ein Nickpage Addon ist noch nicht vorhanden.
Danach habe ich auch schon gesucht, aber keins gefunden bei den man das Geburtsdatum angeben kann.

jpwfour
28.07.2013, 14:06
Nickpage Ufisch: http://www.designerscripte.net/downloads.php?do=file&id=59 installieren nach Anleitung.

Dann Copy&Paste die entsprechenden Stellen in die content/intern/anmelden.php aus der content/konto/nickpage.php, also die 3 Formularfelder.

Also von:

<tr>
<td><b>Geburtsdatum: &nbsp;</b></td> bis

<input name="date_year" value="<?=$nickpage['date_year'];?>" size="3">
</td>
</tr> (Zeile 61 bis 115) kopieren und in der anmelden.php an gewünschter Stelle im HTML Code/Tabelle einfügen, bspw. zwischen Newsletter und AGB Bestätigung:

<tr>
<td class="main"><b>Newsletter:</b></td>
<td class="main"><select name="newsletter"><option value="1" <? if ($_POST['newsletter'] == "1") { echo 'selected';}?>>Ja</option><option value="0" <? if ($_POST['newsletter'] != "1") { echo 'selected';}?>>Nein</option></select></td>
</tr>
<!-- hier die kopierten zeilen einfügen -->
<tr>
<td class="main"><b>AGB`s gelesen und akzeptiert:</b></td>
<td class="main"><select name="agb"><option value="ja" <? if ($_POST['agb'] == "ja") { echo 'selected';}?>>Ja</option><option value="nein" <? if ($_POST['agb'] != "ja") { echo 'selected';}?>>Nein</option></select></td>
</tr>

Die Prüfung, ob schon 18, nach der Zeile:

if ($schnittstelle['anfragen_tag'] != 0 and $schnittstelle['anfragen_tag'] <= $s_verbrauch) $error = 'Die Schnittstellenanfragen sind für heute verbraucht!!!<br>';}
einfügen:


$_POST['date_year'] = (int)$_POST['date_year'];
$_POST['date_month'] = (int)$_POST['date_month'];
$_POST['date_day'] = (int)$_POST['date_day'];
if ( $_POST['date_year'] < 1900 || $_POST['date_year'] > date('Y') ) $error .= 'Jahreszahl 4-stellig 1900 - '.date('Y').'<br>';
if ( $_POST['date_month'] < 1 || $_POST['date_month'] > 12 ) $error .= 'Monat ungültig<br>';
if ( $_POST['date_day'] < 1 || $_POST['date_day'] > 31 ) $error .= 'Tag ungültig<br>';
if ( $_POST['date_year'] > ( date('Y') -18 ) ||
( $_POST['date_year'] == ( date('Y') -18 ) && $_POST['date_month'] > date('n') ) ||
( $_POST['date_year'] == ( date('Y') -18 ) && $_POST['date_month'] == date('n') && $_POST['date_day'] > date('j') )
) {
$error .= 'Noch nicht 18<br>';
}


Eintrag in die Datenbank ebenfalls in der anmelden.php nach der Zeile:

if ($_POST['newsletter'] == 1 and $_POST['paidmails'] == 1) $mailstatus = 3;
einfügen:

db_query("INSERT ".$db_prefix."_nickpage SET
date_day = '".(int)$_POST['date_day']."',
date_month = '".(int)$_POST['date_month']."',
date_year = '".(int)$_POST['date_year']."',
uid=".(int)$_POST['uid']."");

Vorher Backup der anmelden.php machen und anschließend testen, ob das auch so stimmt ^^

chackie
28.07.2013, 15:33
Hi danke, das hat super geklappt!
Allerdings müsste man das ja nun noch mit der Anmeldung verbinden.
Also das die dort direkt die Eingaben machen können und nicht erst wenn man bereits angemeldet ist.
Könntest du mir da helfen?

chackie
28.07.2013, 20:01
Wo genau muss der Code rein, für die Prüfung ob 18?
Habe es an verschiedenen Stellen ausprobiert, aber klappt noch nicht.
Und in welchen Datenbank Teil muss der SQL Befehl?
Habe noch nicht gefunden, wo die anderen Daten von der Anmeldung eingetragen werden.

Ich habe es bei "vms_userdaten" versucht, aber da bekomme ich diese Meldung:
#1064 - 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 'db_query("INSERT ".$db_prefix."_nickpage SET date_day = '".(i' at line 1

NeoGriever
28.07.2013, 20:43
Hab mal eine kleine Funktion gebaut, die dir ziemlich helfen wird.

Diese prüft folgenden Part des Personalausweises (neu und alt) auf gültigkeit und darauf, ob die person 18 ist.

http://i86.img-up.net/welchenumm444d.png

Bitteschön:
function checkAge($personum) {
$sum = 0;
for($i = 0;$i < 6;$i++) {
$sum += (intval(substr($personum,$i,1)) * intval(substr("731731",$i,1)));
}
if(intval(substr($personum,6,1)) == intval(substr((string)$sum,-1))) {
$age = intval((time() - mktime(0, 0, 0, intval(substr($personum,2,2)), intval(substr($personum,4,2)), intval(substr($personum,0,2)))) / 31536000);
return($age >= 18);
}else{
return(false);
}
}
checkAge("6408125");

Viel Spaß damit.

PS: Ich werde den Code später hier wieder entfernen, um hackern und fakern weniger material zu liefern, diese funktion zu umgehen :)

Ich könnte das gesamte System auch noch weiterschreiben zum validieren des gesamten Personalausweises. Aber das würd ich dann wohl nur gegen Bezahlung machen. Ist nämlich dann ne ganz schöne Rechenaufgabe. :)

chackie
28.07.2013, 20:52
Hi NeoGriever,
in welchen Bereich muss ich das einbauen?

Ich würde das eher für den Internen Bereich nehmen, unter Profil verifizieren.
Möchte das in zwei Teile auf teilen.
1. Alter
2. Adresse

Zum Anmelden, reicht eine normale Abfrage des Alters. :)
Erst wenn ein Mitglied dann eine Auszahlung beantragen will, muss das Mitglied dann seine Daten verifizieren.
Und da wäre der Code nicht schlecht :)

Aber das ist erstmal nach hinten gestellt... kann man später immer noch dazu bauen.
Aktuell will ich nur eine normale Eintragung des Alters mit 18+ Prüfung.
Und da brauche ich eben noch Hilfe. (Siehe letzter Beitrag von mir)

NeoGriever
28.07.2013, 21:02
Zuerst solltest du in der /content/intern/anmelden.php nach dem Part suchen, wo alles eingespeichert wird.

Dort fügst du das dazuspeichern des Geburtsdatums hinzu. Datenbank-Tabelle anpassen nicht vergessen.

Etwas weiter unten kannst du das Eingabefeld für das Geburtsdatum mit einbauen. Dürfte leicht ersichtlich sein, wo es hin kann.

Achte darauf, dass du die POST-Daten oben auch korrekt abfängst.

Nun kannst du mit folgender Codezeile das Alter des Benutzers berechnen:


$tag = $_POST["tag"];
$monat = $_POST["monat"];
$jahr = $_POST["jahr"];
$age = intval((time() - mktime(0, 0, 0, intval($monat), intval($jahr), intval($tag))) / 31536000);

Damit prüfst du dann mittels if($age >= 18), ob er genau 18 oder älter ist.

Ist dies der Fall, die Daten in die Datenbank übertragen. Andernfalls einen Fehler ausgeben. Fertig.

jpwfour
29.07.2013, 14:02
...


...;
$age = intval((time() - mktime(0, 0, 0, intval($monat), intval($jahr), intval($tag))) / 31536000);

...

Nicht jedes Jahr hat 365 Tage! Insofern wird das Alter so nicht ganz korrekt sein.

@chackie (http://www.designerscripte.net/member.php/6145-chackie): hab Beitrag #8 editiert, sollte jetzt deutlicher sein, was wo hingehört.

NeoGriever
29.07.2013, 16:20
Das Schaltjahr hat erst dann eine gravierende Auswirkung, wenn man wirklich genau innerhalb dieser 5-Tage-Verschiebung ohne das Schaltjahr geboren wurde. Rechne dir mal aus, wann man geboren sein muss, um heute obwohl man 18 ist mit dieser funktion als 17 eingestuft zu werden ...

Man kann natürlich anstelle von 365 tagen als zeiteinteilung einfach 365.25 tage festlegen.

chackie
29.07.2013, 19:33
Vielen dank an jpwfour,
deine Anleitung hat super geklappt!
Funktioniert ohne Probleme.

@NeuGriever ebenfalls vielen dank! :)

jpwfour
30.07.2013, 14:44
das schaltjahr hat erst dann eine gravierende auswirkung, wenn man wirklich genau innerhalb dieser 5-tage-verschiebung ohne das schaltjahr geboren wurde....
Man kann natürlich anstelle von 365 tagen als zeiteinteilung einfach 365.25 tage festlegen.

hä? Nö.....

NeoGriever
30.07.2013, 19:53
Äh. Doch!

365 + 365 + 365 + 365 = 0 Tage Unterschied
365 + 365 + 365 + 366 = 1 Tag Unterschied

Wenn man 18 oder älter sein muss, durchlebte man mindestens 4 Schaltjahre. Bei 4 Schaltjahren, die nicht mitgerechnet wurden, würde das heißen, dass man genau 4 Tage jünger berechnet wird. Somit ist es nur für Leute relevant, welche innerhalb eines 4-Tages-Zeitraums geboren wurden, welche dann genau auf diesen Punkt beruhen.

Behoben werden kann es, wenn man einfach anstelle von 365 Tagen pro Jahr, 365,25 Tage pro Jahr rechnet. Was dazu führt, dass jedes 4te Jahr als Schaltjahr zählt. Fehlerquote dann nur noch bei grob 0.075%. Natürlich kann man auch eine Schleife durchballern lassen, die das haargenau nachberechnet. Dann läge die Fehlerquote genau bei 0%.

Oder fehlt da irgendwas an meiner Berechnung?

Worka
30.07.2013, 21:24
... Somit ist es nur für Leute relevant, welche innerhalb eines 4-Tages-Zeitraums geboren wurden, welche dann genau auf diesen Punkt beruhen.

...

Relevant ist der Fehler für alle unter 18, 4-5 Tage vor Ihrem 18. Geburtstag.
Es wird ja jeder User, welcher grade an dem 18. Lebensjahr "kratzt", 4-5 Tage zu alt eingestuft.

Der Fehler ist natürlich gering, aber eine korrekte Abfrage ob das Geburtsdatum des Users mehr oder weniger als 18 Jahre in der Vergangenheit liegt ist ja möglich.

Deine Funktion ist natürlich trotzdem eine gute Idee.

NeoGriever
31.07.2013, 00:22
Für nen Free-Script akzeptabel :)

Dazu kommt noch, dass ich das Script ja mal so nebenbei gebastelt habe. Man kann natürlich vom geburtsdatum aus bis zum heutigen zeitpunkt die schaltjahre berechnen und jeweils 1 tag pro schaltjahr in die teilung hinzufügen. Wäre wohl die effektivere möglichkeit.

Worka
31.07.2013, 18:05
Auf jeden Fall eine gute Idee.
Was ich diesbezüglich noch interessant finde und vor 2 Minuten erst gelesen habe:
Die Unixzeit berücksichtigt Schaltsekunden. Diese würden das Ergebniss also nicht verfälschen.

jpwfour
31.07.2013, 18:45
Allerdings, wenn man es 100% genau nehmen würde, berücksichtigen die Zeitstempel die Zeitzone nicht, da diese immer in GMT sind.


if ( $_POST['date_year'] > ( date('Y') -18 ) ||
( $_POST['date_year'] == ( date('Y') -18 ) && $_POST['date_month'] > date('n') ) ||
( $_POST['date_year'] == ( date('Y') -18 ) && $_POST['date_month'] == date('n') && $_POST['date_day'] > date('j') )

Wenn jemand eine kürzere aber dennoch korrekte Version hat und/oder Fehler an der Version findet, gerne.

Was man basierend auf den Zeitstempeln machen könnte in einer Zeile, wäre etwas der Art:

strtotime ("+18 years", mktime(0, 0, 0, $_POST['date_month'], $_POST['date_day'], $_POST['date_year']) ) > time()

Was gar nicht geht, ist in Beitrag #13 (http://www.designerscripte.net/showthread.php/26142-1-Altersbeschr%C3%A4nkung-einbauen?p=111977&viewfull=1#post111977) , da die Argumente 5&6, Tag & Jahr, der Methode mktime (http://php.net/manual/de/function.mktime.php) , vertauscht wurden. Wird wohl kaum was sinnvolles bei rauskommen, aber direkt adressierte Kritik ist mir ja nu nicht mehr erlaubt ^^
Also lassen wir das einfach so stehen und freuen uns über jedes Schaltjahr, das vorüberzieht....

NeoGriever
01.08.2013, 07:22
Ja sorry, da is mir halt im 13 Beitrag ein kleiner Fehler mit der Reihenfolge der Werte von mktime passiert.

Dass du das erst jetzt erwähnst, sollteste nicht gleich davon sprechen, dass du keine kritik ausüben dürftest. Kritik im übrigen schön und gut, aber wenn dann bitte konstruktive Kritik. ;)

Dein Vorschlag mit den mktime und dem +18 years ist nicht übel.

Xenon
03.08.2013, 18:34
Wenn ich mal kruz mich einmischen dürfte, es gibt im internet haufen von solcher Generatoren, wo man sich sein wunsch geburstag eingibt und er passend dazu die "Prüfziffer/Summe" berechnet und ausspuckt, mit der jeder user <18 sich anmelden könnte. Eine Idee wäre die Postident Prüfung oder Kopie des Persos (contra: kann ich auch von den eltern/bekannten/freunden nehmen)

Lokutos
05.08.2013, 18:23
PHP hat doch so schöne Möglichkeiten...

Jetzt datum - 18 Jahre und dann schauen ob grösser oder kleiner dem geb-Datum...


$date = '30/10/1994';
$validDate = strtotime("-18 years");

$date = DateTime::createFromFormat('d/m/Y', $date);
$date = $date->format('Y-m-d');
$date = strtotime($date);

if ($date < $validDate) {
echo 'Über 18';
} else {
echo 'Schade';
}

man beachte, php-code extrem simpel gehalten..