Beiträge von SinnlosS

    Du hast wirklich noch Grundlagen im Umgang mit Datenbanken dringend nötig, da muß ich Bandit recht geben.

    So, nehmen wir mal an deine Tabelle users sieht so aus:

    Code
    id | username
    ---+---------
     1 | Peter
     2 | Hans
     3 | Maria
     4 | Jan
     5 | Petra

    In $resultat hast du dann nach dem Ausführen deines Queries eine Resource-Id zu einem Ergebnis mit der kompletten Liste aller User.
    Aber du rufst nur die erste Zeile ab.
    $db->query() liefert dir nur eine Ergebnis-Resource, die Ergebniszeilen aus dieser Resource musst du aber einzeln nacheinander mit $resultat->fetch_array() abholen.

    Was dein Code macht:
    Er feuert mit $db->query() die Abfrage raus und speichert die Ergebnis-Resource in $resultat.
    Dann holst du mit $resultat->fetch_array() nur die erste Zeile aus deinem Ergebnis ab, also den Namen Peter aus meiner Beispieltabelle.
    Dein Array $ergeb sieht dann so aus:

    Code
    $ergeb ( 1=>"Peter )

    Mehr steht da nicht drin. Das heißt deine Überprüfung checkt nur den ersten Namen der von deiner Abfrage zurückgegeben wird. Alle anderen können dann so oft eingetragen werden wie sie wollen. Also Sinn voll verfehlt.
    Wenn du dir auch nur ein vernünftiges Tutorial zum Umgang mit PHP und MySQL richtig angesehen hättest wüßtest du das.

    Ganz davon abgesehen ist deine Lösung von der Performance her katastrophal. Wieso denn bitte alle User auslesen und dann mit PHP durchlaufen zum vergleichen? SQL ist viel schneller als PHP, alles was sich irgendwie schon vor der Bearbeitung durch PHP mit SQL filtern lässt sollte man auch tun.
    D.h. du erweiterst deine SELECT-Abfrage um eine WHERE-Klausel (SELECT username FROM users WHERE username='$user'). Wenn du jetzt eine Ergebniszeile zurückbekommst ist der Name bereits vergeben, wenn du keine zurück bekommst ist er noch frei.

    Achja, und nur weil du mysqli verwendest kannst du nicht auf das escapen der Usereingaben verzichten. Entweder den real_escape_string drüberlaufen lassen oder prepared Statements verwenden.

    Nur mal zwei kleine Anmerkungen:
    1.

    Zitat

    SELECT * FROM werte WHERE id='3'

    Ich denke mal id ist ein int-Wert, also kannst du die ' ' dadrum weglassen. Und wichtiger, du verarbeitest nur den Wert aus der Spalte `splitter`, wieso belastest du dann die Datenbank mit einem SELECT *? Niemals SELECT * schreiben.
    http://www.php-faq.de/q-sql-select.html

    2.
    Brauchst du den Wert `splitter` noch für irgendetwas anderes als ihn um eins zu erhöhen und neu in die DB zu schreiben? Ansonsten spar dir die SELECT-Abfrage komplett, die ist dann unnötig. Du brauchst nur:

    SQL
    UPDATE werte SET splitter=splitter+1 WHERE id=3

    SQL kann nämlich auch selber rechnen. ;)

    Also wenn du einfach dynamisch Graphen erstellen willst, da gibt es ein paar kostenlose und gute Möglichkeiten.

    Google Charts Api:
    http://code.google.com/intl/de-DE/apis/chart/
    Vorteil: läuft nicht auf dem eigenen Server -> weniger serverbelastung

    Open Flash Charts:
    http://teethgrinder.co.uk/open-flash-chart/
    Vorteil: aussagekräftige mouseover-Effekte
    Nachteil: benötigt flash beim client

    PCharts:
    http://pchart.sourceforge.net/
    Habe ich noch nicht mit gearbeitet, war ich nur mal drüber gestolpert als ich letztens nach einer chart-lösung gesucht habe.

    Geht ja wieder mit den Zeilenumbrüchen. :)

    Ein Beispiel das ich gerade nutze, finde ich schon praktisch zu handlen:

    arr.navigation.php

    getNavi($navi) (ausschnitt)

    PHP
    function get_navi($navi) {
        $return = "";
        foreach($navi as $k=>$v) {
            if(isset($_SESSION['access_lvl']) && $_SESSION['access_lvl']<=$v['access']) {
                $style  = (isset($_GET['action']) && $k==$_GET['action']) ? " style='background-color:#7e4a9a;color:#ffffff;'" : "";
                $return.= "<a href='index.php?action={$k}'{$style}> {$v['name']}</a>\n";
            }
        }
        return $return;
    }

    index.php (ausschnitt)

    PHP
    if(isset($_GET['action'])) {
        $a = (int)$_GET['action'];
        $inc = (array_key_exists($a,$navi) && $_SESSION['access_lvl']<=$navi[$a]['access'])
            ? 
            include("includes/inc.".$navi[$a]['file'].".php") 
            : 
            include("includes/inc.home.php");
    } else {
        $inc = include("includes/inc.home.php");
    }

    Ich nutze auch die von TheUser vorgeschlagene array-Lösung. Ich sehe bei der switch-Lösung keinen Vorteil, dafür aber den ein oder anderen Nachteil der vllt nicht so gravierend ist, aber wozu das in Kauf nehmen wenn es nicht nötig ist? Die array-Lösung ist auf jedenfall schneller. Und, was ich noch praktisch finde, ich kann ganz simpel noch mehr Punkte implementieren, z.b. access_lvl für unterschiedliche Usergruppen mit variierenden Zugriffsrechten. Ich würd nen Beispiel posten, aber irgendwie spinnt dieses Forum bei mir völlig rum und entfernt jegliche Zeilenumbrüche in meinen posts, könnte also nur 1-zeiler posten. kann mir jemand sagen was da los ist? wie kriegt ihr bitte zeilenumbrüche in eure postings?

    Du kommst auf die Seite zum updaten und hast deine_news_id. Zu Beginn der Seite liest du mit

    SQL
    SELECT feld1,feld2,feld2,... FROM news WHERE id=deine_news_id

    die Daten von der News aus die du bearbeiten möchtest. Dann baust du ganz normal dein Formular auf und belegst die Felder vor mit den ausgelesenen Daten. In das Formular setzt du dann noch ein hidden-feld in das du die id der news schreibst, damit du auf der Folgeseite weißt welche News bearbeitet werden soll. Auf der update-Seite an die die Daten geschickt werden führst du dann den UPDATE-Befehl durch:

    SQL
    UPDATE news SET teaser=? , text=? , ..... WHERE id=deine_news_id

    Wenn du es wirklich nur ein einziges Mal ausführen willst würde ich es einfach in zwei Abfragen aufteilen.
    Eine um die IDs auszulesen die schonmal etwas bestellt haben.
    Die Zweite um aus `customers` alle auszulesen, die nicht in der Menge enthalten sind.
    Unterabfragen sind immer langsam und sofern irgend möglich zu vermeiden.

    Wenn du es nicht nur einmal brauchst, sondern gelegentlich mal (bist du wirklich sicher dass du das nie wieder brauchst?) würde ich meine vorgeschlagene Lösung nehmen. Zum Aktualisieren der Customerstabelle brauchst du ja nur eben ein Script, das dir die IDs (distinct) ausliest die schon etwas gekauft haben und für diese IDs dann die neue Spalte `gekauft`auf 1 setzen.

    Ich würde der Tabelle customers ein feld `bestellt` o.ä. hinzufügen. default null, bei einer Bestellung auf 1 setzen.
    Dann sparst du dir die unterabfrage und ein boolean-feld mehr in der customers-tabelle macht den Braten nicht fett.

    Ist ein schönes Beispiel dafür, dass man manchmal in Sachen Normalisierung ein bißchen zurückstecken sollte zugunsten der Performance.

    Beim INNER JOIN werden nur die Zeilen aus der Stammtabelle ausgelesen, bei denen in der zweiten Tabelle auch ein passender Datensatz zur join-Klausel gefunden wird.
    Beim OUTER JOIN werden alle ausgelesen bei denen die WHERE-Klausel greift, wenn in der zweiten tabelle kein zugehöriger Datensatz gefunden wird werden die aus dieser Tabelle selektierten Felder auf NULL gesetzt.
    Mit der ifnull-Funktion kann man einen Wert vorgeben den ein Ergebnisfeld annimmt wenn es NULL ist

    Also möchtest du einen Auftrag erteilen das dir jemand so etwas schreibt? Was zahlst du denn?
    Wenn du nur ein wenig Hilfe willst mußt du schon ein paar mehr eigene Ansätze liefern.
    Das was du hier liefert ist nichts weiter als eine Projektbeschreibung die man gegen Bezahlung umgesetzt haben möchte.
    Ist nicht böse gemeint, mehr als Anregung dir Hilfe erstmal durch zeigen von Eigenbemühungen zu verdienen. :)

    Yoa ist ganz nett.
    Die konsequente Verwendung von SELECT * ohne irgendeinen Hinweis, dass das in der Praxis sehr schlecht ist, finde ich nicht gut, zumal sich das Tutorial ja ganz klar an Neu-Einsteiger richtet.
    INNER JOIN hättest du auf jedenfall noch erwähnen sollen. Auch die ifnull-Funktion von SQL ist gerade für OUTER JOINS in meinen Augen erwähnenswert.
    Ansonsten ist das was angesprochen wird schon ok nach dem ersten Überfliegen.

    Ich bin ja leider in JavaScript eine ziemliche Null und finde grad bei einer kleinen Testfunktion das Problem nicht.

    Ich habe folgenden Code:

    Layout und HTML-Code ist erstmal völlig Banane, das wird noch angepasst und spielt derzeit noch keine Rolle. Es geht mir lediglich auf die Javascript-Funktionalität.
    Beim Klick auf die Zellen mit der id "standx"/"zielsetzungx" soll der entsprechende div-bereich eingeblendet und der jeweils andere ausgeblendet werden.

    Momentan funktioniert gar nichts.

    Beim Aufruf der Seite kommt in der Firefox Fehlerkonsole die Meldung:

    Zitat


    invalid assignment left-hand side
    document.getElementById("zielsetzungID"+i).style.background-color="#cecfd2";

    Beim Klick auf eine der Tabellenzellen kommt:

    Zitat


    ProfilSwitch is not defined

    Ich kann mir irgendwie grad leider beide Meldungen nicht erklären.

    Hat jemand einen nützlichen Hinweis für mich? :)

    Ein Feature welches der nächste (oder vielleicht auch eher übernächste?) Firefox mitbringen soll, ist das erstellen von neuen Prozessen für jeden Tab. Das bietet Chrome ja schon (bedingt). Beim Firefox soll es dann auch möglich sein sich bei der gleichen Seite in unterschiedlichen Tabs mit unterschiedlichen Accounts einzuloggen. Für Webmaster die Seiten mit verschiedenen Benutzergruppen entwickeln natürlich sehr praktisch.

    Das hängt wohl nicht nur mit den verschiedenen Prozessen für verschiedene Tabs zusammen, sondern auch damit, ob Kommunikationsschnittstellen zwischen den einzelnen Tabs/Prozessen möglich sind.

    Kennt zufällig jemand einen Browser der dieses Feature bereits bietet bzw. wo man dies über entsprechende Einstellungen erreichen kann?

    Entweder ist das nicht die Datei addtheme.php oder du hast da schon was geändert und der Fehler kommt nicht mehr.
    Ohne den wirklichen Code der den Fehler hervorruft können wir dir nicht helfen.


    Der Code 1zu1 kopiert von dem was du uns hier postest schmeißt nur notices für undefined index.

    Ich vermute mal addtheme.php wird in eine datei includet die du aufrufst und du hast die ersten 9 zeilen aus eben der datei die du auch aufrufst hier gepostet. Der Fehler liegt aber in der addtheme.php

    mit $mysqli->prepare($sql) wird das statement vorbereitet und die kennung wird in $res gespeichert.
    Mit $res->bind_param("i",$usergroup) wird festgelegt wie die ? in dem Statement belegt werden sollen und um welchen Variablentyp es sich handelt. Das escapen wird dann beim ausführen automatisch gemacht, man braucht benutzereingaben also nicht mehr selber gegen sql-injections absichern.
    das "i" in den klammern sagt, dass es eine integer-variable sein soll. "s" stünde für string, "d" für double und "b" für blob.
    $usergroup ist dann der wert der bei jeder ausführung der abfrage entsprechend eingesetzt wird. bei jedem $res->execute() wird das statement mit dem aktuellen wert von $usergroup ausgeführt.
    $res->bind_result($name) ist für SELECT-Abfragen und legt fest in welchen Variablen die ausgelesenen Werte abgelegt werden. Man bekommt keinen array zurück wie z.b. bei $row = mysql_fetch_array($res).
    Das spart resourcen und man braucht nicht umständlicher mit array-indices arbeiten.
    $res->fetch() holt dann die ergebnise der abfrage ab und speichert sie für die aktuelle zeile in den variablen die mit $res->bind_result festgelegt wurden.

    Der Code fragt also aus der Tabelle `user` alle namen ab die einer bestimmten usergroup angehören und gibt diese aus.