Sorry, da fehlte natürlich in der ersten Zeile der Funktionsaufruf "array" zur Erstellung des arrays.
Muss natürlich so aussehen:
Beiträge von SinnlosS
-
-
Habe den verlinkten Code gerade nur mal überflogen. Da ist eine Menge sehr unschönes Zeug drin. Im Prinzip würde ich dir raten das lieber komplett neu zu schreiben. Um ein wirklich sauberes Ergebnis zu bekommen ginge das sicherlich schneller als das da alles zu überarbeiten.
Ich habe gerade nicht die Zeit (und ehrlich gesagt auch nicht so die Lust ;)) mir das alles genau zu Gemüte zu führen, ist ja jetzt auch nicht soo wenig Code.
Aber zu deiner konkreten Frage zumindest:
Das hast du grundlegend schonmal richtig erkannt.
Die Prüfung sollte aber erweitert werden, mindestens um ein file_exists() um zu überprüfen ob die zu includierende Datei überhaupt existiert.
Außerdem, als schnelle Lösung die schonmal ein wenig Sicherheit gegen manuelle Manipulation der GET-Parameter von Usern liefert, ein array anlegen, welches die Dateinamen enthält die includiert werden dürfen.
Vor dem include dann halt prüfen ob die Datei includiert werden darf.z.B.:
PHP$allowed_files = ("home.php" , "view.php" , "edit.php"); if(isset($_GET['index']) && file_exists($_GET['index']) && in_array($_GET['index'] , $allowed_files)) { include($_GET['index']); }
Außerdem dringend erforderlich: Die Verwendung von mysql_real_escape_string() auf alle Daten die vom User kommen und in Datenbank-Queries verwendet werden.
Also z.b. alle POST- und GET-Daten.Mein Beileid übrigens, diesen Code überarbeiten zu müssen. Sowas macht in der Regel nicht gerade Spaß, besonders wenn man sich mit der Sprache nicht gut auskennt.
-
Schönes Beispiel das ich neulich in einem Script hatte (sinngemäß):
PHPif(0=='Beliebiger String ohne Ziffer als erstes Zeichen') echo "Ja"; else echo "nein"; // Ausgabe: Ja
Da habe ich auch erstmal etwas gestutzt...
Obwohl es natürlich logisch ist wenn man die Casting-Regeln von PHP bedenkt. Beim nicht-strikten Vergleichsoperator == wird ein String der mit einem Integer-Wert verglichen wird eben zu einem Integer-Wert umgecastet.
Und bei einem String der nicht mit einer Ziffer beginnt ist das eben 0. -
Es geht nicht primär um Belastung der Datenbank, sondern zum einen darum, dass vernünftiges Debugen mit eval() nahezu unmöglich ist, zum anderen um eine vernünftige Struktur, in der Daten (Datenbank) und Programmcode (Scripte) getrennt werden.
Desweiteren ist es eine extremes Sicherheitsrisiko PHP-Code über die Content-Verwaltung in die Datenbank schreiben zu lassen.Wie gesagt, mach von mir aus was du willst, mein Rat ist eben nur, dir so einen Pfusch-Stil gar nicht erst anzugewöhnen. Der schnellste Weg ist nicht immer der Beste.
-
Crazywulf hat recht, eval is evil. Ich sehe bei deinem Beispiel auch überhaupt keinen Grund dafür. Wieso bitte sollen die Scripte an der Stelle ausgeführt werden? Was spricht dagegen den Code der an der Stelle der Platzhalter ausgeführt werden soll ganz normal im Script über eine Funktion aufzurufen und dann in deinem Content den Platzhalter mit dem Ergebnis zu ersetzen? Wieso soll der Code grad an der Stelle ausgeführt werden? Leuchtet mir nicht ein, auch wenn ich mir zugegebenermaßen dein Beispiel nicht groß angeschaut habe.
eval ist aber in 99,99% der Fälle eine Murks-Lösung (mir persönlich ist ehrlich gesagt noch nie ein sinnvoller Einsatz von eval untergekommen, der nicht auf andere Weise wesentlich sauberer zu lösen gewesen wäre).Und PHP-Code hat definitiv NIX in der Datenbank verloren.
Klar mag es bei deinem kleinen privaten Projekt "egal" sein. Aber wozu unsauberen Stil angewöhnen, wenn es auch vernünftig geht? Der Mensch ist ein Gewohnheitstier.
Wenn es jetzt läuft und dir egal ist lass es ruhig so, aber tu dir selbst einen Gefallen und gewöhn dir sowas nicht an. -
func_get_args hat doch nichts mit optionalen Parametern zu tun und ist in den meisten Fällen SinnlosS
Wenn man nicht wissen kann, wieviele Parameter an die Funktion übergeben werden, dann ok, aber ansonsten s.o.
Naja, ich finde schon, dass func_get_args mit optionalen Parametern zu tun hat.
Anwendungsgebiete gibt es durchaus, allerdings nicht gerade häufig, das stimmt schon.
PHP
Alles anzeigen<?php function sum(){ $s=0; foreach(func_get_args() as $a) $s+= is_numeric($a)?$a:0; return $s; }; print sum(1,2,3,4,5,6); // will return 21 print sum(3,2,1); // will return 6 print sum(false,array(),5,5); // will return 10 ?>
Das finde ich beispielsweise ein sehr anschauliches Beispiel für den praktischen Nutzen dieser Funktion. Ist aus den Kommentaren auf http://php.net/manual/de/function.func-get-args.php kopiert.
-
http://php.net/manual/de/function.func-get-args.php
Schau dir die Funktion mal an, könnte dir helfen.
Ein ganz simples Beispiel damit:
-
Warum komm ich immer auf die Lösung 30 Minuten nachdem ich irgendwo nachgefragtDas nächste mal wnen ich ne Frage hab und hier nachfragen will wart ich extra noch ne halbe Stunde länger^^
Das geht mir auch immer so. Halbe Stunde länger warten bringt aber leider nix, manchmal muss man einfach erstmal aufgeben um zu gewinnen -
Ist kein nennenswerter Aufwand.
Hier hast du ein Beispiel für php mit mysql:
http://www.php.net/manual/de/mysql.examples-basic.php -
http://marakana.com/blog/examples/…ithout-ssl.html
Finde ich eine nette Sache, werde ich demnächst mal austesten und gegebenfalls auch bei einigen Projekten implementieren.
Ist natürlich, wie dort auch geschrieben, kein vollwertiger SSL-Ersatz, aber auf jedenfall schonmal ein netter Anfang. -
unset($preis); kannst du dir sparen, wenn du danach nen neuen Wert zuweist wird der alte eh überschrieben.
Hast du mal echo-Ausgaben in deine if-Bedingungen (if-Schleifen gibt es nicht) gebaut, um zu sehen ob da überhaupt reingesprungen wird? Falls nicht kann natürlich der Preis auch nicht überschrieben werden, und das ist eigentlich die einzige mögliche Fehlerquelle die ich da spontan sehe.achso, wichtig dazu zu sagen ist noch, das es auf einer seite geschehen soll automatisch, sobald ein produkt und eine stückzahl und eine motivanzahl ausgewählt ist, soll der "errechnete" preis erscheinen, bzw sobald die bestimmte bedingung erfüllt ist, soll der dazu passende presi ausgeworfen werden ... geht das überhaupt ohne button oder sowas?
oder muss ich echt nen kleines aktualisierungszeichen dahin machen damit der den preis errechnet?Das geht mit Ajax.
-
SQL
Alles anzeigenSELECT COUNT(z.userid),h.name,g.herstellerid FROM zuordnung z INNER JOIN grafikkarten g ON g.id=z.grafikkartenid INNER JOIN hersteller h ON h.id=g.herstellerid GROUP BY g.herstellerid
Erfolgreich getestet mit folgenden Daten:
Code
Alles anzeigen-- -- Tabellenstruktur für Tabelle `grafikkarten` -- CREATE TABLE IF NOT EXISTS `grafikkarten` ( `id` int(11) NOT NULL AUTO_INCREMENT, `herstellerid` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; -- -- Daten für Tabelle `grafikkarten` -- INSERT INTO `grafikkarten` (`id`, `herstellerid`) VALUES (1, 1), (2, 1), (3, 2), (4, 2); -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `hersteller` -- CREATE TABLE IF NOT EXISTS `hersteller` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; -- -- Daten für Tabelle `hersteller` -- INSERT INTO `hersteller` (`id`, `name`) VALUES (1, 'a'), (2, 'b'); -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `zuordnung` -- CREATE TABLE IF NOT EXISTS `zuordnung` ( `userid` int(11) NOT NULL, `grafikkartenid` int(11) NOT NULL, PRIMARY KEY (`userid`,`grafikkartenid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Daten für Tabelle `zuordnung` -- INSERT INTO `zuordnung` (`userid`, `grafikkartenid`) VALUES (1, 1), (2, 1), (3, 2), (4, 3), (5, 4);
-
Meines Erachtens ist das nicht möglich, auch ohne Ahnung von PERL oder OLE zu haben.
Es reicht die Tatsache, das PERL serverseitig läuft und du eine Überprüfung von etwas vornehmen möchtest was clientseitig läuft. Das kann nur mit Ajax funktionieren.Client schickt request an Server.
Server generiert über PERL/OLE Excel-Sheet und schickt es an den Client zurück.
Client empfängt Excel-Sheet.Ab da findet ohne neuen Request keine Kommunikation mehr zwischen Client und Server statt. PERL läuft auf dem Server, das Excel-Sheet ist auf dem Client geöffnet.
Du benötigst auf jedenfall einen neuen Request an den Server um Änderungen die client-seitig im Excel-Sheet vorgenommen werden mit PERL/OLE zu verarbeiten.
Ob dieser Request jetzt durch Ajax vorgenommen wird oder durch einen neuen Seitenaufruf spielt keine Rolle, aber ohne Request an den Server können PERL und OLE nichts machen.
Ka ob man clientseitig beim schließen des Excel-Sheets irgendwie ein Request an den Server auslösen kann, aber wie gesagt, ohne Request können PERL und OLE nichts machen.Aus diesem Grund wird es wohl auch keinen Befehl geben um zu überprüfen ob das Excel-Sheet noch geöffnet wird. Es besteht keine persistente Verbindung zwischen Client und Server, der Befehl wäre also sinnlos. In dem Moment wo dein Perl-Script durchgelaufen ist werden die Ergebnisse an den Client geschickt und auf dem Server passiert nichts mehr bis ein neuer Request eingeht.
-
Perl ist eine clientseitige Scriptsprache? Das wäre mir neu. Auch wenn du das lokal per Xampp laufen hast gibt es weiterhin die Differenzierung zwischen Client und Server.
-
Also ich habe keine Ahnung von Perl, noch nie damit gearbeitet.
Aber das läuft ja auch serverseitig? Und die Excel-Datei ist clientseitig geöffnet?
Dann brauchst du eine Ajax-Lösung. -
Hoppla *g*
Das hatte ich übersehen, hatte nicht nach rechts gescrollt.
Ok, dann sind wohl wirklich einfach die Login-Daten falsch
Trotzdem wird auch bei korrekten Logindaten der header() nach der echo-Ausgabe nicht mehr laufen.rexee: Die Passwörter sind aber md5-verschlüsselt in der user-Tabelle hinterlegt?
-
Ne, wenn username oder passwort nicht stimmen würde, müsste ja der die()-Befehl ausgeführt werden und "Logindaten inkorrekt" ausgegeben werden.
Ich würde sagen, er loggt sich korrekt ein, da aber per echo-Befehl schon eine Ausgabe erfolgt ist wird die Weiterleitung per header() nicht ausgeführt.error_reporting hochdrehen wie es in Bandit's degub-Anleitung steht, dann sollte auch eine entsprechende Fehlermeldung kommen.
Und wenn dann das echo $sql; auskommentiert wird sollte es mit korrekten Logindaten auch laufen. -
Du öffnest das Skript im Editor und gehst dann den Code nach folgenden Kriterien durch:
Nach jedem ; kommt ein Enter.
Nach jeder { kommt ein Enter, und die folgenden Zeilen werden mit einmal Tab-Taste eingerückt.
Jede } steht in einer eigenen Zeile und ab da wird wieder mit Backspace ein Tab zurückgesetzt. -
Ich persönlich bevorzuge auch joins weil ich sie ebenfall viel übersichtlicher finde, das sind "unterschiedliche" where-bedingungen und die gehören für mich getrennt.
Bei den einen geht es um die Bedingungen der Tabellenverknüpfungen, in den anderen um fest Wert "von außen".PHP
Alles anzeigen$sql = " SELECT ia.id,ia.vorgabe,ia.preis,ia.start,ia.stop,ia.bezahlt,ia.erhalten,ia.finished, sb.id,sb.email,sb.name,sb.passwort,sb.url, sn.id,sn.name,sn.logo, a.id,a.aktion, ifnull(MAX(id.datum),'2070-12-12 23:59:59'),ifnull(SUM(id.done),0), ifnull(ac.id,0),ifnull(ac.name,'---') FROM ind_assign ia INNER JOIN sn_band sb ON sb.id=ia.sn_band_id INNER JOIN sn ON sn.id=sb.nwk INNER JOIN aktionen a ON a.id=ia.aktion_id LEFT JOIN ind_done id ON id.ind_assign_id=ia.id LEFT JOIN ind_account ac ON ac.id=ia.ind_sub_id WHERE (ia.ind_id=? OR ia.ind_sub_id=?) AND ia.finished<2 GROUP BY sn.name ASC,a.aktion ASC,sb.email ASC";
Ka, also da möchte ich meine Inner Joins nicht missen.
Generell ist es aber letztendlich sowieso Geschmackssache, solange man da keine Vorgaben hat soll man das natürlich so machen wie man selber gut mit klarkommt.
-
Die Funktion benötigt aber auch $table
Und ich würde da schon isset() reinbauen. Du kannst die Notices die da en masse geschmissen werden zwar ausstellen, aber sauberes Programmieren ist das nicht.PHP
Alles anzeigen// Prüft ob ein Wert in einer Spalte vorkommt function in_spalte($wert, $spalte, $table, $zeile_aktuell=9) { for ($zeile = 0; $zeile < $zeile_aktuell; $zeile++) { if (isset($table[$zeile][$spalte]) && $table[$zeile][$spalte] == $wert) { return 1; } } return 0; }
Im Aufruf der Funktion dann natürlich noch $table ergänzen und optional, aber empfohlen, $zeile_aktuell. Alle Zeilen danach brauchen nicht mehr geprüft zu werden, die sind ja noch nicht belegt. Und die Funktion wird damit auch für mehr als 9 Zeilen nutzbar.
@RMB klar wird das aufgerufen, wenn der Wert nicht gefunden wird
Das ist ja der Sinn der Funktion...
Edit: Blödsinn, natürlich nicht, war grad verpeilt, hast Recht mit dem break