Perso Check Script erweitern?

Shorty1968

Erfahrenes Mitglied
Hallo,
ich möchte in meinem Shop für einen Ab 18 Jahren bereich,ein Script einstezen welches ich über Google gefunden habe Personalausweis überprüfen – PHP lernen , ich möchte das man bei einem Erfolgreicher Überprüfung in eine andere Gruppe verschoben wird und der Admin des Shops eine Mail bekommt das sich ein Kunde erfolgreich Freigeschaltet hat mit angaben sprich Name des kunden.

Aber das übersteigt völlig meine Fähigkeiten und ich hoffe das wir da zusammen etwas machen können?
 
Lösung
So. Es ist geschafft.
Nur wäre es schön wenn einer von den Php Profis da nochmal rüber kuckt wegen Sql injection und was da noch gibt.

Erstens muss die Datei

shoproot/templates/tpl_modified/module/product_info/product_info_v1.html
PHP:
         <a href="../perso_check.php" target="popup" onclick="window.open(' ','popup','scrollbars=yes, width=800, height=700')">Perso Check (PopUp)</a>
in dieses
PHP:
    <a href="{'perso_check.php'|xtc_href_link}" target="popup" onclick="window.open(' ','popup','scrollbars=yes, width=800, height=700')">Perso Check (PopUp)</a>
geändert werden.

Dann sieht das Haupt Script jetzt so aus
PHP:
<?php
include ('includes/application_top.php');
/*
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
*/...
*EDIT*
Erledigt habe es hin bekommen,vielen dank für eure Hilfe nun sollte alles Passen.

@basti1012
Schau bei mir noch mal bitte irgendwas stimmt wirder nicht,das Folgende und der Gruppen Wechsel wird nicht angezeigt.
Code:
if(isset($_SESSION['customer_id']) AND isset($_SESSION['customer_email_address'])){
echo "Du bist eingeloggt und kannst deine Personalien jetzt Personaliesieren";
}else{
die("Du  mußt eingelogt sein um die Personalausweis Daten anzugeben!!<br /><a href='login.php'>>>Zum Login<<</a>");
}
Startseite - Schnaepchenpiet
 
Zuletzt bearbeitet:
du meinst das er jetzt sagt das du nicht eingeloggt bist ?

was steht den da wenn du das ausgeben tust
Code:
echo '<pre>';
print_r($_SESSION);
echo '</pre>';

Aber schick mir mal die datein ich baue das mal in shop ein dann kann man das besser sehen was da los ist .
 
Das es nicht funktioniert liegt an den ganzen Datenbank kram. In den Script von mir bauen wir die verbindung ja in den Script mit auf. Bei deinen Template Script fällt das ja alles weg weil du ja die Datenbank verbindung von Shop nutzen willst. Ich weiß nicht wie man das jetzt nennt , aber im Shop sieht das alles ungefähr so aus
Code:
$idin=xtc_db_input($id_der_eingelogt_ist);
$mailin=xtc_db_input($email_der_eingelogt_ist);
$check_perso = xtc_db_query("UPDATE customers SET customers_status='5' WHERE customers_id='$idin'  AND customers_email_address='$mailin'");
 // var_dump($check_perso);
       echo '<pre>';
print_r($check_perso);
echo '</pre>';
    $check_PERSONAL = xtc_db_fetch_array($check_perso);

NUR ALS BEISPIEL.
Will damit sagen das es so wie es jetzt bei dir ist nicht gehen kann. Wenn dann den ganzen Datenbank kram von mein Script nehmen, oder etwas warten bis ich da durchgeblickt habe.
Vieleicht ist ein anderer in der Zeit schneller der da durchblickt ,wäre auch sehr gut.

Aufjedenfall weiß ich wo es dran liegt und wo ich jetzt suchen muss um das zu beheben
 
Ging doch etwas einfacher als erwartet.
Erstmal ein Hinweiß. Du rufst das Perso Script einmal im gleichen Fenster auf und einmal im Popup.
Wenn du im Popup machst ist alles ok. Im gleichen Fentster bekommst du ein Fehler von Javascript ( Zeile 214 ) weil es das Parent dann ja nicht mehr gibt. Da solltest du vieleicht eine if abfrage rein bauen oder so ob du im Popup bist oder oder im gleichen Fenster damit der Fehler nicht mehr kommt.

