| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

31-03-2009, 06:03
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
Verschlüsselte Textdatei auslesen
Hallo Proggis...
ich habe eine txt-datei die verschlüsselte daten beinhaltet.
(base64_encode)
diese datei gibt die aktuellen tagesumsätze wieder als tabelle aus.
PHP-Code:
$YourFile = "kasse/umsatz.txt";
$handle = fopen($YourFile, 'r');
$Data = fread($handle, 50000);
$Data = base64_decode($Data);
echo $Data; echo "<tr>";
Anzeige in PHP:
<td>Kundenname1</td><td>22.03.2009 - 21:22</td><td>12,90</td><td> €</td><tr>
<td>Kundenname2</td><td>22.03.2009 - 21:45</td><td>12,90</td><td> €</td><tr>
<td>Kundenname3</td><td>22.03.2009 - 21:50</td><td>12,90</td><td> €</td><tr>
<td>Kundenname4</td><td>22.03.2009 - 22:30</td><td>12,90</td><td> €</td><tr>
usw.....
Klappt wunderbar.
doch wie kann ich die summe aus spalte 3 zusammenrechnen?
in der verschlüsselten datei ist nach jedem </td> ein nichtverschlüsseltes + zeichen
(zur sicherheit falls tatsächlich mal eine angabe gelöscht werden muss)
Hat jemand eine Idee wie ich das machen kann?
achja... es ist kein zeilenumbruch in der textdatei.
|

31-03-2009, 07:23
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Mit explode() zerlegst du den Dateiinhalt am <tr>. Über das Ergebnis iterierst du in einer Schleife, zerlegst jeden Teil wiederum am </td><td>. Nun greifst du dir aus dem Ergebnis die gewünschte Spalte, entfernst die HTML-Tags mit strip_tags() oder simplen Stringoperationen. Dann wandelst du das Komma in der Zahl in einen Punkt um und summierst.
Oder du benutzt preg_match_all() um die Werte rauszufischen.
|

31-03-2009, 09:04
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Steht das <tr>-Tag mit in der Datei? Fehlt das schließende Tag wirklich? Wenn gültiges XML in der Datei steht, kannst du auch mit der DOM-Extension und XPath drauf losgehen und dir die passenden Werte herausfischen.
|

01-04-2009, 16:14
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
ich habs..
nochmals danke für die raschen hilfestellungen...
ich habe es nach stunden-langem rumprobieren hinbekommen.
das einzige was den soll erfüllt ist ist zwar sehr laienhaft aber es funktioniert...
wenn jemand ne bessere lösung hat... her damit! :-)
PHP-Code:
// Die gespeicherten Tageseinnahmen in Form: (base64_encode verschlüsselst und ohne Zeilenumbruch)
/*
<td>Name1</td><td>Uhrzeit1</td><td align="right">Betrag1</td><td> €</td><tr>
<td>Name2</td><td>Uhrzeit2</td><td align="right">Betrag2</td><td> €</td><tr>
<td>Name3</td><td>Uhrzeit3</td><td align="right">Betrag3</td><td> €</td><tr>
<td>Name4</td><td>Uhrzeit4</td><td align="right">Betrag4</td><td> €</td><tr>
... usw
*/
//Aufrufen der gewünschten Datei in Form: Ordner/Datei.txt
$file = "kasse/umsatz.txt";
$txt = file_get_contents($file);
//Inhalt weider entschlüsselln
$txt1 = base64_decode($txt);
// Ein paar Zellen entfernen und durch Leerstellen ersetzen !!!!
// Ersetzt man ohne Leerstellen werden die einzelnen Blöcke nicht getrennt
// Somit ergibt das auch nur ein zusammenhängendes Gebilde
$txt2 = str_replace("<td>", " ",$txt1);
$txt3 = str_replace("</td>", " ",$txt2);
$txt4 = str_replace('<td align="right">', " ",$txt3);
// Satzende erzwingen ( Da der Inhalt nur ein Einzeiler ist)
// Tabellenumbruch durch * ersetzen
$string = str_replace("<tr>", "*",$txt4);
$sum11 = 0;
$tok = strtok($string, "*");
// Auslesen aller Sätze bis zum * und wiederholen so oft wie * vorhanden sind
while ($tok !== false) {
#echo "$tok<br />"; // Auflistung des Inhalts (# Hier ausgeblendet)
$tok = strtok("*"); // Array ausgeben
// Splitten der der Sätze in einzelne Blöcke bei jedem Leerzeichen
list($ago, $bgo, $cgo, $dgo, $ego, $fgo) =explode(" ", $tok);
#echo "$ago, $bgo, $cgo, $dgo, $ego, $fgo<br>";
// Zusammenrechnen von spalte 6 (alle buchungen des Tages als Endsumme)
$sum11 += $fgo;
}
if ($sum11 < 0.1) {
$sum11 = "0,00";
} else {
$sum11 =sprintf("%01.2f",$sum11);
}
// Ensumme mit zwei stellen hinterm Komma ausgeben
echo $sum11;
|

