Beiträge von SinnlosS


    Das ganze ist zu betrachten unter: pam/stcejbo/ed.42thcaphcad (rückwärts lesen und selber tippen :P damit Google das nicht findet, gibts da ne bessere Methode?)



    Ja allerdings, die robots.txt ^^
    http://www.google.com/support/webmas…from=40364&rd=1

    Zitat


    Sollen die Inhalte einer Seite nie dem Google-Webindex hinzugefügt werden, obwohl von anderen Websites auf sie verwiesen wird, muss ein "noindex"-Meta-Tag verwendet werden. Beim Crawlen der Seite erkennt der Googlebot das "noindex"-Meta-Tag und schließt die URL aus dem Index aus.

    Zu dem eigentlichen Problem kann ich leider nix sagen, habe mich noch nicht mit mootools und/oder googlemaps beschäftigt.

    Dependency Injection ist hier der richtige Weg. D.h. du übergibst das Datenbankobjekt an dein neues Objekt, entweder beim initialiseren über den Konstruktor, oder über eine Setter-Methode.

    Alternativen wären Singleton oder eine Registry, von beidem Rate ich aber hierfür ganz ausdrücklich ab. Das ist kein schöner Programmierstil.


    Und Sessions kann ich nicht nehmen, weil der Chef auf Cookies besteht. Ist ja nicht mein Bier.



    Grundsätzlich ist soetwas eine eher schlechte Einstellung. Als Webentwickler bist Du der Profi, der Auftraggeber hat meistens keine Ahnung von den technischen Hintergründen und will irgendwelche Sachen die er irgendwo mal aufgeschnappt hat ohne wirklich zu wissen was dahintersteckt. Und da fällt es mit in deinen Aufgabenbereich den Auftraggeber über unsinnige oder sogar gefährliche Forderungen (-> Sicherheitslücken) aufzuklären.
    "Der will das so also mach ich es so ohne weiter darauf einzugehen, obwohl ich es besser weiß" ist halt nicht sehr sozial.
    Wenn ein Auftraggeber von mir etwas fordert was ich für falsch halte weise ich ihn darauf hin und erkläre ihm ganz genau wieso ich das für falsch halte. Wenn er dann weiter darauf besteht lasse ich mir diese Forderung nochmal ganz explizit von ihm unterschreiben, damit etwaige Probleme die daraus entstehen ganz klar auf seine Kappe gehen. Oder, bei Forderungen die gravierende Sicherheitslücken öffnen würden, lehne ich den Auftrag ab und lass ihn sich jemand anderen suchen der den Pfusch umsetzt.

    In diesem Fall ist es jetzt nicht so eine Riesensache. Trotzdem macht es keinen Sinn auf Sessions zu verzichten und ausschließlich Cookies zu verwenden. Cookies können beim Client deaktiviert sein oder auch vom Client manipuliert werden. Zwei Probleme die bei Sessions wegfallen. Cookies wären hier in meinen Augen höchstens eine optionale Ergänzung, wenn es um Daten geht die auch bei späteren Seitenbesuchen noch verfügbar sein sollen.

    Wenn du hier dauernd davon schreibst PHP-Funktionen über onclick-Events aufzurufen, weckt das bei mir die Befürchtung, dass du die Differenzierung zwischen Client- und Server-Seite nicht verstanden hast. Es ist aus Javascript nicht möglich PHP-Funktionen aufzurufen (man kann höchstens mit Ajax einen gewissen Workaround bauen).

    Und Sessions sind so lange gültig, wie der User auf deiner Seite ist und den Browser nicht schließt, völlig egal wieviel er da rumsurft und welche unterschiedlichen Formulare er aufruft. (Eingeschränkt natürlich durch die Einstellungen der max_lifetime)

    Bei so einer Einstellung sage ich für meinen Teil vielen Dank und bitte halt dich auch daran.

    Ein kleines Zitat habe ich noch, zum Thema Verhalten in Hilfe-Foren:

    Zitat


    Sei sozial
    Wir haben kein Interesse daran, kostenlos Deine Skripte zu schreiben oder zu reparieren, da das sehr viel Zeit und Mühe kosten kann. Akzeptiere also, dass sich unsere Motivation eventuell von Deiner unterscheidet und wir daher nur Hilfe zur Selbsthilfe geben. Wir sind nicht die Wohlfahrt und akute Programmierprobleme keine Notlagesituation. Wenn doch, wende Dich bitte mit einem Jobangebot an die Community oder einen Programmierer vor Ort.

    Hmmm...

    Ich habe ein Problem: Joomla speichert die Passwörter wohl mit MD5 + SALT, für die andere Tabelle benötige ich aber normale MD5 Passwörter. Ist das überhaupt möglich?



    Ich nehme an du brauchst die zweite Tabelle in der die User-Daten gespeichert werden für ein Joomla-unabhängiges Login?
    Dann hast du zwei Möglichkeiten:
    1.) Du findest heraus wie der Joomla-Salt ermittelt wird und bindest den entsprechend in dein eigenes Login ein.
    2.) Du hängst dich in den Joomla-Registrierungsvorgang ein, an die Stelle wo das Passwort noch im Klartext verfügbar ist, und implementierst dort den zusätzlichen Eintrag in deine Tabelle mit einem Passwort-Hash nach deinen Bedürfnissen.

    naja für gewöhnlich wird das salt ans klartext-pw drangehängt und daraus der md5-hash gebildet.. also md5 is md5, egal in welcher tabelle :)



    Nicht zwingend.


    ;)

    Nö, wenn du eine ordentliche JS-Library nutzt ist das ziemlich simpel.

    Mit JQuery könnte das z.B. so in etwa aussehen (nur eben blind in 3 minuten runtergetippt):

    HTML-Datei mit dem Formular:

    HTML
    <script type="text/javascript">
    	$(".writeToSessionOnChange").change(function(){
    		$.post("./pfad/zur/ajax-datei/ajax.php", { fieldName: $(this).attr("name"), fieldValue: $(this).val() });
    	});
    </script>
    <input type="text" name="meinFeld" class="writeToSessionOnChange" value="">

    ./pfad/zur/ajax-datei/ajax.php

    PHP
    session_start();
    if(isset($_POST['fieldName']) && !empty($_POST['fieldName']) && isset($_POST['fieldValue']) && !empty($_POST['fieldValue'])) {
    	$_SESSION[$_POST['fieldName']] = $_POST['fieldValue'];
    }



    Ein Schuss ins Blaue: Ist die dbconnect.php als utf8 mit bom encodet?
    Falls ja, auf utf8 ohne bom konvertieren.
    bom = byte order mark, das erzeugt eine ausgabe vor der abarbeitung des codes.

    Hinweis vorweg:
    Ich habe mir diese Klasse für kleinere private Projekte geschrieben, für die ich kein ORM nutze. Sie ist auf meine persönlichen Vorlieben beim Entwickeln abgestimmt. An einigen Stellen lässt sie den Kindklassen durch Sichtbarkeit protected (bzw. den Objekten einer Kindklasse durch Sichtbarkeit public) genug Spielraum um Funktionalitäten zu zerschießen.
    Das ist mir bequßt und ich nehme das aus Gründen der Komfortabilität beim Coden in Kauf. Wer auch immer diese Klasse verwenden möchte muss selber darauf achten, beim direkten Schreiben von protected-Eigenschaften aus einer Kindklasse heraus die Werte angemessen zu prüfen.
    Falls gewünscht kann ich bei Gelegenheit auch noch ein Beispiel zur Verwendung posten.
    ______________________________________________________


    Bei der Mysqli_Entity handelt es sich um eine abstrakte Klasse, die Standardfunktionen wie getter, setter, load, save, delete für Klassen bereitstellt, die eine Entitäten-Tabelle abbilden.
    Eine konkrete Klasse die von Mysqli_Entity erbt kann die nötigen Informationen für die Datenbank-Operationen (Mysqli-Objekt, Tabellenname, Felder, PrimaryKey-Informationen etc.) an die Elternklasse Mysqli_Entity übergeben und anfallende Datenbank-Operationen komfortabel an diese delegieren.
    Sämtliche Werte werden von Mysqli_Entity vor dem Eintragen in die Datenbank mit real_escape_string behandelt, und nach dem Auslesen mit stripslashes.
    Backticks `` um Tabellen- und Feldnamen werden von Mysqli_Entity ebenfalls automatisch gesetzt, sollten also bei Übergabe der entsprechenden Werte von der Tochterklasse nicht gesetzt werden.

    Mysqli_Entity stellt folgende Eigenschaften und Methoden bereit (kompletter Code im zweiten Post):

    Die Eigenschaften und Methoden im Einzelnen:

    Eigenschaften:
    private $loadPropertyOnDemand = false;
    Mit dieser Eigenschaft wird festgelegt, ob der Inhalt einer property bei Anforderung automatisch geladen werden soll, wenn dieser noch nicht gesetzt ist.
    Default ist false, dies kann über die Methode loadPropertyOnDemand() geändert werden.

    private $autosave = false;
    Mit dieser Eigenschaft wird festgelegt, ob Änderungen an Objekt-Eigenschaften beim zerstören des Objektes automatisch gespeichert werden sollen. Mit dieser Eigenschaft auf true braucht die save()-Methode also nicht mehr explizit aufgerufen werden.
    Default ist false, dies kann über die Methode autosave() geändert werden.

    private $isUpdated = false;
    Diese Eigenschaft wird nur intern verwendet um beim Aufruf der save()-Methode zu prüfen, ob Eigenschaften geändert wurden und ein UPDATE der Tabellenzeile nötig ist.

    protected $db = null;
    In dieser Eigenschaft wird das Mysqli-Objekt abgelegt. Dies kann entweder über eine direkte Zuweisung in der Tochterklasse geschehen, oder als Parameter an die Methode setup() übergeben werden.

    protected $table = null;
    In dieser Eigenschaft wird der Name der Tabelle abgelegt, von der das Objekt eine Zeile abbilden soll. Kann entweder über eine direkte Zuweisung in der Tochterklasse geschehen, oder als Parameter an die Methode setup() übergeben werden.

    protected $pkField = null;
    In dieser Eigenschaft wird der Feldname des PrimaryKeys der Tabelle abgelegt. Kann entweder über eine direkte Zuweisung in der Tochterklasse geschehen, oder über die Methode loadSchemeFromTable() (bzw. über die Methode setup() in welcher loadSchemeFromTable() aufgerufen wird) automatisch ermittelt werden.

    protected $pkValue = false;
    In dieser Eigenschaft wird der PrimaryKey-Wert der konkreten Tabellenzeile hinterlegt, die von dem Objekt abgebildet wird. Kann entweder über eine direkte Zuweisung in der Tochterklasse geschehen, oder als (optionaler) Parameter an die Methode setup() übergeben werden, oder explizit über die Methode setPrimaryKey() gesetzt werden.
    Wird der Wert in der Tochterklasse direkt zugewiesen, so ist zu beachten, dass sich die Tochterklasse vorher selber um ein ausreichendes escapen des Wertes kümmern muss, sofern dieser vom Client kommt.

    protected $properties = array();
    In dieser Eigenschaften werden die Feldnamen der Objekteigenschaften hinterlegt (nicht die Werte). Der Array kann automatisch über die Methoden loadSchemeFromTable() (bzw. indirekt über die Methode setup(), welche loadSchemeFromTable() aufruft) gefüllt werden.
    Alternativ (wenn nicht alle Felder der Tabelle verfügbar sein sollen) kann er manuell über die Methode addProperty() gefüllt werden. Hierbei ist zu beachten, dass die übergebenen Properties exakt den Spaltennamen der Tabelle entsprechen müssen (ohne Backticks ``, diese werden von der Klasse Mysqli_Entity automatisch ergänzt).

    protected $data = array();
    In dieser Eigenschaften werden die Werte der Properties hinterlegt. Der Array kann entweder automatisch über Aufruf der Methode load() aus der Datenbank gefüllt werden (mit allen Properties die zu diesem Zeitpunkt gesetzt sind) oder manuell über die Methode setProperty($property,$value).

    Methoden:
    protected function setup(mysqli $db,$table,$pkValue=false) {}
    Über diese Methode können alle relevanten Informationen für Datenbank-Operationen gesetzt werden. Der PrimaryKey $pkValue ist hierbei ein optionaler Parameter, um das Einfügen neuer Zeilen in die Tabelle zu ermöglichen.
    Diese Methode ruft die Methode loadSchemeFromTable() auf, in welcher der properties-Array automatisch mit allen Feldern der übergebenen Tabelle gefüllt wird.

    protected function addProperty($property) {}
    Mit dieser Methode können Properties zum properties-Array hinzugefügt werden. Wird nicht benötigt wenn dieser automatisch über Aufruf der Methode loadSchemeFromTable() (bzw. setup()) gefüllt wird.

    protected function setAutosave($autosave=true) {}
    Setter-Methode für die private Eigenschaft $autosave.

    protected function loadPropertyOnDemand($loadPropertyOnDemand=true) {}
    Setter-Methode für die private Eigenschaft $loadPropertyOnDemand.

    protected function loadSchemeFromTable() {}
    Diese Methode holt sich das Tabellenschema von der Datenbank und befüllt den $properties-Array mit allen Feldern der Tabelle. Ermittelt und setzt außerdem den Namen des Feldes, das als PrimaryKey fungiert.

    public function setPrimaryKey($value) {}
    Über diese Methode kann der PrimaryKey-Wert gesetzt werden. Der übergebene Wert wird mir real_escape_string behandelt.

    public function getProperty($property) {}
    Liefert den Wert einer Property. Ist der Wert für die angeforderte Property noch nicht gesetzt und die Eigenschaft $loadPropertyOnDemand steht auf false, so wird eine Exception geschmissen.

    public function setProperty($property,$value) {}
    Mit dieser Methode kann man einer Property einen Wert zuweisen.

    public function load() {}
    Diese Methode läd alle Property-Werte für das aktuelle Objekt in den $data-Array.

    public function save() {}
    Diese Methode speichert alle getätigten Änderungen. Wenn die Eigenschaft $autosave auf true steht wird diese Methode in __destruct() automatisch aufgerufen.

    public function delete() {}
    Löscht das aktuelle Objekt aus der Datenbank.

    public function __destruct() {}
    Magische Methode, wird automatisch vor dem Zerstören des Objektes aufgerufen. Prüft ob $autosave und $isUpdated auf true stehen und speichert gegebenenfalls alle getätigten Änderungen.

    private function checkTableInfo($checkPrimaryKey=true) {}
    Interne Methode die vor jeder Datenbank-Operation prüft, ob alle relevanten Eigenschaften gesetzt sind ($db, $table, $pkField, gegebenenfalls $pkValue)


    Kompletter Code:

    Für Grundlagen gibt es genug Tutorials, da lohnt es imho nicht ein Buch zu kaufen.
    Wenn du planst komplexere Anwendungen zu entwickeln kann ich zum Thema "sauberen, übersichtlichen und nachvollziehbaren Code schreiben" das Buch "PHP Design Patterns" ans Herz legen. Setzt allerdings grundlegende PHP-Kenntnisse (und möglichst auch schon grundlegende OOP-Kenntnisse) vorraus.

    Das ist grundlegend die Struktur für sowas, ja.
    Zum Mail-Versand schau dir mal PHPMailer oder SwiftMailer an. Ich rate davon ab sich selber mit der mail()-Funktion von PHP rumzuschlagen.

    Das war lediglich ein ganz simples Beispiel um zu demonstrieren wie das grundlegend funktioniert. Eine genaue Anleitung wird dir hier niemand geben. Wenn du nicht glauben willst das User-Eingaben vor der Verwendung in SQL-Statements escaped werden müssen lass das escapen weg und hoffe darauf, dass dich kein Auftraggeber wegen grober Fahrlässigkeit verklagt wenn Schindluder mit seinen Daten getrieben wird.

    Gerne. Zur Verschlüsselung mit AES oder RSA hat Dodo hier im Forum auch schon einen Thread eröffnet:
    https://www.forum-hilfe.de/threads/48792-…her-abspeichern

    Das Problem an der Verschlüsselung ist, dass du immer auch zumindest den Key zum Entschlüsseln im Klartext parat haben, also auch auf dem Server verfügbar. D.h. sollte jemand wie auch immer kompletten Zugriff auf den Server bekommen, hat er potentiell sofort auch alle Passwörter im Klartext. Bei Passwort-Hashs mit randomized salts dauert das schon länger.

    Edit: Bezüglich des Mail-Versands möchte ich dir mal noch wärmstens den PHPMailer ans Herz legen. Von der PHP-Funktion mail() rate ich dir ab.
    Kurzes Tut zum PHPMailer:
    http://phpforum.de/forum/showthread.php?t=216932

    Zum verschlüsseln muss ich grad noch bezüglich RSA korrigieren. Dort gibt es unterschiedliche Keys zum ver- und entschlüsseln. Der Server benötigt also zum Passwort-Abgleich nur den Key zum verschlüsseln.

    Da liegst du richtig jojo, ein Join auf Tabellen aus unterschiedlichen Datenbanken ist nicht möglich.
    Man braucht zwei DB-Verbindungen zu den unterschiedlichen Datenbanken. Und die jeweilige Datenbank die nicht auf dem Server liegt auf dem das Script läuft muss Verbindungen von fremden Servern zulassen. Andernfalls ist eine Live-Synchronisation nur über das bereitstellen einer API realisierbar (was allerdings auch kein Zauberwerk ist).

    Ich gebe mal für das Feld name das hier ein: '; DROP DATABASE;
    Wenn du das in deinen SQL-Befehl einbindest sieht das folgendermaßen aus:
    INSERT INTO gaestebuch SET name=''; DROP DATABASE;


    Sämtliche Daten die vom Client kommen müssen unbedingt vor der Verwendung in SQL-Statements mit mysql_real_escape_string behandelt werden.
    Bsp:

    PHP
    $name = mysql_real_escape_string($_POST['name']);

    Alternativ kannst du auch Mysqli oder PDO mit prepared Statements verwenden. Da wird dir das escapen abgenommen.