Jetzt Zum Script
2 Zeile gibst du den erwünschten neuen Status ein


PHP:
<?php
$status_vergabe=5;//hier den neuen Status eingeben der vergeben werden soll
include ('includes/application_top.php');

$smarty = new Smarty;

if (!isset($_SESSION['customer_id'])) {
  xtc_redirect(xtc_href_link(FILENAME_LOGIN, '', 'SSL'));
}

require (DIR_WS_INCLUDES.'header.php');
require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php');

$breadcrumb->add('Personalausweis Check', xtc_href_link('perso_check.php', '', 'SSL'));
//echo '<pre>';
//print_r($_SESSION);
//echo '</pre>';

if(isset($_SESSION['customer_id']) AND isset($_SESSION['customer_email_address'])){
    echo "Du bist eingeloggt und kannst deine Personalien jetzt Personaliesieren";
?>
<?php
}else{
    die("Du  mußt eingelogt sein um die Personalausweis Daten anzugeben!!<br /><a href='#'>Login Url hier rein</a>");
}

function check_number($id, $checknumber) {
$p = 7;
$sum = 0;
for($i=0; $i < strlen($id); $i++) {
$char = $id{$i};

if($char >= '0' && $char <= '9')
$int = intval($char);
else
$int = ord($char)-55;
$sum += $int*$p;

if($p==1)
$p=7;
else if($p==3)
$p=1;
else if($p==7)
$p=3;
}

$last_number = substr(strval($sum), -1);
return $last_number == $checknumber;
}

//Gibt die Art (neu vs. alt) des Personalausweis zurück
function perso_type($id) {
$splits = explode(" ", strtoupper($id));
if(strlen($splits[0]) == 11 && strlen($splits[1]) == 7 && strlen($splits[2]) == 7 && strlen($splits[3]) == 1) {
return 'old';
} else if(strlen($splits[0]) == 10 && strlen($splits[1]) == 7 && strlen($splits[2]) == 8 && strlen($splits[3]) == 1) {
return 'new';
} else {
return 'unknown';
}
}

//Sind die Prüfziffern gültig
function perso_checksum($id) {
$splits = explode(" ", strtoupper($id));

$checksums = array();
$perso_type = perso_type($id);

if($perso_type == 'unknown') {
return false;
}

$checksums[] = array(substr($splits[0],0,9), substr($splits[0],9,1));
$checksums[] = array(substr($splits[1],0,6), substr($splits[1],6,1));
$checksums[] = array(substr($splits[2],0,6), substr($splits[2],6,1));
$checksums[] = array(substr($splits[0],0,10).substr($splits[1],0,7).substr($splits[2],0,7), $splits[3]);

//Überprüfung der Checksummen
foreach($checksums as $checksum) {
if(!check_number($checksum[0], $checksum[1])) {
return false;
}
}

   return true;
}

//Ist der Perso noch gültig?
function perso_gueltig($id) {
   $splits = explode(" ", $id);

   $valid_until = mktime(0,0,0, substr($splits[2], 2, 2) , substr($splits[2], 4, 2) , "20".substr($splits[2], 0, 2));

   //Ist der Perso noch gültig
   if(time() > $valid_until)
      return false;
   return true;
}