01-04-2009, 16:39
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
base64 ist keine Verschlüsselung. Diese Daten sind für jeden frei lesbar.
|

01-04-2009, 23:53
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
@ h3ll
base64 ist keine Verschlüsselung. Diese Daten sind für jeden frei lesbar.
Dann öffne doch bitte mal eine Textdatei mit dem Editor dessen daten base64_encode sind.
|

01-04-2009, 23:58
|
|
pekka
PHP Master
|
|
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
|
|
Base64 ist keine Verschlüsselung.
Es reicht ein base64_decode($inhalt_der_textdatei); um an die Daten zu kommen.
|

02-04-2009, 00:03
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Original geschrieben von ostems
Dann öffne doch bitte mal eine Textdatei mit dem Editor dessen daten base64_encode sind.
|
Guckst du hier:
http://wingloon.com/2008/10/28/base6...using-notepad/
Außerdem kann Total Commander im Handumdrehen jede base64-codierte Datei ruck zuck in normalen Text konvertieren. Total Commander ist ein sehr beliebter und verbreiteter Dateimanager für Windows (für alle Leute, die den Explorer nicht leiden können).
http://www.ghisler.com/deutsch.htm
Geändert von h3ll (02-04-2009 um 00:06 Uhr)
|

02-04-2009, 00:57
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
Äh... um missverständnisse zu vermeiden...
es geht bei dieser verschlüsselung darum, das angestellte
beim arbeiten mit der kasse nicht einfach daten aus der datei rauslöschen.
aber, die datei muss für den admin wieder lesbar im umsatz-Adminbereich
angezeigt werden.
darum die base64_encode.
auf dem kassenrechner befinden sich keine programme die diese datei lesbar anzeigen würden.
gibt es noch etwas besseres?
dann sach mal an...
so überzeugt bin ich nämlich auch nicht von base64
ach ja... wo ich schon mal hier bin...
kennst du dich mit zeitberechnung aus?
|

02-04-2009, 01:08
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Original geschrieben von ostems
Äh... um missverständnisse zu vermeiden...
es geht bei dieser verschlüsselung darum, das angestellte
beim arbeiten mit der kasse nicht einfach daten aus der datei rauslöschen.
|
Nochmal: Es ist keine Verschlüsselung. Bitte verwende nicht dieses Wort dafür.
Zitat:
Original geschrieben von ostems
aber, die datei muss für den admin wieder lesbar im umsatz-Adminbereich
angezeigt werden.
darum die base64_encode.
auf dem kassenrechner befinden sich keine programme die diese datei lesbar anzeigen würden.
|
Die Wahrscheinlichkeit ist sehr gering, aber die Angestellten können Verwandte haben, die sich damit auskennen oder selber nur vorübergehend den Job machen, aber nebenbei Informatik studieren. Jetzt fehlt nur noch eine böse Absicht und schon hast du den Scherbenhaufen.
Zitat:
Original geschrieben von ostems
gibt es noch etwas besseres?
dann sach mal an...
so überzeugt bin ich nämlich auch nicht von base64
|
Eine Verschlüsselung mit mcrypt zum Beispiel:
http://de.php.net/manual/en/book.mcrypt.php
Oder noch besser:
Den Leuten, die das nichts angeht, erst gar nicht einen Zugang zu den sensiblen Daten ermöglichen.
Zitat:
Original geschrieben von ostems
ach ja... wo ich schon mal hier bin...
kennst du dich mit zeitberechnung aus?
|
Ja.
|

