Hab mal kurz reingeschaut. Was er da erzählt ist grundsätzlich schon richtig. Mir ging es darum eben die Ausgabe von der Verarbeitung zu trennen. Wenn das Formular abgesendet wurde prüfst du die Daten, gibst aber während der Prüfung noch nichts aus sondern legst die Meldungen die du ausgeben willst in Variablen ab.
Und erst wenn die Verarbeitung komplett fertig ist kommt deine Ausgabe. Und da kannst du dann die abgelegten Meldungen mit ausgeben. Das widerspricht, soweit ich es mir angeschaut habe, nicht dem von dir verlinkten Video.
Beiträge von SinnlosS
-
-
Naja, verkehrt wäre es nicht, die Struktur ist verbesserungsfähig. Stichwort EVA-Prinzip.
Du solltest erstmal nur den PHP-Teil abhandeln, bevor du irgendeine Ausgabe machst. Alles was du im PHP-Teil ausgeben möchtest speicherst du in Variablen ab die du dann später an der entsprechenden Stelle ausgibst.
Also Aufbau:
- Prüfen ob Formular abgeschickt wurde
-- Falls ja:
--- Eingaben ok? Mail versenden und Erfolgsmeldung
--- Eingaben nicht ok? Passende Fehlermeldung
- Ausgabe des Formulars und gegebenenfalls Erfolgs-/FehlermedlungSo in ganz grob zur Struktur. Die Überprüfungen kannst du ja aus deinem Script übernehmen, du kannst das ganze aber eben klarer strukturieren, was bei eventueller Fehlersuche und -korrektur hilfreich ist, wie du jetzt merkst.
-
echo __LINE__ gibt dir die aktuelle Zeilennummer aus. Wenn das in Zeile 10 steht wird 10 ausgegeben, wenn das in Zeile 279 steht wird 279 ausgegeben.
Wenn du also diese Ausgabe in jeden if- und else-Zweig deines Scripts packst kannst du anhand der Ausgabe ganz genau schauen wo welche Bedingungen erfüllt werden oder nicht und dann eben sehen wo es nicht mehr wie erwartetn läuft. -
Beschreibe das mal bitte genauer, ich versteh soviel wie Banhof??
Mach in deinen if- und else-Bedingungen mal überall echo-Ausgaben rein, z.B. echo __LINE__."<br>";
Dann hast du eine schöne Ausgabe der Zeilennummern im Skript und kannst genau schauen an welcher Stelle in welche Bedingung gesprungen wird und ab wo es nicht mehr wie erwartet läuft. Da kannst du dir dann Inhalte von Variablen ausgeben lassen die geprüft werden und schauen ob die erwarteten Werte drinstehen.PHPMailer ist wirklich sehr simpel zu verwenden, da brauchst du keine Angst vor zu haben
Hier ein simples und schnelles Tutorial dazu:
http://phpforum.de/forum/showthread.php?t=216932
Ich kann nur empfehlen direkt darauf umzusteigen.Ansonsten ist mir noch eine Sache aufgefallen, du solltest im form-Tag als action nicht $_SERVER['PHP_SELF'] verwenden. Nimm lieber action=""
http://blog.oncode.info/2008/05/07/php…-scripting-xss/ -
Im Eröffnungspost meinte ich.
Es geht nicht darum wo das eingefügt wird, sondern welche Informationen enthalten sind. Wenn da nicht noch mehr Spalten dazukommen brauchst du eben keine Tabelle nehmen, dann sind es ja keine tabellarischen Daten sondern eine Liste. -
Np. War halt wie gesagt ohne testen nur eben hingetippt.
Was mir grad noch auffällt:
So wie dein Code im Eingangsteil steht würden da Listen statt Tabellen wesentlich mehr Sinn machen. -
???
Du hast in deinem Code doch schon alles was du brauchst, du mußt nur die Rückgabe von height() speichern und dann für den top-Abstand diesen zwischengespeicherten Wert nehmen. Wenn dich das ablegen eines Wertes in eine Variable überfordert, kann ich dir ganz ehrlich nur dringend ein Grundlagen-Tutorial ans Herz legen, das ist ja nun wirklich absolutes Basiswissen. -
http://typo3-blog.net/tutorials/news/jquery-height.html
Zitat
Hat man jedoch die Höhe eines HTML-Elements nicht hardkodiert gesetzt, so gibt der Internetexplorer "auto" anstelle einer Zahl zurück. Auf die eingebaute Höhenfunktion zur ermittelung der Höhe eines HTML Element in jQuery zurückzugreifen ist daher sinnvoll. Zusätzlich gibt es auch noch die Funktionen innerHeight() Das ist die Höhe eines Elements mit Padding aber ohne Rahmen und outerHeight() welche den Rahmen mit einschließt. Mit outerHeight(true) kann man sogar die Höhe eines Elementes inklusive des Margins testen.
Je nachdem wie du die Höhe brauchst nimmst du die entsprechende Funktion, den Rückgabewert musst du natürlich zwischenspeichern um ihn danach setzen zu können.
Beim setzen des top-Wertes für ul#footerNavi nimmst du dann halt einfach den zwischengespeicherten Wert, statt 5px hardcoded. -
Auf einer Seite darf eine ID nur einmal verwendet werden
Genau das. Wenn du etwas mehrmals brauchst nimmst class. ID muss eindeutig sein.
Das was du möchtest kannst du dann z.B. so machen (ungetestet):HTML<html> <head> <title>Test</title> <link rel="stylesheet" type="text/css" href="style.css"> <script type="text/javascript" src="jquery.js"></script><script> $(function(){ $("tr.name").click(function(){ thisTable = $(this).parents("table"); thisTable.find("td.detail").toggle(); }); }); </script> </head> <body> <table border="0"> <tr class="name"><td><a href="#">Produktname</a></td></tr> <tr class="detail"><td>Details 1</td></tr> <tr class="detail"><td>Details 2</td></tr> </table> <table border="0"> <tr class="name"><td><a href="#">Produktname</a></td></tr> <tr class="detail"><td>Details 1</td></tr> <tr class="detail"><td>Details 2</td></tr> </table> </body></html>
Edit: Musst dir wohl rauskopieren zum Lesen, Editor spinnt und streicht alle Zeilenumbrüche aus dem Code, ka wieso.
-
Mein Problem hat nicht direkt mit Flash zu tun, dürfte da aber häufiger auftreten.
Ich habe eine fertige Flashseite die die Inhalte aus XML-Files einliest. Diese XML-Files werden auch von Suchmaschinen-Robots erfasst, was ja prinzipiell erstmal gut ist. Jetzt werden aber in den Suchmaschinen bei den Ergebnissen auch direkt die XML-Dateien gelistet und das sieht beim Aufruf natürlich nicht schön aus.
Wie kriegt man es hin, dass die XML-Files zwar von robots ausgelesen werden, normale Besucher aber direkt auf die index.php geleitet werden? Alle Aufrufe automatisch auf die index.php zu leiten ist natürlich per .htaccess kein Problem. Aber das betrifft dann ja wohl auch die robots.Weiß jemand wie man sowas am dümmsten löst?
-
Code habe ich mir noch nicht angeschaut, nur grad mal überflogen, und zu deinen Tabellen muss ich sagen: Katastrophe.
Wie zur Hölle kommst du auf die Idee alle Spalten als VARCHAR zu deklarieren???IP-Adressen werden als unsigned INT(10) gespeichert, zum schreiben bzw. auslesen gibt es die SQL-Funktionen INET_ATON und INET_NTOA.
Timestamps werden als Timestamp (oder zur Not Datetime) gespeichert, aber ganz sicher nicht als VARCHAR, das ist ja noch schlimmer als INT.
Und wie kommst du bei `count`/`anzahl` darauf als Feldtyp VARCHAR zu nehmen? Was soll denn eindeutiger ein INT-Wert sein als ein Counter?
Davon abgesehen ist auch die unterschiedliche Benennung mit deutschen und englischen Begriffen nicht schön. Man nimmt entweder englische Bezeichner (zu empfehlen) oder deutsch, aber kein MischMasch.Ich würde außerdem nicht nur anhand der IP-Adresse nach einmaligen Besuchern differenzieren. Was ist mit Schulen, Unis, Inet-Cafes undundund?
http://phpforum.de/forum/showthread.php?t=216531Schau dir da mal die Punkte Browsersignatur/Browsermarker an um einen Besucher etwas sicherer eindeutig zu identifizieren.Also grundlegend mag das schon ganz nett sein, ist aber sicherlich noch ausbaufähig.
Nicht böse gemeint, sondern als konstruktive Anregung.
-
http://de2.php.net/manual/de/function.urlencode.php
ZitatGibt einen String zurück, in dem alle nicht-alphanumerischen Zeichen außer -_. durch ein Prozentzeichen (%) gefolgt von zwei Hexadezimalwerten und Leerzeichen durch ein Plus (+) ersetzt werden.
Ein + ist ein nicht-alphanumerisches Zeichen außer -_. und wird daher durch ein Prozentzeichen (%) gefolgt von zwei Hexadezimalwerten maskiert. Hätte man auch einfach mal ausprobieren können.Im übrigen hat unregistriert Recht, htmlentities/htmlspecialchars sollte nicht vor dem Eintragen in die Datenbank verwendet werden, sondern nur nach dem Auslesen je nach Bedarf. In die Datenbank kommen die Daten so wie sie vom User angegeben wurden (Ausnahme natürlich Maskierung durch mysql_real_escape_string, bzw. durch Verwendung von prepared Statement bei Mysqli/PDO).
-
Auch die hardgecodeten Leerzeichen um den Bindestrich sollten maskiert werden.
-
BackToTopic:
Wir haben gesehen - bei INTs ist PHP schneller, bei DATEs hat PHP absolut keine chance auch nur ansatzweise mitzuhalten. Die Tabelle vom Gast ist INT. Bei INTs braucht PHP rund 0.18 Sekunden. Bei DATEs brauch MySQL rund 0.7 Sekunden.
Dem TS rate ich daher zu INTs und PHP, er kann alelrdings auch seine Tabelle in DATE umwandeln und MySQL benutzen - völlig egal.
Ach das fällt mir ja grad erst auf... Junge, schau dir erstmal meinen Code richtig an...
Ich habe das ganze in einer for-Schleife die 1000x durchlaufen wird, du hast einen Durchlauf. Also bitte... -
https://www.forum-hilfe.de/forums/53-Job-…r-und-Webmasterehr kann man hier eigentlich nicht sagen. Weniger Eigeninitiative geht ja kaum.
-
Die Tabelle vom TS IST aber KEIN DATE! Sonst würde ich das ja nicht diskutieren.
Und WELCHE ROLLE soll das SPIELEN? Ein Script zum Umschreiben der Daten ist in 5 Minuten erstellt. -
Immernoch schneller.
PHP
Alles anzeigen<?php $db=new mysqli(...); set_time_limit(0); $sql="SELECT DISTINCT MONTH(time) FROM timetable"; $time=microtime(true); if (!$db->query($sql)) { echo $db->error; exit(); } $time=microtime(true)-$time; echo $time."<br>"; $sql="SELECT DISTINCT time FROM timetable"; $time=microtime(true); if ($erg=$db->query($sql)) { while ($res=$erg->fetch_array()) { $foo=date("m-Y", $res['time']); } } $time=microtime(true)-$time; $erg->close(); echo $time; $db->close(); ?>
Code
Alles anzeigen0.18918585777283 0.17720413208008 0.21651482582092 0.17818307876587 0.22041511535645 0.17874884605408 0.18550992012024 0.18051195144653 0.25362706184387 0.18164610862732
Für mich ist das eindeutig. Bei 500.000 Datensätzen wäre der Unterschied noch deutlicher.Wunderbar, und jetzt nimm bitte mal kein INT für das Datum, sondern DATE.
Auf eine Tabelle mit ~650.000 Datensätzen:
PHP
Alles anzeigen<?php require_once "dbconnect.php"; $sql="SELECT DISTINCT DATE_FORMAT(`datum`,'%Y-%m') FROM `sn_info`"; $time=microtime(true); for($i=0;$i<1000;$i++) { if (!$db->query($sql)) { echo $db->error; exit(); } } $time=microtime(true)-$time; echo $time."<br>"; $sql="SELECT DISTINCT `datum` FROM `sn_info`"; $time=microtime(true); for($i=0;$i<1000;$i++) { if ($erg=$db->query($sql)) { while ($res=$erg->fetch_array()) { $foo=date("m-Y", $res['time']); } } } $time=microtime(true)-$time; $erg->close(); echo $time; $db->close(); /* 0.73600792884827 7.1520810127258 */ ?>
DAS ist ein eindeutiges Ergebnis... -
Setz doch mal bitte bei microtime den Parameter auf true, dein Ergebnis sagt exakt gar nix aus in der Form.
-
Für Datums-Felder nimmt man auch die Datums-Feldtypen von MySQL, dafür gibt es die. Ein INT ist eine schlechte Idee, warum zeigt sich hier mal wieder. Du brauchst im Query jedesmal eine Funktion mehr wenn du Datums-Berechnungen/-Formatierungen in der Abfrage durchführen willst. Und das ist performanter als PHP rödeln zu lassen.
-
Hallo, die Datenbank ist mit der Installation erstellt worden wozu das Forums gehört. Ich habe diese nicht selber angelegt. So zur groupid=9 das ist die ID von der Gruppe wo ich die User gerne von haben möchte (also die Namen der User die in dieser Gruppe sind).
Die Fehlermldung sieht so aus:Code[FONT=Verdana][size=10][B]SQL-DATABASE ERROR[/B] [B]Database error in WoltLab Burning Board:[/B] Invalid SQL: SELECT username, userid FROM bb1_groups LEFT JOIN bb1_users ON userid=userid WHERE groupid=9 [B]mysql error:[/B] Column 'groupid' in where clause is ambiguous [B]mysql error number:[/B] 1052 [B]Date:[/B] 19.08.2011 @ 23:26 [B]Script:[/B] /statistik.php [B]Referer:[/B] [/SIZE][/FONT]
Die Fehlermeldung besagt, dass es in deiner Abfrage mindestens zwei Tabellen gibt, die eine Spalte 'groupid' haben. Daher musst du in der Abfrage genau angeben auf welches 'groupid' aus welcher Tabelle du dich beziehst. Das machst du indem du in deiner Abfrage statt `groupid` dann `tabellenname`.`groupid` schreibst.
Du kannst für den Tabellennamen natürlich auch ein Alias vergeben, Beispiel:
Ja, query() gibt dir auch nur einen Verweis auf die Resource zurück, in der die Ergebnisse abgelegt sind. Du musst die aber noch von dort abholen. Je nachdem was für eine Datenbankklasse du verwendest sieht das anders aus.
Bei mysqli z.B.