Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PHP und DBASE IV

Frage Entwicklung

Mitglied: ITIL-Harry

ITIL-Harry (Level 1) - Jetzt verbinden

23.02.2009, aktualisiert 22:59 Uhr, 5557 Aufrufe, 10 Kommentare

Aktualisierung funktioniert nicht

Hallo Forum,

ich möchte mir eine Möglichkeit schaffen, eingehende Faxe übers Internet abzufragen.
Faxsoftware: FritzFax

Fritzfax speichert die eingehenden Faxe in SFF-Dateien und die dazugehörigen Informationen in
einer DBASE Datei.

Mein Gedanke ist nun, mit PHP die DBASE Datei auszulesen und die gewonnenen Daten in eine
MySQL DB zu schreiben. Diese Aktion soll über den Zeitplandienst von Windows durchgeführt werden.

Das vom Windows Zeitplandienst ausgeführte Skript soll allerdings nur die neuen Datensätze
hinzufügen. Dafür ist es notwendig, dass beim Hinzufügen der Status "Neu eingegangen" auf "Gelesen"
gesetzt wird.

Genau hier liegt mein Problem:
Das auslesen der DBASE Datei funktioniert einwandfrei, das Ändern des Datensatzes schlägt aber fehl.
Hier der Codeschnipsel:

<?PHP
$dbf = @dbase_open("FRIEMPFJ.DBF",0);

$array = dbase_get_record($dbf, ($i));
$array[10] = 'b';
dbase_replace_record($dbf, $array, ($i));
dbase_close($dbf);
?>

$i definiert den Datensatz, ist eine Variable weil die Datei in einer Schleife durchlaufen wird
Element 10 im Array ist das zu ändernde Element, alle Felder sind Textfelder.

Lt Meldung stimmt die Anzahl der felder nicht. Wie kann dies sein, wenn der Datensatz doch genauso wie
ausgelesen wieder zurückgeschrieben wird ?

Kann mir hier vielleicht jemand einen Tipp geben ?

Danke und Gruß
ITIL-Harry
Mitglied: 16568
24.02.2009 um 01:09 Uhr
Hm, ich lass mir die Faxe immer per Email pollen, und gut...


Lonesome Walker
Bitte warten ..
Mitglied: godlie
24.02.2009 um 10:53 Uhr
Mal so ne doofe Frage warum überhaupt replace?
hol die Daten raus schreibs in ne richtige datenbank und dann lösch den rest.
Bitte warten ..
Mitglied: ITIL-Harry
24.02.2009 um 11:08 Uhr
Hi Lonesome Walker,

Die Möglichkeit besteht tatsächlich. Ich möchte aber zusätzlich die Möglichkeit haben, die Faxe am Server
über die FritzFax Software ansehen können.

Stutzig macht mich übrigens noch, dass ich die Daten mit Access problemlos bearbeiten kann.

Gruß
ITIL-Harry
Bitte warten ..
Mitglied: 16568
24.02.2009 um 12:34 Uhr
Die Faxe werden trotz Weiterleitung auf dem Server belassen...
Das Weiterleiten ist lediglich für den Inhalt...

Ich löse sowas bei kleinen Firmen so, daß ich Fritz die Faxe in ein IMAP-Postfach laufen lasse, auf das jeder Zugriff hat...


Lonesome Walker
Bitte warten ..
Mitglied: ITIL-Harry
24.02.2009 um 12:45 Uhr
Ist keine Alternative, weil ich Anwender habe, die nicht die Disziplin haben, täglich einmal da reinzusehen
und die Faxe sollen auch übers Internet abgerufen werden können.

Gruß
Bitte warten ..
Mitglied: 16568
24.02.2009 um 13:01 Uhr
Hm, wenn Du die aber über Internet abrufen willst, wirst Du sowieso nicht um Mails rumkommen, denn Fritz pollt Dir die Faxe im proprietären Format; nur wenn Du die Option Mail verwendest, kannst Du die Faxe als JPEG angeben lassen...

Egal...

Wie weiter oben schon gesagt: mach's richtig


Lonesome Walker
Bitte warten ..
Mitglied: ITIL-Harry
24.02.2009 um 14:15 Uhr
OK - ich hab nicht alles geschrieben:

gepl. Ablauf
Zeitplandinst führt PHP-Skript aus, dieses prüft, ob neues Fax da ist und schickt Mail an Anwender
gleichzeitig werden die Daten des Eintrags in eine MySQL-DB geschrieben.

Diese MySQL-DB liefert die Daten für ein Web-Frontend, auf dem die SFF-Dateien verlinkt sind.
Am lokalen PC habe ich einen SFF-Viewer installiert, der mit dann das Fax anzeigt.

Alles funktioniert soweit, nur die Aktualisierung der DBASE Datei geht nicht. Das ist meine
Anforderung und alles Andere ist für uns in unserer Umgebung nicht praktikabel.