//Informationen aus dem Perso beziehen
function perso_info($id) {
   $splits = explode(" ", $id);

   //$return: Ein Objekt mit den Daten aus der Ausweisnummer
   $return = new stdClass();
   $return->perso_type = perso_type($id);
   $return->geb = new stdClass();
   $return->geb->tag= $splits[1]{4} . $splits[1]{5}; //Geburtstag
   $return->geb->monat = $splits[1]{2} . $splits[1]{3}; //Geburtsmonat
   $return->geb->jahr = $splits[1]{0} . $splits[1]{1}; //Geburtsjahr
   if($return->geb->jahr > intval(date("y"))) {
$return->geb->jahr = "19".$return->geb->jahr;
   } else {
$return->geb->jahr = "20".$return->geb->jahr;
   }


   $alter = date("Y") - $return->geb->jahr;

   //Hatte er schon Geburtstag?
if( (date("n") < $return->geb->monat) OR (date("n") == $return->geb->monat AND date("j") < $return->geb->tag) ) {
$alter--;
}

   $return->alter = $alter;

   if($alter >= 18) {
      $return->volljaehrig = true;
   } else {
      $return->volljaehrig = false;
   }

   $return->ablauf = new stdClass();
   $return->ablauf->tag = $splits[2]{4} . $splits[2]{5}; //Ausweis Ablauf Tag
   $return->ablauf->monat = $splits[2]{2} . $splits[2]{3}; //Ausweis Ablauf Monat
   $return->ablauf->jahr = "20".$splits[2]{0} . $splits[2]{1}; //Ausweis Ablauf Jahr

   if($return->perso_type == 'old') {
$return->herkunft = $splits[0]{10};
   } else {
        $return->herkunft = $splits[2]{7};
   }
   //Ein Deutscher?
   if(strtolower($return->herkunft) == "d") {
      $return->deutscher = true;
   } else {
      $return->deutscher = false;
   }
   //Behördenkennzahl als Nummer
   $return->behoerdenkennzahl = substr($splits[0], 0, 4);
   return $return;
}

if(isset($_GET['check'])) {
   $perso_id = $_POST['ida']." ".$_POST['idb']." ".$_POST['idc']." ".$_POST['idd'];
   if(perso_checksum($perso_id)) {
      echo "Personalausweisnummer korrekt!<br>";

$idin=xtc_db_input($_SESSION['customer_id']);
$mailin=xtc_db_input($_SESSION['customer_email_address']);
$check_perso = xtc_db_query("UPDATE customers SET customers_status='$status_vergabe' WHERE customers_id='$idin'  AND customers_email_address='$mailin'");

//-----------Von hier

$check_customer_query = xtc_db_query("SELECT * FROM `customers` WHERE `customers_id`='$idin'");

//var_dump($check_customer_query);

if (xtc_db_num_rows($check_customer_query) >0) {

   $check_personalstatus = xtc_db_fetch_array($check_customer_query);
   $neuer_status=htmlspecialchars($check_personalstatus['customers_status']);
   if($neuer_status==$status_vergabe){
     $id_gegencheck=htmlspecialchars($check_personalstatus['customers_id']);
     $email_gegencheck=htmlspecialchars($check_personalstatus['customers_email_address']);
     
       echo "<br>Der User mit der Id= '.$id_gegencheck.'<br>
             und der Email = '.$email_gegencheck.'<br>
             hatjetztden Status '.$neuer_status.'";
     }else{
        echo "Der status  wurde nicht aktualiesiert";
     }
  } else {
       die("Error");// . mysqli_error();
  }


//-------  Bis hier ist nicht nötig wenn man auf den Gegencheck verzichten kann

  if(!perso_gueltig($perso_id)) {
      echo "<br /> <b>Perso ist abgelaufen!</b>";
   }
      echo "<br /><br /> Daten der Ausweisnummer: <pre>";
      $data = perso_info($perso_id);
      print_r($data);
      echo "</pre>";
   } else {
      echo "Personalausweisnummer falsch!<br /><br />";
   }
}else{

$smarty->assign('language', $_SESSION['language']);
$smarty->caching = 0;
$main_content = $smarty->fetch(CURRENT_TEMPLATE.'/module/perso_check.html');


$smarty->assign('main_content', $main_content);

$smarty->caching = 0;
if(!defined(RM)) $smarty->load_filter('output', 'note');
$smarty->display(CURRENT_TEMPLATE.'/index.html');

echo '<script>window.onunload = refreshParent; function refreshParent() { window.opener.location.reload(); }</script>';

include ('includes/application_bottom.php');
}
?>

Da durch das es jetzt mit über den Shop läuft ,fallen die Hinweiße aus post #57 fast alle weg.

