Textfile mit mehreren Daten, davon einmal mit Zeilenumbrüchen
Brombeermilchtrinker
- php
Hallo Forum,
wenn ich 3 verschiedene Daten, zB. Vorname, Familienname und Geburtsjahr aus einem Formular übernehme und in eine .csv-Datei speichere, bei der ich die 3 Informationen mit einem '###' trenne, dann sieht die entstandene Datei zB. so aus:
-----------------------------------
Hans###Huber###1920
-----------------------------------
Wenn ich diese Datei jetzt weiterverarbeite und wieder zu diesen 3 Informationen kommen möchte, dann ist das ja kein Problem:
$handle=fopen($datei,"r");
$inhalt=fgets($handle);
fclose($handle);
$teile=explode("###",$inhalt);
$vorname=$teile[0];
$familienname=$teile[1];
$geburtsjahr=$teile[2];
Soweit, sogut. Ein Problem habe ich aber, wenn jetzt statt dem Geburtsjahr als 3. Information Text aus einer Textarea gespeichert wird, bei der der User auch Zeilenumbrüche verwendet hat.
Angenommen, der User füllt das Formular so aus:
+++++++++++++++++++++++++++
Vorname:
Hans
Familienname:
Huber
Text:
Hallo Welt!
Das ist ein Text. Bla bla Bla.
Gute Nacht!
+++++++++++++++++++++++++++
Dann sieht die gespeicherte .csv-Datei folgendermaßen aus:
-----------------------------------
Hans###Huber###Hallo Welt!
Das ist ein Text. Bla bla Bla.
Gute Nacht!
-----------------------------------
Wie schaffe ich es _nun_, die 3 Informationen $vorname, $familienname und $text da getrennt rauszufiltern und weiterzuverarbeiten? Die Textumbrüche dürfen dabei _nicht_ verloren gehen, der Text soll so, wie ihn der User eingegeben hat, aus der .csv-Datei übernommen werden und in eine DB gespeichert werden.
Gäbe es _nur_ $text, dann könnte man das ja mit while (!feof($datei)) machen und Zeile für Zeile einlesen. Nur bringt mich das nicht weiter, weil in der ersten Zeile das spätere $vorname, $familienname und ein _Teil_ des späteren $text steht. Ich komme einfach nicht weiter.
Ich bitte um Hilfe!
MfG
Der Brombeermilchtrinker
echo $begrüßung;
wenn ich 3 verschiedene Daten, zB. Vorname, Familienname und Geburtsjahr aus einem Formular übernehme und in eine .csv-Datei speichere, [...]
[...] wenn jetzt statt dem Geburtsjahr als 3. Information Text aus einer Textarea gespeichert wird, bei der der User auch Zeilenumbrüche verwendet hat.
Nutze die Möglichkeiten des CSV-Formats und die von PHP zur Verfügung gestellten Funktionen fputcsv() und fgetcsv(), die können auch mit Zeilenumbrüchen problemlos umgehen.
echo "$verabschiedung $name";
Hi dedlfix,
Nutze die Möglichkeiten des CSV-Formats und die von PHP zur Verfügung gestellten Funktionen fputcsv() und fgetcsv(), die können auch mit Zeilenumbrüchen problemlos umgehen.
da war ich schon heute, ich hab leider keinen Plan, wie ich das umzusetzen habe.
Nur nochmal zur Wiederholung mein Ziel:
Im 1. Schritt wird aus einem Formular ein Vorname, ein Familienname und ein Text übernommen. Der Text beinhaltet Zeilenumbrüche.
Im 2. Schritt werden diese Daten in einer csv-Datei gespeichert.
Im 3. Schritt soll die csv-Datei ausgelesen werden und diese 3 Informationen in einer DB gespeichert werden, wobei der Text _samt_ den Zeilenumbrüchen 1:1 so in die DB kommen soll, als hätte ich _sofort_ nach der Übernahme aus dem Formular selbigen gespeichert.
Aber wie gesagt, weder bei der einen, noch bei der anderen dieser 2 Funktionen komme ich auch nur _irgendwie_ weiter.
MfG
Der Brombeermilchtrinker
Hallo Brombeermilchtrinker!
Im 1. Schritt wird aus einem Formular ein Vorname, ein Familienname und ein Text übernommen. Der Text beinhaltet Zeilenumbrüche.
OK.
Im 2. Schritt werden diese Daten in einer csv-Datei gespeichert.
Warum ersetzt Du da nicht schon die Zeilenumbrüche durch irgendwelche Platzhalterzeichen...
Im 3. Schritt soll die csv-Datei ausgelesen werden und diese 3 Informationen in einer DB gespeichert werden, wobei der Text _samt_ den Zeilenumbrüchen 1:1 so in die DB kommen soll, als hätte ich _sofort_ nach der Übernahme aus dem Formular selbigen gespeichert.
... die Du beim schreiben in die DB wieder in Zeilenumbrüche umwandelst?
Der Brombeermilchtrinker
Na denn Prost!
Viele Grüße aus Frankfurt/Main,
Patrick
Hi Patrick,
das habe ich mir jetzt durchüberlegt und ein Programmergebnis, welches das gewünschte Ergebnis bringen würde, allerdings habe ich dabei _nicht_ die von dedfix empfohlenen Funktionen fputcsv() und fgetcsv() vwerwendet.
Die Gegebenheiten für den anschließenden Programmteil:
Aus einem Formular werden die clientseitigen Eingaben von Vorname, Familienname, Wohnort sowei ein Eintrag aus einer Textarea übernommen. Letzterer beinhaltet Zeilenumbrüche.
1.) SPEICHERN DER DATEN IN EINE .CSV-DATEI:
// Zunächst werden die vom User verursachten Zeilenumbrüche \n umgewandelt in die Zeichenkette '*****'.
$order=array("\r\n", "\n", "\r");
$replace="*****";
$eintrag=str_replace($order, $replace, $_POST['eintrag']);
// Nun werden die Informationen Vorname, Familienname, Wohnort und der (schon veränderte) Eintrag zu _einer_ Zeile zusammengefaßt.
// Die 4 verschiedenen Informationen trenne ich dabei mit der Zeichenkette '#####'.
$eintrag=$_POST['vorname']."#####".$_POST['familienname']."#####".$_POST['wohnort']."#####".$eintrag;
// Nun wird die Datei geöffnet, die Zeile mit den Inhalten hineingeschrieben, das Ganze wird gespeichert, die Datei wieder geschlossen:
$handle=fopen('datei.csv','w');
fputs($handle,$eintrag);
fclose($handle);
2.) AUSLESEN DER DATEN AUS DER .CSV-DATEI ZUR WEITERVERARBEITUNG:
// Die Datei wird zum Lesen geöffnet und die erste (und einzige Zeile) eingelesen, dann wird die Datei wieder geschlossen.
$handle=fopen('datei.csv','r');
$inhalt=fgets($handle);
fclose($handle);
// Zunächst trenne ich die 4 verschiedenen Informationen auf.
$teile=explode("#####",$inhalt);
$vorname=$teile[0];
$familienname=$teile[1];
$wohnort=$teile[2];
$eintrag=$teile[3];
// Der Eintrag ist nun als $eintrag separiert.
// Allerdings noch in einer Wurst durchgeschrieben.
// Die Zeichenkette '*****' wird nun wieder durch einen Zeilenumbruchsbefehl ausgetauscht.
$order="*****";
$replace="\n";
$eintrag=str_replace($order, $replace, $eintrag);
Nun kann ich die 4 Informationen in die DB eintragen, das Textfeld steht nun dort _inclusive_ der Zeilenumbrüche 1:1 exakt so, als ob ich die übernommene Eingabe _direkt_ gespeichert hätte.
Meine Frage nun an die Experten:
Ist das OK, so wie ich mein Ziel verwirklicht habe? (Siehe dazu meine Gedanken, geschrieben als Kommentare im Code) Oder bin ich hier mit der Kirche ums Kreuz gegangen und es ginge alles _viel_ einfacher? Bitte korrigiert mich dann dementsprechend!
Na denn Prost!
Magst Du etwa keine Brombeermilch? *die augen zusammenziehe zu einem schlitz und dich furchtbar böse ansehe* ;-)
MfG
Der Brombeermilchtrinker
PS:
Viele Grüße aus Frankfurt/Main,
Ist dort auch grad so ein Scheißwetter wie hier in Wien?
Guten Tag,
Ist das OK, so wie ich mein Ziel verwirklicht habe? (Siehe dazu meine
Gedanken, geschrieben als Kommentare im Code) Oder bin ich hier mit der
Kirche ums Kreuz gegangen und es ginge alles _viel_ einfacher? Bitte
korrigiert mich dann dementsprechend!
Was machst du, wenn jemand ##### oder ***** in seinen Beitrag schreibt?
Es ist imho wenig sinnvoll, weitere Zeichen mit Mehrfachbedeutung einzubauen, als die bereits existierenden ordentlich zu behandeln.
Davon abgesehen ist dein Programm nicht sonderlich elegant geschrieben.
Gruß
Christoph Jeschke
Hallo Brombeermilchtrinker!
Ist das OK, so wie ich mein Ziel verwirklicht habe? (Siehe dazu meine Gedanken, geschrieben als Kommentare im Code) Oder bin ich hier mit der Kirche ums Kreuz gegangen und es ginge alles _viel_ einfacher? Bitte korrigiert mich dann dementsprechend!
PHP ist mir fremd, Datenbanken auch ;)
In Perl hätte ich allerdings ein Trennzeichen gewählt, dass nicht auf der Tastatur ist, z.B. \x01
Magst Du etwa keine Brombeermilch? *die augen zusammenziehe zu einem schlitz und dich furchtbar böse ansehe* ;-)
Mir ist nicht bekannt, dass man aus Brombeeren Milch machen kann. Ich kenne hier jemanden, der würde eher versuchen, Wein draus zu machen ;)
Viele Grüße aus Frankfurt/Main,
Ist dort auch grad so ein Scheißwetter wie hier in Wien?
Viele Grüße aus Frankfurt/Main,
Patrick
Hi Patrick,
Mir ist nicht bekannt, dass man aus Brombeeren Milch machen kann.
Gib eine Packung Brombeeren, wenn es keine frischen gibt auch Tiefkühlware in einen großen elektrischen Mixer, dazu gibst Du etwas Vanillezucker, ein wenil Brombeer- oder Vanilleeis und Milch. Dann pürrierst Du das Ganze 2 Minuten lang, bis es so richtig cremig ist. Ab ins Glas und runter damit! _Das_ ist zB. eine Brombeermilch. Es gibt ja auch Bananenmilch, obwohl Du aus Bananen keine Milch machen kannst.
Ich kenne hier jemanden, der würde eher versuchen, Wein draus zu machen ;)
Grad vor Kurzem hab ich mir Gedanken darüber gemacht, dass und wieso man schon seit _Monaten_ nichts mehr liest von unserem Berliner Hollunderweinhersteller mit Vollbart und Nickelbrille. Ich hoff, man muß sich keine Sorgen machen um ihn.
MfG
Der Brombeermilchtrinker
Hallo Brombeermilchtrinker!
Ich hoff, man muß sich keine Sorgen machen um ihn.
Keine Ahnung... Am Besten wäre, wenn einen von den anwesenden Berlinern, der vielleicht seine Adresse hat, mal vorbeifährt und nachschaut...
Irgendwie erinnert mich das an Serge (der SELFHTML ins Französische übersetzte). Irgendwann auch nichts mehr gehört, bis ich eine Mail erhielt von jemandem, der ihn auch suchte, und darin schrieb, dass nicht nur Mails an Serge zurückkamen sondern auch Schneckenpost. Irgendwann erfuhr ich auch, dass sein Haus wohl seit längerer Zeit geschlossen war, da war irgendwie schon alles klar.
Viele Grüße aus Frankfurt/Main,
Patrick
Tach,
Keine Ahnung... Am Besten wäre, wenn einen von den anwesenden Berlinern, der vielleicht seine Adresse hat, mal vorbeifährt und nachschaut...
wenn es kein Trittbrettfahrer ist, war Christoph noch vor kurzem in der Wikipedia aktiv: http://de.wikipedia.org/wiki/Spezial:Beiträge/Christoph_Schnauß.
mfg
Woodfighter
Hallo Jens!
wenn es kein Trittbrettfahrer ist, war Christoph noch vor kurzem in der Wikipedia aktiv: http://de.wikipedia.org/wiki/Spezial:Beiträge/Christoph_Schnauß.
Vor »kurzem« ist gut... wenn ich richtig gelesen habe, ist seine letzte Amtshandlung dort vom 19.06.08... Und sein letzter Beitrag hier gut ein Monat später, seitdem Funkstille...
Viele Grüße aus Frankfurt/Main,
Patrick
Tach,
Vor »kurzem« ist gut... wenn ich richtig gelesen habe, ist seine letzte Amtshandlung dort vom 19.06.08... Und sein letzter Beitrag hier gut ein Monat später, seitdem Funkstille...
könnte mich bitte mal jemand in 2009 willkommen heißen? Ich war über Google auf seiner Benutzerseite gelandet und da war die letzte Änderung vom Januar, da hat mein Hirn ausgesetzt und das 08 glatt übersehen.
mfg
Woodfighter
Re!
Keine Ahnung... Am Besten wäre, wenn einen von den anwesenden Berlinern, der vielleicht seine Adresse hat, mal vorbeifährt und nachschaut...
Solele, wenn's keiner macht, muss man sich eben selbst helfen: nach kurzer Zeit hatte ich die Telefonnummer 'rausgefunden und prompt angerufen.
Christoph war überrascht und keineswegs damit gerechnet, dass er einen Anruf von jemandem aus dem Forum bekommt.
Also, Christoph geht es wieder gut und wird uns bald wieder von Holunderwein erzählen können, und auch dass man aus Brombeeren keinen Wein machen kann (Brombeermilchtrinker: Du musst also bei Deinem Getränk bleiben) ;)
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo Patrick,
Christoph war überrascht und keineswegs damit gerechnet, dass er einen Anruf von jemandem aus dem Forum bekommt.
das kann ich mir vorstellen! ;-)
Also, Christoph geht es wieder gut
Was heißt "wieder"? Ach, das soll er uns dann am besten selbst berichten, wenn ihm danach ist.
und wird uns bald wieder von Holunderwein erzählen können, und auch dass man aus Brombeeren keinen Wein machen kann
Das überrascht mich als Laie. Aus Heidelbeeren kann man aber - den habe ich vor vielen Jahren im Bayrischen Wald mal probiert, und der war sogar für mich als Weinabstinenzler lecker.
Schönes Wochenende schonmal,
Martin
[latex]Mae govannen![/latex]
Also, Christoph geht es wieder gut und wird uns bald wieder von Holunderwein erzählen können, [...]
Hm, und ich hatte angenommen, daß er mit dem Erlös aus seinen Holunderwein-Aktien eine mehrjährige Weltreise angetreten hat.
Danke für die Benachrichtigung.
Cü,
Kai
Hi,
Also, Christoph geht es wieder gut
schön.
dass man aus Brombeeren keinen Wein machen kann
Hm. Dafür, daß es nicht geht, gibt's erstaunlich viele Rezepte dafür (einfach mal nach Brombeerwein googlen)
cu,
Andreas
Hallo MudGuard!
dass man aus Brombeeren keinen Wein machen kann
Hm. Dafür, daß es nicht geht, gibt's erstaunlich viele Rezepte dafür (einfach mal nach Brombeerwein googlen)
Vielleicht habe ich Christoph am Phone nicht richtig verstanden...
Viele Grüße aus Frankfurt/Main,
Patrick
Hi,
dass man aus Brombeeren keinen Wein machen kann
Hm. Dafür, daß es nicht geht, gibt's erstaunlich viele Rezepte dafür (einfach mal nach Brombeerwein googlen)Vielleicht habe ich Christoph am Phone nicht richtig verstanden...
Oder er hat dir seine ideologisch begruendete Ansicht als Tatsache verkauft :-)
MfG ChrisB
Yerf!
Hm. Dafür, daß es nicht geht, gibt's erstaunlich viele Rezepte dafür (einfach mal nach Brombeerwein googlen)
Oh mann... der Thread macht richtig appetit...
Dafür kann ich jetzt bestätigen, dass es Brombeerwein devinitiv gibt und das Zeug sogar richtig lecker ist ;-)
Prost,
Harlequin
echo $begrüßung;
Im 1. Schritt wird aus einem Formular ein Vorname, ein Familienname und ein Text übernommen. Der Text beinhaltet Zeilenumbrüche.
Im 2. Schritt werden diese Daten in einer csv-Datei gespeichert.
Was gefällt dir an fputcsv() denn nicht?
Im 3. Schritt soll die csv-Datei ausgelesen werden
Und an seinem Pendant fgetcsv()?
Dieses Mini-Beispiel speichert zweimal $data als Stellvertreter für einen Datensatz mit fputcsv() in eine CSV-Datei
$data = array('Text', "Text\nmit\nUmbruch und sogar \"mit\" Anführungszeichen");
$fp = fopen('foo.csv', 'w');
if (!$fp)
...; // Fehlerbehandlung
else {
fputcsv($fp, $data);
fputcsv($fp, $data);
fclose($fp);
}
$fp = fopen('foo.csv', 'r');
if (!$fp)
...; // Fehlerbehandlung
else
while ($record = fgetcsv($fp))
var_dump($record);
Der Inhalt der Datei ist:
Text,"Text
mit
Umbruch und sogar ""mit"" Anführungszeichen"
Text,"Text
mit
Umbruch und sogar ""mit"" Anführungszeichen"
Dabei kannst du sehen, dass der Text mit den Umbrüchen in "" eingeschlossen ist und auch für die Anführungszeichen ist gesorgt. Zwei Stück hintereinander stehen für eins, das Datenbestandteil ist.
Und das Ergebnis des Beispiels ist:
array(2) {
[0]=>
string(4) "Text"
[1]=>
string(51) "Text
mit
Umbruch und sogar "mit" Anführungszeichen"
}
array(2) {
[0]=>
string(4) "Text"
[1]=>
string(51) "Text
mit
Umbruch und sogar "mit" Anführungszeichen"
}
Und wo ist jetzt das Problem?
und diese 3 Informationen in einer DB gespeichert werden, wobei der Text _samt_ den Zeilenumbrüchen 1:1 so in die DB kommen soll, als hätte ich _sofort_ nach der Übernahme aus dem Formular selbigen gespeichert.
Das ist eine andere Baustelle, die wir ja schon in anderem Zusammenhang behandelt haben. Du bindest dabei ohne weiteres Zutun $record[0] und $record[1] an dein Prepared Statement mit dem vorbereiteten INSERT, machst ein execute() und fertig ist.
echo "$verabschiedung $name";
Hi dedlfix,
Was gefällt dir an fputcsv() denn nicht?
Das sagte ich schon. Ich kann damit nichts anfangen. Es wird mir wie immer die URL zum PHP-Manual hingeknallt und ich kann mit dem, was dort steht, nichts anfangen.
Und an seinem Pendant fgetcsv()?
Detto.
Dieses Mini-Beispiel speichert zweimal $data als Stellvertreter für einen Datensatz mit fputcsv() in eine CSV-Datei [...]
Danke für das Beispiel. Ich werde jetzt sofort versuchen, das umzusetzen.
und diese 3 Informationen in einer DB gespeichert werden, wobei der Text _samt_ den Zeilenumbrüchen 1:1 so in die DB kommen soll, als hätte ich _sofort_ nach der Übernahme aus dem Formular selbigen gespeichert.
Du bindest dabei ohne weiteres Zutun $record[0] und $record[1] an dein Prepared Statement mit dem vorbereiteten INSERT, machst ein execute() und fertig ist.
Ich hab das jetzt geteset. Das Anlegen funktioniert, das Auslesen leider nicht. :-(
Wenn ich nach dem Anlegen der Datei (ich verwende jetzt nur Namen und Eintrag) das Auslesen _so_ schreibe:
$fp = fopen($csvname, 'r');
if (!$fp)
{
// Fehlerbehandlung [...]
}
else
{
while ($record = fgetcsv($fp))
var_dump($record);
}
Dann bekomme ich folgende Ausgabe am Bildschirm:
array(2) { [0]=> string(12) "Maxi Müller" [1]=> string(46) "Zeile 1 Zeile 2 Zeile 3 Zeile 4" }
Also genau das, was Du geschrieban hast und was ich erwarte.
Wenn ich jetzt aber den Code erweitere:
$fp = fopen($csvname, 'r');
if (!$fp)
{
// Fehlerbehandlung [...]
}
else
{
while ($record = fgetcsv($fp))
var_dump($record);
}
echo $record[0];
echo $record[1];
dann müßte jetzt doch zusätzlich "Maxi Müller" und der Texteintrag samt Zeilenumbrüchen ausgegeben werden. Kommt aber nichts. _Gar_ nichts. Ich habe einfach die selbe Ausgabe wie davor. Das ist mir _unbegreiflich_, wo mir doch das "var_dump" bestätigt, daß das Array $record vorhanden ist! :-(
MfG
Der Brombeermilchtrinker
Yerf!
while ($record = fgetcsv($fp))
var_dump($record);
Das ist mir _unbegreiflich_, wo mir doch das "var_dump" bestätigt, daß das Array $record vorhanden ist! :-(
Das Problem ist das "while". Damit definierst du eine Schleife die mehrmals fgetcsv($fp) aufruft. Nach dem ersten Aufruf hast du in $record deine Daten, wie der var_dump auch bestätigt. Danach wird vom while fgetcsv($fp) nochmals aufgerufen. Diesmal werden keine daten zurückgelifert, da das Dateiende erreicht ist. $record ist nun leer und die While-Schleife bricht ab.
Wenn du nur die erste Zeile lesen willst, dann lass die Schleife weg:
$record = fgetcsv($fp);
var_dump($record);
//weitere Verarbeitung
oder wenn du später mehrere Zeilen verarbeiten willst, dann bau alles in die Schleife:
while ($record = fgetcsv($fp))
{
var_dump($record);
//weitere Verarbeitung
}
Gruß,
Harlequin
Hi Harlequin,
Wenn du nur die erste Zeile lesen willst, dann lass die Schleife weg:
ja, ich _habe_ ja auch nur eine Zeile, also 1 Array.
Danke, klappt jetzt!
MfG
Der Brombeermilchtrinker
Hi,
Was gefällt dir an fputcsv() denn nicht?
Das sagte ich schon. Ich kann damit nichts anfangen. Es wird mir wie immer die URL zum PHP-Manual hingeknallt und ich kann mit dem, was dort steht, nichts anfangen.
Und mit "damit kann ich nichts anfangen" koennen wir wiederum nichts anfangen.
Wenn du konkrete Verstaendnisprobleme hast, dann kannst du gerne auch konkrete (Rueck-)Fragen stellen, dann kann dir sicher jemand Einzelheiten erklaeren.
Aber nur "isch nix kapieren" ist zu wenig.
Und wenn du Programmieren willst, dann musst du auch mal lernen, die zugehoerigen Dokumentationen zu lesen und zu verstehen. Das ist essentiell.
MfG ChrisB
Hi Chris,
Und mit "damit kann ich nichts anfangen" koennen wir wiederum nichts anfangen.
Wenn ich nicht verstehe, was mir das Manual sagt, kann ich nichts anderes, als dies so zu artikulieren.
Wenn du konkrete Verstaendnisprobleme hast, dann kannst du gerne auch konkrete (Rueck-)Fragen stellen, dann kann dir sicher jemand Einzelheiten erklaeren.
Du weißt aber hoffentlich schon, daß ich nicht nur in diesem, sondern auch in meinem Posting der letzten Tage _sehr wohl_ konkrete Fragen gestellt habe und bemüht bin, zu lernen und hier _nicht_ kommenralos und ohne drüber nachzudenken einen fertiegen Code abholen möchte.
Und auch in diesem Thread bin ich mit konkretem Nachfragen ja schon zu einem Ergebnis gekommen. Ich weiß also nicht, wieso Du mich so angreifst.
Aber nur "isch nix kapieren" ist zu wenig.
Und ich dachte, ich sei ein "gutes Beispiel" für aktive Mitarbeit nach einer Antwort. :-(
Und wenn du Programmieren willst, dann musst du auch mal lernen, die zugehoerigen Dokumentationen zu lesen und zu verstehen. Das ist essentiell.
Was leider, wie ich es immer wieder und wieder sage, oft daran scheitert, daß eine Dokumentation nicht automatisch gleichzusetzen ist mit "dies ist ein didaktisch gutes Lehrbuch". Es ist nun mal leider so, daß dort Dinge oft so kurz zusammengefaßt sind oder in so einem Technik-Sprech erklärt werden, daß es der "Laie" einfach nicht verstehen _kann_.
Und wenn ich Dich grad "an der Strippe" habe ... :-) ....
kannst Du mir bitte sagen, wieso bei mir nach erfolgreicher Verbindung zu einer Datenbank das Zählen der vorhandenen Datensätze mit
$abfrage = 'SELECT COUNT(`003_id`) FROM `dbtest003`';
$abfrageergebnis = $db->prepare( $abfrage );
$abfrageergebnis->execute();
$abfrageergebnis->bind_result( $anzahl);
echo"<p>es sind ".$anzahl." Datensätze vorhanden.</p><hr />\n";
abfrageergebnis->store_result();
kein Ergebnis bring? Es kommt weder 0, noch eine Fehlermeldung oder Warnung. Im Quelltext steht dann einfach "<p>es sind Datensätze vorhanden.</p><hr />" Wo liegt denn da mein Fehler?
(Im Anschluß an diesen Teil kommt die Ausgabe von Datensätzen, die funktioniert problemlos.)
Und wie gesagt, ich hoffe schon, daß man
Hi,
Und mit "damit kann ich nichts anfangen" koennen wir wiederum nichts anfangen.
Wenn ich nicht verstehe, was mir das Manual sagt, kann ich nichts anderes, als dies so zu artikulieren.
Das solltest du aber.
"Wie soll mir die Funktion im vorliegenden Fall helfen? Ich verstehe das so, dass die Funktion dies und jenes macht, ..." - damit waere es schon eher moeglich, dir etwas zu erklaeren.
Aber nur "nix verstehen" *ist* zu wenig.
Und auch in diesem Thread bin ich mit konkretem Nachfragen ja schon zu einem Ergebnis gekommen. Ich weiß also nicht, wieso Du mich so angreifst.
Ich weiss nicht, wieso du dich angegriffen fuehlst.
Dir wurde eine Funktion genannt, mit der du das ganze Vorhaben sehr einfach und komfortabel umsetzen koenntest - und dabei die Besonderheiten, die es bei diesem Datenformat zu beachten gibt, gar nicht selbst behandeln muesstest, sondern sie der Funktion ueberlassen koenntest.
Ich wuerde jetzt erwarten, dass du dich ein bisschen damit beschaeftigst, was die Funktion macht, und wie man sie einsetzen kann.
Und eben konkrete Fragen, wenn es konkrete Verstaendnisprobleme gibt.
"Was der Parameter X bei der Funktion bewirken soll, ist mir nicht klar - kan mir das jemand erklaeren?" - so oder aehnlich, dass waere eine *sinnvolle* Art, sich damit auseinanderzusetzen, gerne mit unserer Hilfe, wenn du es alleine nicht vollstaendig verstehst.
Aber wenn du dich gleich hinstellst, und den wirklich sinnvollen Hinweis auf die Funktion mit "verstehe ich nicht" abbuegelst - dann ist das m.E. eben kein sinnvoller Herangang an die Problematik.
Aber nur "isch nix kapieren" ist zu wenig.
Und ich dachte, ich sei ein "gutes Beispiel" für aktive Mitarbeit nach einer Antwort. :-(
Was soll denn an einem ganz nichtssagenden "ich verstehe nichts" aktiv sein?
Das ist nicht aktiv, dass ist reine Ablehnung sinnvoller Vorschlaege nach dem Motto "ist mir jetzt zu kompliziert, habe ich keine Lust drauf, mich damit etwas intensiver zu beschaeftigen".
Und wenn du Programmieren willst, dann musst du auch mal lernen, die zugehoerigen Dokumentationen zu lesen und zu verstehen. Das ist essentiell.
Was leider, wie ich es immer wieder und wieder sage, oft daran scheitert, daß eine Dokumentation nicht automatisch gleichzusetzen ist mit "dies ist ein didaktisch gutes Lehrbuch". Es ist nun mal leider so, daß dort Dinge oft so kurz zusammengefaßt sind oder in so einem Technik-Sprech erklärt werden, daß es der "Laie" einfach nicht verstehen _kann_.
Programmiererische Grundlagen muss man sich natuerlich erst mal unabhaengig von der konkreten Dokumentation einer Funktion im Handbuch aneignen - eigentlich sogar erst mal unabhaengig von der jeweiligen Programmiersprache.
Tutorials zum ThemaPHP gibt es einige gute.
kannst Du mir bitte sagen, wieso bei mir nach erfolgreicher Verbindung zu einer Datenbank das Zählen der vorhandenen Datensätze mit [...]
kein Ergebnis bring? Es kommt weder 0, noch eine Fehlermeldung oder Warnung. Im Quelltext steht dann einfach "<p>es sind Datensätze vorhanden.</p><hr />" Wo liegt denn da mein Fehler?
Vermutlich liefert die Abfrage den Wert NULL zurueck - den gibt PHP einfach als "gar nichts" aus.
Auch hier gilt mal wieder, grundlegende Debug-Strategie anwenden:
Die Query erst mal unabhaengig vom eigenen PHP-Code ueber ein Frontend wie phpMyAdmin testen, ob dabei das erwartete Ergebnis herauskommt.
MfG ChrisB
Hi Chris,
"Wie soll mir die Funktion im vorliegenden Fall helfen? Ich verstehe das so, dass die Funktion dies und jenes macht, ..." - damit waere es schon eher moeglich, dir etwas zu erklaeren.
ich gehe wirklich *jedem* Hinweis nach, suche und besuche Seiten bis zum Umfallen und Teste bis zum Gehtnichtmehr. Aber es tut mir leid - der Hinweis auf die Manualseite _ist_ einfach oft keine Hilfe für nicht so versierte Leute, obwohl ich Dich schon verstehe und Deiner Argumentation größtenteils folgen kann.
Ich weiss nicht, wieso du dich angegriffen fuehlst.
Vielleicht bin ich ja ein seelisches Weichei. :-)
Dir wurde eine Funktion genannt, mit der du das ganze Vorhaben sehr einfach und komfortabel umsetzen koenntest - und dabei die Besonderheiten, die es bei diesem Datenformat zu beachten gibt, gar nicht selbst behandeln muesstest, sondern sie der Funktion ueberlassen koenntest.
Ich habe das doch eh längst umgesetzt, wenn Du diesen Thread komplett verfolgt hast.
Ich wuerde jetzt erwarten, dass du dich ein bisschen damit beschaeftigst, was die Funktion macht, und wie man sie einsetzen kann.
Glaub mir, nichts lieber als das, aber _was_ soll ich tun, wenn ich eine Seite im Manual auch nach dem 10. mal durchlesen einfach nicht verstehe und mit den Beispielen dort nichts anfangen kann?
Und eben konkrete Fragen, wenn es konkrete Verstaendnisprobleme gibt.
"Was der Parameter X bei der Funktion bewirken soll, ist mir nicht klar - kan mir das jemand erklaeren?" - so oder aehnlich, dass waere eine *sinnvolle* Art, sich damit auseinanderzusetzen, gerne mit unserer Hilfe, wenn du es alleine nicht vollstaendig verstehst.
Das mache ich immer so, sobald ich angefangen habe, _irgendwas_ von einer mir unbekannten Funktion bzw. von einem kompletten Code zu verstehen.
Aber wenn du dich gleich hinstellst, und den wirklich sinnvollen Hinweis auf die Funktion mit "verstehe ich nicht" abbuegelst - dann ist das m.E. eben kein sinnvoller Herangang an die Problematik.
Ich habe mich nicht "gleich" hingestellt und das gesagt. Ich war schon lange Zeit vor dem Hinweis auf die 2 Funktionen unter anderem auf genannten Seiten im Manual (wie ich in meinem Posting um 11:11 Uhr heute geschrieben habe), _dann_ habe ich, nachdem ich auch nach 2 Stunden _nichts_ gefunden habe, was mir verständlich weitergeholfen hat, hier im Forum meine Frage gestellt und bekam dann als Hinweis einen Link zu einer Seite, wegen der ich unter anderem die Frage gestellt habe.
Aber nur "isch nix kapieren" ist zu wenig.
Und genau so war es eben _nicht_.
Und ich dachte, ich sei ein "gutes Beispiel" für aktive Mitarbeit nach einer Antwort. :-(
Was soll denn an einem ganz nichtssagenden "ich verstehe nichts" aktiv sein?
Das habe ich auf zB meinen gestrigen Thread bezogen.
Das ist nicht aktiv, dass ist reine Ablehnung sinnvoller Vorschlaege nach dem Motto "ist mir jetzt zu kompliziert, habe ich keine Lust drauf, mich damit etwas intensiver zu beschaeftigen".
Ja, es _ist_ mir zu kompliziert, na und? Das heißt aber nicht, daß ich keine Lust drauf habe, mich intensiver damit zu beschäftigen. Ich nehme halt zur Kenntnis, daß kompetente Leute wie Du (und ich schätzte Dich sehr dafür!!!) offenbar nicht wahrhaben können, daß es bei den _nicht_ kompetenten einfach sehr schnell zu einem rießengroßen Fragezeichen im Kopf kommt, wo man einfach _nichts_ mehr versteht.
Tutorials zum ThemaPHP gibt es einige gute.
Ich weiß, aber darum gings doch nicht.
Vermutlich liefert die Abfrage den Wert NULL zurueck - den gibt PHP einfach als "gar nichts" aus.
Verstehe.
Auch hier gilt mal wieder, grundlegende Debug-Strategie anwenden:
Die Query erst mal unabhaengig vom eigenen PHP-Code ueber ein Frontend wie phpMyAdmin testen, ob dabei das erwartete Ergebnis herauskommt.
Das habe ich soeben, Deinem Vorschlag folgend, getan und die Abfrage direkt über phpMyAdmin getätigt, dort liefert mir der Query ein richtiges Ergebnis der Datensatzanzahl. Und am PHP-Code, den ich jetzt nochmals genau angesehen habe, finde ich leider keinen Fehler. Hm.
Jedenfalls, ich wollte hier keine Grundsatzdiskussion auslösen, schon gar nicht mit Dir, weil ich Dich und Deine Beiträge wirklich sehr schätze, viuelleicht hab ich mich ja deshalb angegriffen gefühlt. Nochdazu, wo ich wirklich was lernen möchte, wenn ich mich hier ans Forum wende und bei Antworten wie der Deinigen vorher das Gefühl bekomme, ich werde gleichgesetzt mit Leuten die fragen, wie man bei einer Frameseite mit einem Klick 2 Seiten gleichzeitig verändern kann und den Code dafür am besten per Mail wollen.
Naja, egal. Mein ursprüngliches Problem habe ich gelöst, jetzt müßt ich nur noch wissen, wieso das mit dem COUNT nicht funktioniert.
MfG
Der Brombeermilchtrinker
Hi,
Glaub mir, nichts lieber als das, aber _was_ soll ich tun, wenn ich eine Seite im Manual auch nach dem 10. mal durchlesen einfach nicht verstehe und mit den Beispielen dort nichts anfangen kann?
Na ja, mal schrittweise analysieren, wo das Verstaendnisproblem denn nun liegt.
Wenn dir hier jemand die Verwendung einer Funktion fuer einen bestimmten Zweck vorschlaegt, dann wird er sich ja (hoffentlich) etwas dabei gedacht haben.
Also schaust du dir dann erst mal die Beschreibung an, versuchst zu verstehen, was die Funktion macht, wofuer sie "gut" ist. Leuchtet dir das nicht ein, dann koennte die erste Nachfrage erfolgen, in der Form "OK, nach meinem Verstaendnis der Beschreibung macht die Funktion dies und das, ist das korrekt? Wenn ja, dann verstehe ich nicht, wie mir das bei meinem konkreten Problem weiterhelfen soll."
Wenn das Verstaendnis in diesem Punkt erreicht ist, kommt der naechste Schritt - wo fuer stehen die einzelnen Parameter? Woher nehme ich diese, d.h. welche Funktionen muss ich ggf. vorher aufrufen, um bspw. einen "file handle" oder einen Datenbankverbindungs-Ressourcenkennung zu erstellen? Gibt das Beispiel darueber Aufschluss? Welche Funktionen werden da noch verwendet, um erst mal die fuer die aktuell in Frage stehende Funktion zu erstellen? Da muss ich vielleicht auch erst mal wieder nachlesen gehen. Und wenn ich was nicht verstehe - wieder nachfragen.
Dann hab ich - oder glaube ich zumindest - das gemacht, was es braucht, um die Funktion aufzurufen; aber es "tut sich nichts", es passiert nicht das Gewuenschte. Dann wieder schauen, welchen Rueckgabewert liefert die Funktion laut Beschreibung, welche Rueckschluesse kann ich daraus im Fehlerfalle ziehen? Gibt es im Umfeld der Klasse/des Paketes, aus dem die Funktion stammt, weitere Funktionen zum Abfragen von Fehlerquellen, wie wende ich diese an ...?
Ja, es _ist_ mir zu kompliziert, na und? Das heißt aber nicht, daß ich keine Lust drauf habe, mich intensiver damit zu beschäftigen. Ich nehme halt zur Kenntnis, daß kompetente Leute wie Du (und ich schätzte Dich sehr dafür!!!) offenbar nicht wahrhaben können, daß es bei den _nicht_ kompetenten einfach sehr schnell zu einem rießengroßen Fragezeichen im Kopf kommt, wo man einfach _nichts_ mehr versteht.
Gut, mag sein, dass man das mit zunehmender Erfahrung etwas aus den Augen verliert, dass sich manchmal schnell ein "Bahnhof"-Gefuehl einstellt.
Aber dann erinnere ich mich auf der anderen Seite ja auch wieder zurueck, was habe ich gemacht, wenn es mir mal so ging? Da muss ich halt auch manchmal ueberlegen, woran kann das liegen, dass ich das hier jetzt nicht verstehe? Welches Vorwissen fehlt mir vielleicht, welche Technik/welche Grundlagen muesste ich mir vielleicht vorher anschauen, um das hier jetzt verstehen zu koennen? Und wenn ich jemanden frage, damit der mir das erklaert - wie frage ich? Bis zu welchem Punkt verstehe ich noch, was da passiert, ab wo brauche ich eine genauere, vielleicht auch mehr an der Praxis orientierte Erklaerung? Wie kann ich jemandem klar machen, was genau ich daran nicht verstehe?
MfG ChrisB
Hi Chris,
ich werde mich in Zukunft bemühen, diese Art der Problemlösung zu betreiben bzw. mein Nichtverstehen besser zu artikulieren, in dem Sinn, wie Du es grade ausgeführt hast. Danke für den Input!
Leider muß ich mich jetzt wieder mal verabschieden und komme für mind. 2 Tage nicht ins Netz, aber beim nächsten mal ist dieser Thread sicher noch offen und dann werde ich versuchen, herauszufinden, wie Du das mit dem Fetch gemeint hast und wieso es ohne dem NULL liefert.
Einen schönen Abend noch!
MfG
Der Brombeermilchtrinker
Hi,
$abfrage = 'SELECT COUNT(003_id
) FROM dbtest003
';
$abfrageergebnis = $db->prepare( $abfrage );
$abfrageergebnis->execute();
$abfrageergebnis->bind_result( $anzahl);
echo"<p>es sind ".$anzahl." Datensätze vorhanden.</p><hr />\n";
abfrageergebnis->store_result();
Hier fehlt ein entscheidender Schritt - nach dem Binden der PHP-Variablen an das Statement per bind\_result() muessen die Datensatzinhalte dann auch noch "abgeholt" werden, bevor die PHP-Variable irgendeinen Inhalt erhaelt.
Da fehtl also ein Aufruf der fetch-Methode.
MfG ChrisB
--
„This is the author's opinion, not necessarily that of Starbucks.“
Hi Chris,
Hier fehlt ein entscheidender Schritt - nach dem Binden der PHP-Variablen an das Statement per bind_result() muessen die Datensatzinhalte dann auch noch "abgeholt" werden, bevor die PHP-Variable irgendeinen Inhalt erhaelt.
Ich war der Meinung, $abfrageergebnis->bind_result( $anzahl);
bedeutet:
Mit dem Ausführen des Querrys bekomst Du ein Abfrageergebnis und dieses Ergebnis bindest Du an die Variable $anzahl. Somit "wüßte" die Variable nach meinem Verständnid schon, was sie wert ist. Dem ist wohl nicht so.
Da fehtl also ein Aufruf der fetch-Methode.
Ich suche grade danach.
MfG
Der Brombeermilchtrinker
Hi,
Hier fehlt ein entscheidender Schritt - nach dem Binden der PHP-Variablen an das Statement per bind_result() muessen die Datensatzinhalte dann auch noch "abgeholt" werden, bevor die PHP-Variable irgendeinen Inhalt erhaelt.
Ich war der Meinung,
$abfrageergebnis->bind_result( $anzahl);
bedeutet:Mit dem Ausführen des Querrys bekomst Du ein Abfrageergebnis und dieses Ergebnis bindest Du an die Variable $anzahl. Somit "wüßte" die Variable nach meinem Verständnid schon, was sie wert ist. Dem ist wohl nicht so.
Nein, waere ja auch unguenstig - eine Abfrage kann ja auch mehrere Datensaetze zurueckliefern. Wenn du mit einmaligem Binding die Daten des ersten Datensatzes bekaemst, wie ginge es dann weiter, wie kaeme man an die des naechsten?
Da fehtl also ein Aufruf der fetch-Methode.
Das Binding sagt nur, in welchen Variablen die Felder der Ergebnisdatensaetze abgelegt werden *sollen*.
Um diese Daten dann auch zu holen und in den Variablen *abzulegen*, wird Ge-fetch-ed". Das macht man fuer jeden Datensatz (i.d.R. so lange, bis keine Datensaetze mehr kommen - dann liefert eine fetch-Funktion false als Ergebnis, und damit beendet man dann bspw. eine Schleife).
Ich suche grade danach.
Welche Erweiterung ist das, die du da zum Datenbankzugriff benutzt - MySQLi?
Da wuerde man die fetch-Methode dann auf dem Statement-Objekt aufrufen, siehe auch http://www.php.net/manual/en/mysqli-stmt.fetch.php
MfG ChrisB
Hi Chris,
Welche Erweiterung ist das, die du da zum Datenbankzugriff benutzt - MySQLi?
richtig
Da wuerde man die fetch-Methode dann auf dem Statement-Objekt aufrufen, siehe auch http://www.php.net/manual/en/mysqli-stmt.fetch.php
*smile* Da bin ich schon seit 10 Minuten. Und angesichts unseres Gesprächs von vorhin sag ich jetzt besser nicht, wie es mir grad ergeht. ;-)
Wie gesagt, ich muß leider weg jetzt aber wenn ich in ein paar Tagen wieder online bin, werd ich mich damit beschäftigen und mich wieder melden, wenn es ein (oder kein) Ergebnis gibt.
Einstweilen ein herzliches Danke!
MfG
Der Brombeermilchtrinker
Hi,
Da wuerde man die fetch-Methode dann auf dem Statement-Objekt aufrufen, siehe auch http://www.php.net/manual/en/mysqli-stmt.fetch.php
*smile* Da bin ich schon seit 10 Minuten. Und angesichts unseres Gesprächs von vorhin sag ich jetzt besser nicht, wie es mir grad ergeht. ;-)
Ja, das dachte ich mir dann schon :-) hab den Link dann aber trotzdem mal gepostet.
Wie gesagt, das gehoert zwischen den zwei Schritten
$abfrageergebnis->execute();
$abfrageergebnis->bind_result( $anzahl);
$abfrageergebnis->fetch();
echo"<p>es sind ".$anzahl." Datensätze vorhanden.</p><hr />\n";
(Theoretisch so in der Art, ohne Garantie.)
MfG ChrisB
echo $begrüßung;
Und mit "damit kann ich nichts anfangen" koennen wir wiederum nichts anfangen.
Wenn ich nicht verstehe, was mir das Manual sagt, kann ich nichts anderes, als dies so zu artikulieren.
Weißt du, es ist für uns™ Antwortende nicht möglich, deine Gedankengänge direkt einzusehen oder aus dem bisschen Forumskommunikation eine Analyse deines Verstehensfunktionierens solcherart zu erstellen, dass wir dir eine Anwort präsentieren können, die du unter Garantie verstehst. Ein allgemeines Nixverstehen kann man im Grunde genommen nur mit einer möglichst alles erklärenden Antwort erwidern. Dass diese recht umfangreich ausfallen würde, kannst du dir ja vorstellen. Es hat aber nicht immer jemand Lust, aus reiner Gefälligkeit den dafür notwendigen Aufwand zu betreiben. Denn das mögliche Ergebnis wäre vielleicht: "Danke, aber die Hälfte wusste ich schon." oder "Hmm, wieder nichts verstanden." oder irgendeine andere Antwort, aus der sich ergibt, dass alles oder vieles umsonst war. Die Chancen, daraufhin noch einen hilfreichen Fortgang zu erzielen, sinken nicht selten rapide, ebenso die Antwortbereitschaft bei weiteren Problemen. Das soll alles keine Kritik sein, die du ausschließlich auf dich beziehen musst und auch keine, die dich angreifen oder dergleichen soll. Ich versuche nur, dir deutlich zu machen, warum es für dich als Fragenden so wichtig ist, möglichst detailiert dein Problem zu schildern. Als Antwortender kann man dann seinen Aufwand gezielter einsetzen und es bedeutet damit auch weniger (sinnlose) Arbeit und mehr Erfolgserlebnis. Das gibts dann obendrein auch noch für den Fragenden.
Du weißt aber hoffentlich schon, daß ich nicht nur in diesem, sondern auch in meinem Posting der letzten Tage _sehr wohl_ konkrete Fragen gestellt habe und bemüht bin, zu lernen und hier _nicht_ kommenralos und ohne drüber nachzudenken einen fertiegen Code abholen möchte.
Das hat sich dann noch zu einem positiven Ergebnis entwickelt. Ich weiß nicht, was deine Motivation ist, dich mit dem Programmieren zu beschäftigen. Offensichtlich fällt es dir nicht leicht und meiner Meinung nach hast du ein großes Problem, abstrahieren zu können, eine Vorgehensweise unabhängig vom konkreten Einzelfall verallgemeinern zu können, um ihr Prinzip im nächsten konkreten Fall anwenden zu können. Dein Willen vorwärts zu kommen ist jedenfalls beeindruckend.
Und wenn du Programmieren willst, dann musst du auch mal lernen, die zugehoerigen Dokumentationen zu lesen und zu verstehen. Das ist essentiell.
Was leider, wie ich es immer wieder und wieder sage, oft daran scheitert, daß eine Dokumentation nicht automatisch gleichzusetzen ist mit "dies ist ein didaktisch gutes Lehrbuch".
Das ist ja auch nicht ihre Aufgabe. Sie muss ja auch dem Fortgeschrittenen dienen, der einfach nur mal sehen will, wie die Parameter heißen und welche Werte sie entgegennehmen. Diese Information aus einem umfangreichen Fließtext zu extrahieren ist zu aufwendig.
Es ist nun mal leider so, daß dort Dinge oft so kurz zusammengefaßt sind oder in so einem Technik-Sprech erklärt werden, daß es der "Laie" einfach nicht verstehen _kann_.
Weil das so ist, hat man ja die Tutorials erfunden, die sich mehr Zeit für ein Thema nehmen können. Allerdings ist da der Kompromiss, dass sie dies nicht für jedes spezielle Thema in ausführlichster Form machen können.
Was stört dich den konkret an so einer Handbuchseite, vielleicht am Beispiel von fgetcsv() oder fputcsv()?
Themenwechsel. Versuchen wir™ mal mit diesem Problem weiter zu kommen.
[Datenbankabfrage, die] kein Ergebnis bring? Es kommt weder 0, noch eine Fehlermeldung oder Warnung. Im Quelltext steht dann einfach "<p>es sind Datensätze vorhanden.</p><hr />" Wo liegt denn da mein Fehler?
Es fehlt dir anscheinend auch noch das Wissen um Debuggingstrategien. Wichtig ist immer, Wunsch und Wirklichkeit miteinander zu vergleichen. Das bedeutet, dass man Kontrollausgaben macht. Unter PHP ist dafür das beste Mittel die Funktion var_dump() (abgesehen von IDEs mit integriertem Debugger). Außerdem kommt da das Handbuch mit ins Spiel. Viele Funktionen, besonders aus dem Datenbankumfeld, liefern neben dem gewünschten Ergebnis im Fehlerfall ein anderes zurück. Wie das konkret aussieht musst du dem Handbuch entnehmen. Hinzu kommt noch, dass die Datenbankfunktionen ihre Fehler nicht an die große Glocke hängen und per Meldung an die Front werfen.
Angenommen das $db->prepare() hätte was zu melden gehabt. Das Handbuch sagt unter Return Values: returns a statement object or FALSE if an error occured. Mit var_dump() kann man sich das Ergebnis, das du einer Variablen zugewiesen hast, anzeigen lassen. Du siehst dabei sowohl, ob es ein statement object ist als auch, wenn es ein false ist. Mit einem echo siehst du das false nicht, weil das als Leerstring ausgegeben wird. Die konkrete Meldung im false-Fall musst du hier mit $db->error abholen. Diese Eigenschaft (Objektvariable) kannst du mit echo ausgeben.
Das hilft dir zwar jetzt beim Entwickeln, aber wenn alles fertig ist, soll die Anwendung einerseits robust sein und andererseits den Anwender nicht mit Interna behelligen, mit denen er sowieso nichts anfangen kann. Der Rückgabewert muss also gegen das false geprüft werden und dann mit einer Alternative im Fehlerfall fortgefahren werden. Ansonsten geht es mit der Datenabfrage weiter.
Dieses Prinzip solltest du überall anwenden. Ich fasse es nochmal zusammen:
Und nicht nur die Funktionen liefern Unerwartetes, auch die Variablen enthalten mitunter solches. Auch da hilft eine Kontrollausgabe.
Was du auch noch beachten musst, sind einige PHP-Besonderheiten und womöglich noch konkrete Konfigurationseinstellungen (konkret: deaktivierte Fehlermeldungsausgabe). Es gibt Situationen, die PHP als nicht nennenswert einstuft, dir als Programmierer aber dennoch nicht gefallen. Lesezugriffe auf nicht vorhandene Variablen sind ein Beispiel dafür und Vertipper beim Variablennamen eine nicht seltene Ursache. Um PHP gesprächig zu machen sollte beim Entwickeln stets das error_reporting auf E_ALL stehen (und display_errors auf on). Am besten setzt man das auf der Entwicklungsmaschine in der Konfiguration des Projektverzeichnisses. (Die php.ini ist nicht immer ein gescheiter Ort, besonders wenn man Programme anderer ausführen will, die sich keinen Kopf um die Grundinitialisierung ihrer Variablen gemacht haben.)
Ich habe jetzt jede Menge Allgemeines geschrieben und weniger auf deine Situation bezogenes. Leider ist mir viel anderes (noch) nicht möglich, denn ohne deine Variableninhalte und Funktionsergebnisse zu kennen, gibt es zu viele Möglichkeiten, was die Ursache sein kann. Deshalb musst du erstmal selbst weitermachen und mit den Kontrollausgaben weitere Informationen sammeln. Dafür kann ich dir allerdings konkrete Beispiele geben:
$abfrage = 'SELECT COUNT(
003\_id
) FROMdbtest003
';
Das ist eindeutig. Eine Kontrollausgabe lohnt sich da eigentlich nicht. Schaden kann sie aber nicht.
$abfrageergebnis = $db->prepare( $abfrage );
var_dump($abfrageergebnis);
$abfrageergebnis->execute();
$abfrageergebnis->bind_result( $anzahl);
Bei beiden Funktionen können Fehler auftreten. Werte deren Ergebnis aus.
echo"<p>es sind ".$anzahl." Datensätze vorhanden.</p><hr />\n";
var_dump($anzahl); gibt auf alle Fälle was aus, und sei es nur ein NULL. Daraus kann man schließen, dass die Variable nicht angelegt wurde. Die Ursache wird im vorhergehenden Programmablauf zu finden sein.
abfrageergebnis->store_result();
Da fehlt ein $, hoffentlich nur ein Copy'n'Paste-Fehler. Wenn nicht, gibt dir PHP eine Meldung aus, wenn es nicht zum Schweigen konfiguriert wurde.
echo "$verabschiedung $name";
echo $begrüßung;
Leider ist mir viel anderes (noch) nicht möglich, denn ohne deine Variableninhalte und Funktionsergebnisse zu kennen, gibt es zu viele Möglichkeiten, was die Ursache sein kann.
Manchmal ist man einfach betriebsblind. Und während ich an der Antwort feilte, hatte ChrisB schon das fehlende Teil gefunden ... So kann es gehen.
echo "$verabschiedung $name";
Hi dedlfix,
Ich versuche nur, dir deutlich zu machen, warum es für dich als Fragenden so wichtig ist, möglichst detailiert dein Problem zu schildern. Als Antwortender kann man dann seinen Aufwand gezielter einsetzen und es bedeutet damit auch weniger (sinnlose) Arbeit und mehr Erfolgserlebnis. Das gibts dann obendrein auch noch für den Fragenden.
Dem kann ich folgen und Dir Recht geben. Was ich meinte, war einfach ... wenn ich Dir zB die Erklärung des Bezahlsystems der Pekinger U-Bahn auf chinesisch in die Hand drücke, dann wirst Du auch nach stundenlangem Draufschauen nicht mehr als ein "Und was ist/soll das?" fragen. Aber ich weiß schon, was Du und Chris mir sagen wollten!
Offensichtlich fällt es dir nicht leicht und meiner Meinung nach hast du ein großes Problem, abstrahieren zu können, eine Vorgehensweise unabhängig vom konkreten Einzelfall verallgemeinern zu können, um ihr Prinzip im nächsten konkreten Fall anwenden zu können.
Na das wird sich hoffentlich auch noch ändern eines Tages.
Dein Willen vorwärts zu kommen ist jedenfalls beeindruckend.
Danke. :-)
Das ist ja auch nicht ihre Aufgabe. Sie muss ja auch dem Fortgeschrittenen dienen, der einfach nur mal sehen will, wie die Parameter heißen und welche Werte sie entgegennehmen. Diese Information aus einem umfangreichen Fließtext zu extrahieren ist zu aufwendig.
Das ist mir natürlich _völlig_ klar und das war ja auch keine Kritik am Manual per se. Was ich ausdrücken wollte war, daß der Link zu einer Manualseite für nicht so versierte leute wie Euch einfach oft keine Hilfe oder Erklärung ist, die einem ein Problem löst bzw. etwas so erklärt, daß man es versteht.
Weil das so ist, hat man ja die Tutorials erfunden, die sich mehr Zeit für ein Thema nehmen können.
Das kann aber auch nach hinten losgehen. In sicher mehr als 90% aller Tutorials werden zB. Usereingaben aus einem Formular a là "$name=$_POST['name'];
" unnötig umgeformt. Gott sei Dank habe ich durch Euch hier schon lange gelernt, daß dies nicht nur unnötig ist, sondern auch insofern "gefährlich", als daß man dann bei der Weiterverarbeitung der Variable nicht mehr erkennt und deshalb leicht vergißt, daß es sich um eine ungeprüfte, nicht kontextbehandelte Usereingabe handelt. Also Ihr seht... ich lerne auch durchs Forum. ;-)
Themenwechsel. Versuchen wir™ mal mit diesem Problem weiter zu kommen.
Das habe ich jetzt _so_ gelöst:
$db->set_charset("utf8");
$abfrage = 'SELECT COUNT(`003_id`) FROM `dbtest003`';
$abfrageergebnis = $db->prepare( $abfrage );
$abfrageergebnis->execute();
$abfrageergebnis->bind_result($anzahl);
while ($abfrageergebnis->fetch())
{
echo"<p>es sind ".$anzahl." Datensätze vorhanden.</p><hr />\n";
}
$abfrageergebnis->store_result();
Und nun _wird_ das Ergebnis der Zählung ausgegeben.
Danke für dei Hilfe und Deine Ausführungen zum Thema "bessere Fragenstellung". Ich werde es mir zu Herzen nehmen!
MfG
Der Brombeermilchtrinker
echo $begrüßung;
Was ich meinte, war einfach ... wenn ich Dir zB die Erklärung des Bezahlsystems der Pekinger U-Bahn auf chinesisch in die Hand drücke, dann wirst Du auch nach stundenlangem Draufschauen nicht mehr als ein "Und was ist/soll das?" fragen.
Ach, gäbst du mir die Erklärung in elektronischer Form, tät ich sie bei Chinaboard.de ins HanDeDict einkippen und dann zumindest verstehen, worum es geht.
你会看得懂汉字吗? 我不会,但是我会说一点点。
echo "$verabschiedung $name";
你这人太固执,我真拿你没辙。
;-)
echo $begrüßung;
var_dump($record);
Dann bekomme ich folgende Ausgabe am Bildschirm:
array(2) { [0]=> string(12) "Maxi Müller" [1]=> string(46) "Zeile 1 Zeile 2 Zeile 3 Zeile 4" }
Schau mal in den Quelltext der Browseranzeige. var_dump() strukturiert seine Ausgabe mit Zeilenumbrüchen und auch die innerhalb der Daten sind als solche zu sehen. Ein Browser gibt jedoch alle Whitespace-Zeichen normalerweise als ein Leerzeichen aus. Deswegen siehst du hier nur eine Zeile. Abhilfe schafft der erwähnte Blick in den Quelltext oder ein <pre> vor der var_dump()-Ausgabe.
echo "$verabschiedung $name";
Guten Tag,
Nutze die Möglichkeiten des CSV-Formats und die von PHP zur Verfügung gestellten Funktionen fputcsv() und fgetcsv(), die können auch mit Zeilenumbrüchen problemlos umgehen.
Sie betrachten die gesetzten Zeilenumbrüche je nach Umgebung als Zeilenseperator. Das ist aber nicht das, was der Threadstarter wollte.
Gruß
Christoph Jeschke
echo $begrüßung;
Nutze die Möglichkeiten des CSV-Formats und die von PHP zur Verfügung gestellten Funktionen fputcsv() und fgetcsv(), die können auch mit Zeilenumbrüchen problemlos umgehen.
Sie betrachten die gesetzten Zeilenumbrüche je nach Umgebung als Zeilenseperator. Das ist aber nicht das, was der Threadstarter wollte.
Wenn ein Zeilenumbruch innerhalb einer mit $enclosure eingeschlossenen Zeichenkette steht, wird er nicht als Datensatztrenner gewertet. Vielleicht ist das nicht das, was er eigentlich wollte, aber eine deutlich einfachere Vorgehensweise als er derzeit versucht.
echo "$verabschiedung $name";
Guten Tag,
Wenn ein Zeilenumbruch innerhalb einer mit $enclosure eingeschlossenen
Zeichenkette steht, wird er nicht als Datensatztrenner gewertet. Vielleicht
ist das nicht das, was er eigentlich wollte, aber eine deutlich einfachere
Vorgehensweise als er derzeit versucht.
Sumerische Keilschrift wäre einfacher als dass, was er derzeit versucht ;-)
Gruß
Christoph Jeschke
Mehr als bemühen, was richtig zu machen und die Dinge zu verstehen, damit ordentlicher Code entsteht, kann ich nicht. Drum bin ich auch hier im Forum. Und mit meinen Ausführungen zeige ich wohl hoffentlich, daß ich mich auseinandersetze mit dem, was mir geantwortet wird.
Sumerische Keilschrift wäre einfacher als dass, was er derzeit versucht ;-)
Da finde ich _solche_ Bemerkunden, die ich als ein "über mich lustig machen" empfinde, etwas deplatziert.
Guten Tag,
Wie schaffe ich es _nun_, die 3 Informationen $vorname, $familienname und
$text da getrennt rauszufiltern und weiterzuverarbeiten? Die Textumbrüche
dürfen dabei _nicht_ verloren gehen, der Text soll so, wie ihn der User
eingegeben hat, aus der .csv-Datei übernommen werden und in eine DB
gespeichert werden.
Du solltest auf den seltsamen Trenner (###) verzichten und tatsächlich ein Komma-, meinetwegen auch semikolonsepariertes, Format verwenden, welches du mit fgetcsv() und fputcsv() deutlich leichter bearbeiten kannst, als mit explode(). Zeichen, die dabei eine Mehrbedeutung haben, z.B. der Zeilenumbruch, musst du dabei so escapen, dass diese ihre Mehrbedeutung verlieren, z.B. könntest du urlencode()/urldecode(), base64_encode()/base64_decode() oder pack()/unpack() verwenden.
Mal schnell als Beispiel runtergetippt (bedarf auf jeden Fall noch besserer Ausnahmebehandlung):
<?php
$values[] = array('Zeile 1, Zelle 1', 'Zeile 1, Zelle 2', "Zeile 1, Zelle 3\n mit Umbruch");
$values[] = array('Zeile 2, Zelle 1', 'Zeile 2, Zelle 2', 'Zeile 2, Zelle 3');
$h = fopen('tmp.csv', 'w+');
foreach($values as $line)
{
// in $line befindet sich nun ein array
array_walk($line, 'sanitize_csv');
fputcsv($h, $line, ';', '"');
}
fclose($h);
readfile('tmp.csv');
function sanitize_csv(&$value, $index)
{
$value = urlencode($value);
}
?>
$ php -f csv.test.php
Zeile+1%2C+Zelle+1;Zeile+1%2C+Zelle+2;Zeile+1%2C+Zelle+3%0A+mit+Umbruch
Zeile+2%2C+Zelle+1;Zeile+2%2C+Zelle+2;Zeile+2%2C+Zelle+3
Gruß
Christoph Jeschke