| 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! |
 |

23-09-2010, 13:31
|
|
aberultra
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 21
|
|
Anfängerproblem mit Klasse
Hallo,
ich habe mal wieder ein kleines Problemchen mit einer PHP Klasse.
Ich möchte anhand einer Textdatei (in der zeilenweise "Tabellennamen" stehen, Tabellen anlegen). Problem ist, dass immer nur die erste Tabelle angelegt wird, obwohl auch die Ausgabe des jeweiligen Schleifenpunktes korrekt angezeigt wird.
Das ist meine Klasse:
PHP-Code:
<?php
//Klasse für das Erstellen der einzelnen Tables class create_table { var $tablename; //Funktion die Tabelle $tablename erstellt function settab() { $query = "CREATE TABLE `".DBNAME."`.`".$this->tablename."` ([TABELLENFELDER])"; mysql_query($query); } }
?>
Und hier der Aufruf:
PHP-Code:
mysql_connect (DBHOST, DBUSER, DBPASS); $table = new create_table; $tablenames = file('keywords.txt'); for ($i=0;$i<count($tablenames);$i++) { $table->tablename = $tablenames[$i]; $table->settab(); echo $i . $table->tablename . "<br />"; } mysql_close();
Wie gesagt, bin was Klassen angeht noch relativer Einsteiger. Aber habe hier auch nichts im Web gefunden, was mein Problem lösen würde.
Danke schon mal für euere Hilfe.
Grüße
|

23-09-2010, 13:43
|
 |
ApoY2k
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 290
|
|
Mal ganz davon abgesehen, dass für diese Aufgabe eine Klasse völlig überflüssig ist, würde ich spontan raten, dass es am auslesen der Datei liegt. Versuch mal bei file() die Angaben
PHP-Code:
file('keywords.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
zu benutzen, vielleicht machen die den Query kaputt.
|

23-09-2010, 13:50
|
|
aberultra
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 21
|
|
Danke für Deine Hilfe.
An der file()-Funktion liegt es leider nicht. Habe ich eben probiert.
Über die Klasse habe ich das ganze geregelt, da ich hier später noch weitere Funktionen mit einbeziehen möchte.
Wie beschrieben, die Ausgabe über
PHP-Code:
echo $i . $table->tablename . "<br />";
Funktioniert an sich, beziehungsweise gibt schon die eigentlich korrekten Werte aus.
|

23-09-2010, 13:53
|
 |
ApoY2k
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 290
|
|
Dann liegts an mysql_query. Hast du Error reporting komplett hochgedreht? Da kommt bestimmt ne Fehlermeldung raus.
Was ist der Rückgabewert von mysql_query?
|

23-09-2010, 13:57
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
PHP-Code:
for ($i=0;$i<count($tablenames);$i++) {
$table->tablename = $tablenames[$i];
$table->settab();
Das ist ziemlicher Nonsense ...
Wenn die Methode etwas mit dem Tabellennamen machen soll, dann übergebe ihn ihr als Parameter.
Wenn du erst mal die Eigenschaft tablename setzt und anschließend settab aufrufst - dann hast du in settab keinerlei Kontrolle darüber, was eigentlich in tablename steht.
Man könnte deine Klasse dann auch bspw. so verwenden:
PHP-Code:
$table = new create_table;
$table->settab(); // tablename hat noch gar keinen Inhalt - ist es sinnvoll, dass die Methode trotzdem aufrufbar ist?
$table->tablename = 'xyz';
$table->settab();
$table->settab();
$table->settab(); // ist das sinnvoll - dass die Methode mehrfach mit dem selben Tabellennamen aufgerufen werden kann?
Jegliche Validierung und Fehlerkontrolle fehlt in deinem Code noch völlig - was dir jetzt u.a. auch erschwert, die Ursache des Fehlers zu finden.
Du solltest dir erst mal angewöhnen, sowas sauber umzusetzen, bevor du mit OOP anfängst.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

23-09-2010, 15:57
|
|
eagle275
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 371
|
|
lass dir wengistens mal die erzeugten Querys ausgeben ...
also
echo $query."<br>";
in deine settab-Methode - und
mysql_query($query) OR die(mysql_error());
und wenn ich spontan raten müsste, würde ich auf ([TABELLENFELDER]) tippen ..
__________________
Wer LESEN kann, ist klar im Vorteil!
Geändert von eagle275 (23-09-2010 um 15:59 Uhr)
|

24-09-2010, 09:43
|
|
reok
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 22
|
|
Das klingt alles irgendwie so, als hättest du längst nicht die Möglichkeiten ausgeschöpft, die du zur Fehlersuche selber durchführen könntest:
- Error_reporting so sensibel wie möglich
- Betrachtung der Informationen in mysql_error()
- Ausgabe der einzelnen Queries und ggf. Einfügen + Ausführen in anderem SQL Tool
- try .. catch mit Exception Ausgabe
- etc.
Hier können wir sonst nur mehr oder weniger raten und das warten aufs (zufällig) richtige Ergebnis kostet mit Sicherheit mehr Zeit als etwas Debugging und das Posten detallierterer Fehlerbeschreibungen.
Zum Problem selbst:
Was genau steht bei dir denn normalerweise in [TABELLENFELDER]? Ich schätze ja mal, das ist hier nur ein Platzhalter?
Mein erster Vorschlag wäre: In der Schleife solltest du den Tabellennamen folgendermaßen setzen:
PHP-Code:
$table->tablename = trim($tablenames[$i]);
|

24-09-2010, 11:03
|
|
litterauspirna
Registrierter Benutzer
|
|
Registriert seit: Nov 2007
Beiträge: 353
|
|
Kurz gesagt (nicht böse gemeint) deine Klasse ist totaler Schrott.
Du musst natürlich auch Fehlerbehandlungen einführen.
- ist die txt Datei existent
- ist es überhaupt ein Array nachdem du die Datei da rein geladen hast
- sind alle Werte im Array wie du sie erwartest
Dann solltest du auch mit trim() dein Array gegen White Spaces bereinigen.
Die PHP4 Schreibweise solltest du in de Tonne kloppen, wir leben in Zeiten des PHP5, dass heist arbeite mit Zugriffsspezfikationen.
Benutze einen Konstruktor und übergib dem die Parameter die sowieso immer brauchst wenn du die Klasse benutzt.
Ich habe mir selber eine Filehandling Class geschrieben die ich immer dann in anderen Klassen nutze wenn ich sie bracuhe, da werden in der Klasse dann schon Fehlerprüfungen gemacht ob das zu ladende File existiert, ob das Array, oder in was auch immer das gelesen werden soll, auch ein Array oder String etc. ist. Meistens arbeite ich beim auslesen von Files mit file(). In der Klasse wird dann auch das Array von White Spaces befreit. Am Ende habe ich ein bereinigtes zur Verarbeitung bereitstehendes Array.
Das verwende ich dann zur Arbeit in meinen weiteren Klassen. Also du solltest auch mal den Aufgabenbereich deiner Klassen überdenken, eine Klasse hat eine Aufgabe. Also deine Klasse soll Tabellen anlegen für eine Datenbank, dann sollte die Klasse aber nicht auch die Aufgabe übernehmen eine Datei auszulesen etc..
Ich denke du solltest dich noch mal mit OOP Grundlagen auseinandersetzen, so wie du das angehst wird das nichts.
Gruß Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
|
|
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
|