Wäre aber nett wenn @ComFreek da auch nochmal drüber kucken kann.
Wie macht man eigentlich ein UPDATE query gegencheck ob der UPDATE funktioniert hat ?
Weil ich mache das mit einer zusätzlichen SELECT abfrage , aber das geht doch in einer abfrage oder nicht ?

@Shorty1968 ich habe im Shop dir den Admin Status zurück gegeben damit du das Script vorher testen kannst wenn du willst .
 
Zuletzt bearbeitet:
Vielen dank nun scheint es zu gehen nur die Anzeigen sind erst nach dem Ausführen zu sehen wie das du bist eingeloggt.

Genau meine ich das dieser Teil,erst nach der Überprüfung des Perso erscheint und nicht wie er soll vorher.
Code:
if(isset($_SESSION['customer_id']) AND isset($_SESSION['customer_email_address'])){
    echo "Du bist eingeloggt und die Überprüfung war erfolgreich&nbsp;&nbsp;";
}else{
    die("Du  mußt eingelogt sein um die Personalausweis Daten anzugeben!!<br /><a href='#'>Login Url hier rein</a>");
}
Ich habe den text verändert.
 
Zuletzt bearbeitet:
Stimmt ,hatte ich gar nicht mehr dran gedacht. Kucke nachher nochmal danach fals du bis dahin noch nicht hinbekommen hast . Welche echos willst du den überhaupt anzeigen lassen? Weil einige echos die ich zur überprüfung da rein gemacht habe will ja keiner sehen .
Die die() ausgabe mit den eingeloggt sein kann eigentlich auch weg weil wenn man nicht angemeldet ist greift das andere Script aus Zeile 8. Also so weit sollte der Code eigentlich gar nicht kommen das da steht "
Du mußt eingelogt sein um die Personalausweis Daten anzugeben!!"
Also bleibt ja eigentich nur noch der eine Text übrig das die überprüfung erfolgreich wahr und die dürfte ja nur nach der überprüfung kommen .

Aber ich kucke nachher nochmal da rein.

Ich habe das bei mir nochmal etwas geändert, so das auch nur die echos kommen die kommen sollen. Auserdem habe ich ein Link eingebaut der zum Artikel zurück springt.( Wenn im gleichen Fenster geladen ).
Aber vieleicht hast du das ja auch schon eingebaut ,
ich weiß ja nicht wie das bei dir jetzt aussieht und wie du dir das gedacht hast .Dein Letzter Link zum Shop geht irgendwie nicht mehr der noch in mein Browser gespeichert wahr.
 
Zuletzt bearbeitet:
Alles gut habe es selber hin bekommen,aber eines eventuell noch kann man das was ich im Screen Rot Makiert habe eventuell etwas schöner gestallten?

Das habe ich leider nicht hin bekommen.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    21,3 KB · Aufrufe: 3
$idin=xtc_db_input($_SESSION['customer_id']); $mailin=xtc_db_input($_SESSION['customer_email_address']);
$check_perso = xtc_db_query("UPDATE customers SET customers_status='$status_vergabe' WHERE customers_id='$idin' AND customers_email_address='$mailin'");
Das sind leider keine Prepared Statements, aber vielleicht unterstützt das Framework von @Shorty1968 die auch gar nicht? (Falls dem so ist, so kann es wohl nur >= 1 Jahrzehnt alt sein und ich am besten ein anderes nehmen ;))

Ansonsten würde ich xtc_db_input noch auf $status_vergabe draufwerfen - nur zur Sicherheit, falls jemand diesen Wert auf einen nichtnumerischen irgendwann mal abändert.

Weil ich mache das mit einer zusätzlichen SELECT abfrage , aber das geht doch in einer abfrage oder nicht ?
Mit einem zusätzlichen SELECT außerhalb einer Transaktion ist das auch falsch -> Nebenläufigkeitsprobleme!

Wie macht man eigentlich ein UPDATE query gegencheck ob der UPDATE funktioniert hat ?
Dazu müsste man wissen, was xtc_db_query zurückliefert. Normalerweise gibt es so etwas wie num_affected_rows beim MySQLi-Interface.
 
Zurück