02-04-2009, 01:44
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
Kanns du mit nachfolgendem code etwas anfangen?
musste einiges rausnehmen weil es nicht dazu gehörte.
hoffe ich hab jetzt nix wichtiges rausgenommen
PHP-Code:
// Hier wird ermittelt um welche spielart es sich handelt
$sql = mysql_query("SELECT nr, art FROM koordinaten Where id='$id'");
$art_select = mysql_fetch_array($sql);
$art = $art_select['art']; // Z.B. Billard
$numr = $art_select['nr'];
// Ab hier wird wird unterschieden die Art und der Preis zu welcher Zeit
// In Billard1 steht z.B 3.50 in Billard2 steht 4.50 und in Billard3 5.50 für die Preis
$sql = mysql_query("SELECT
Billard1, Billard2, Billard3,
Snooker1, Snooker2, Snooker3,
Karambol1, Karambol2, Karambol2,
Internet1, Internet2, Internet3,
zeit1, zeit2, zeit3, zeit4 FROM config");
$row = mysql_fetch_array($sql);
//von 0:00 Uhr bis 8:00 kostet eine Stunde Billard 5.50
$time3 = $row['zeit4']; // Zeigt 00:00:00
// von 8:00 Uhr bis 16:00 kostet eine Stunde Billard 3.50
$time4 = $row['zeit1']; // Zeigt 08:00:00 Uhr
// von 16:00 Uhr bis 20:00 kostet eine Stunde Billard 4.50
$time5 = $row['zeit2']; // Zeigt 16:00:00 Uhr
// von 20:00 Uhr bis 00:00 kostet eine Stunde Billard 5.50
$time6 = $row['zeit3']; // Zeigt 20:00:00 Uhr
$wert = array();
for ($i = 1; $i <= 4; $i++) {
if ($i != 4) {
$wert[$i] = $row[$art . $i];
} else {
$wert[4] = $row[$art . 3];
}
}
// Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
$abfrage = mysql_query("SELECT zeit1, zeit2 FROM abr WHERE id = '$id'");
while ($rows = mysql_fetch_array($abfrage)) {
$time1=$rows['zeit1']; // ist die startzeit (z.B. 2009-03-28 15:55:32)
$time2=$rows['zeit2']; // ist die endzeitzeit (z.B. 2009-03-29 02:16:17)
}
#******************************************************
//Der Nachfolgende code ist von dir! hab ich gerade gesehen.[/b]
#******************************************************
// aufsplitten der Zeiten $time1 und $time2
function time_to_hours($rows) {
list($x_date, $first_time)=explode(' ', $rows);
list($Y, $mo, $d) = explode('-', $x_date);
list($h, $m, $s) = explode(':', $first_time);
return $h + $m / 60 + $s / 3600;
}
$prices = array(
array('value' => $wert[4], 'time' => $time3), // => 00:00
array('value' => $wert[1], 'time' => $time4), // => 08:00
array('value' => $wert[2], 'time' => $time5), // => 16:00
array('value' => $wert[3], 'time' => $time6) // => 20:00
);
if ($end_time < $start_time)
$end_time += 24.0;
$sum = 0.0;
$sum = 0.0;
for ($i_cnt = 0, $i_max = count($prices) - 1; $i_cnt <= $i_max; $i_cnt++) {
$current_time = time_to_hours($prices[$i_cnt]['time']);
$next_time = $i_max > $i_cnt ? time_to_hours($prices[$i_cnt + 1]['time']) : 48.0;
if ($start_time < $next_time && $end_time >= $current_time) {
$diff_time = $end_time < $next_time ? $end_time : $next_time;
$diff_time -= $start_time > $current_time ? $start_time : $current_time;
$sum += $prices[$i_cnt]['value'] * $diff_time;
}
}
echo $sum;
Die Summe ($sum) ist nicht richtig berechnet.
Geändert von ostems (02-04-2009 um 02:24 Uhr)
|

02-04-2009, 01:50
|
|
Blackgreetz
PHP Junior
|
|
Registriert seit: Oct 2005
Beiträge: 901
|
|
OffTopic: Hattest du den Code zur $sum-Berechnung nicht aus diesem Forum? Ich erinner mich schwach an dieses Problem
|

02-04-2009, 01:58
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
ja, schon
hat aber nie funktioniert.
bin gerade aber wieder dabei genau dises thema zu behandeln weil die kasse in den verkauf geht.
in meinem laden sind die preise 24 std. gebunden.
daher ist das auch bei unserer kasse kein problem.
aber gelöst hab ich es immer noch nicht.
leider
|

02-04-2009, 18:08
|
|
Blackgreetz
PHP Junior
|
|
Registriert seit: Oct 2005
Beiträge: 901
|
|
Das hat sich hier aber noch anders angehört
Falls es wirklich falsch ist, dann musste nochmal kurz warten, bis jmd. / ich Zeit dafür hat, sich das Script etc. nochmal anzugucken
btw: // Abfrage der Startzeit, Endzeit, Spielart, anzahl Personen und was schon gezahlt wurde
Diese Whileschleife kann man sich sparen und es in eine Zeile tun. Fiel mir gerade in den Blick. Du hast da sowieso nur 1 Ergebnis.
mfg
|

02-04-2009, 23:09
|
|
ostems
Registrierter Benutzer
|
|
Registriert seit: May 2008
Beiträge: 44
|
|
@ Blackgreetz
Zitat:
|
Das ha sich aber anders angehört.
|
ich hatte es nur getestet mit den einzelnen zeitabschnitten.
und wenn du keine zeit hast oder lust...
musst du es nicht tun.
ich hatte h3ll darum gebeten, weil das script auch von ihm ist.
ich werd indessen weiter versuchen es selbst zu lösen...
Meimst du so?
PHP-Code:
$abfrage = mysql_query("SELECT zeit1, zeit2 FROM abr WHERE id= '$id'");
$rows= mysql_fetch_array($abfrage);
$time1=$rows['zeit1'];
$time2=$rows['zeit2'];
Ergebnis ist das gleiche
Geändert von ostems (02-04-2009 um 23:35 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|