Gruß
ITIL-Harry
Bitte warten ..
Mitglied: Biber
24.02.2009 um 18:55 Uhr
Moin ITIL-Harry,

für so einen kleinen Codeschnipsel ist aber ganz schön viel.... na ja, wir bekommen das schon hin.

Das Konzeptionelle ist ja schon angesprochen worden. Sag ich nix mehr dazu.
Als dBase noch State-of-the-Art war, sind auch die Beatles noch zu fünft aufgetreten, glaub ich.
Und das lässt sich verkaufen? Wo issn das?

Also, früher hat oft das Schreiben in Dateien funktioniert, wenn man/frau einfach die Datei zum Lesen UND Schreiben geöffnet hat.
Also statt "$dbf = @dbase_open("FRIEMPFJ.DBF",0);" doch eventuell "$dbf = @dbase_open("FRIEMPFJ.DBF",2);", hmm?
BTW, wenn statt "0" und "2" dort "OpenForReading" und "OpenForWriting" stehen würde, würde so etwas nicht passieren.

Zu Deinem "$array[10] "....
Das 10te Feld in einem RowSet als "Element 10" anzusprechen ist so... suboptimal, dass mir die Worte fehlen.
Die Felder haben doch Namen auch schon unter Dbase II und III gehabt, oder nicht? Und sogar als dbase noch "Vulcan" hieß...

Die nicht übereinstimmende Anzahl Elemente im Array rührt von dem DELETEDFLAG, welches in jedem Record mitgeschleppt wird.
Und das wird (richtigerweise) als eigenes Arrayelement mit übergeben/übernommen, da es ja eigentlich nur ein normales Attributfeld ist.
Ein Dbase-Satz mit DELETEDFLAG="*" ist ja nicht gelöscht, sondert nur logisch als gelöscht markiert bis zum nächsten PACK.

Dieses Feld musst Du wegschmeissen....
....denn einen Satz via Feldänderung des Attributs "DELETEDFLAG" löschen darfst Du nicht.
(Info muss im dBase-Header aktualisiert werden und evtl. in Indexdateien.... --> kurz: darfste nich'. )

Das Array-Element des DELETEDFLAGS heißt [immer] "$array['deleted'])".
Also nicht immer "$array", aber immer 'deleted'.


Also
01.
<?PHP 
02.
$dbf = @dbase_open("FRIEMPFJ.DBF", 2); 
03.
 
04.
$array = dbase_get_record($dbf, ($i)); 
05.
$array[10] = 'b'
06.
unset($array['deleted']); 
07.
dbase_replace_record($dbf, $array, ($i)); 
08.
dbase_close($dbf); 
09.
?>
Grüße
Biber
Bitte warten ..
Mitglied: ITIL-Harry
24.02.2009 um 20:01 Uhr
Hi Biber,

Jap - das wars - funktioniert !!!

meines Wissens sind die Beatles aber nie zu fünft aufgetreten - es wurde lediglich der Drummer Pete Best durch Ringo Starr ersetzt

Du verdienst ne Erklärung:
Ich will das net verkaufen - brauch das für mich selbst. Ich hab nunmal Fritz als Faxeingang und hab mich halt nach ner Lösung
umgesehen. Stiess dann bei Selfphp.de drauf, dass man PHP auch DBASE Files bearbeiten kann. das mit dem DELETED Flag ist dort auch beschrieben, es hat aber halt nicht funktioniert weil die Datei nur zum Lesen geöffnet war und ich (Sorry) vielleicht die Parameterliste und deren Erklärung nicht genau genug gelesen hatte.

Nochmals vielen Dank
Gruß
ITIL-Harry
Bitte warten ..
Mitglied: Biber
25.02.2009 um 08:00 Uhr
Moin ITIL-Harry,

was die Beatles betrifft hast Du natürlich Recht.... mein Alzheimer....

Nichtsdestotrotz - also trotz "Never change a running system" etc. würde ich den Codeschnipsel aus Les- und Wartbarkeitsgründen sinngemäß so ändern.
01.
<?PHP 
02.
define("OPEN4READ",   0); 
03.
define("OPEN4WRITE",   2); 
04.
$dbf = @dbase_open("FRIEMPFJ.DBF", OPEN4WRITE); 
05.
.... 
06.
 
07.
$dbfrec = dbase_get_record($dbf, ($i)); 
08.
$dbfrec['neuEingang'] = 'b'
09.
unset($dbfrec['deleted']); 
10.
dbase_replace_record($dbf, $dbfrec, ($i)); 
11.
dbase_close($dbf); 
12.
?>
[wobei natürlich statt "neuEingang" Dein DBF-Feldname eingesetzt werden sollte.]

Ich würde Code lesbar halten, auch oder erst Recht wenn es "nur" Privatvergnügen ist.

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (24)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...