Beiträge von cottton

    Müsste man in diesem Fall alle Lebensmittel vorgeben, so das die Besucher nur noch ankreuzen müssen, um somit später eine Statistik machen zu können?


    Auf der/dem Seite/Formular - klar. Die Benutzer müssen doch irgendwo die Sachen auswählen können.
    (evtl hab ich die Frage nicht verstanden =)

    Zwecks Statistik:
    Es ist am Anfang nicht ganz einfach sich da rein zu denken. Ich versuchs garnicht erst groß zu erkären - ich zeigs besser mal:


    Tabelle `user` hält nun also die Grunddaten der Benutzer.
    Jeder Benutzer hat eine eindeutige `id` (PRIMARY KEY und AUTO_INCREMENT).
    In Tabele `user_auswahl` findest Du diese ids wieder. (sollten dort PRIMARY KEY und einzigartig sein, aber nicht AUTO_INCREMENT).
    Also steht fest: jeder Benutzer findet sich in der Tabelle `user_auswahl` mit seiner id wieder.

    Die Spalte `lieblingsessen_id` hat Zahlen als Werte (numerisch).
    Diese Zahlen sind auch wiederum ids. Und diese ids finden sich wiederum in der tabelle `lieblingsessen` wieder.
    Das heißt Du kannst Dir die Tabelle `lieblingsessen` wie die Tabelle `user` vorstellen. Jedes Essen (Eintrag) hat also eine id, welche in anderen Tabellen (zB `user_auswahl`) genutzt werden können, um sie "wieder zu finden".

    Wenn Du nun einfach in Tabelle `user` den Benutzer 2 auswählst, dann hat Benutzer 2:
    - den vorname: steffan
    - den name: bla
    - (Du suchst in Tabelle `user_auswahl` die id 2 und findest) die `lieblingsessen_id` 1
    - (und suchst in Tabelle `lieblingsessen` nach der `lieblingsessen`.`id` 1 und findest) das `lieblingsessen` Wurst.

    In einem Sql-Statement würde man ein SELECT in etwa so erstellen:

    Wenn Du jetzt auf der Seite eine Auswahl angeben wilslt,
    dann holst Du Dir alle verfügbaren Zeilen (Datensätze) aus der Tabelle `lieblingsessen`.
    Dadurch hast Du alle Lieblingsessen und ihre ids um zB ein Selectfeld (oder checkboxen) zu erstellen.

    Beim Speichern verwendest Du dann die ids, um sie in Tabelle `user_auswahl` abzulegen (speichern).


    Zu Statistik:
    Willst Du nun wissen wie viele Benutzer gerne Fisch essen, dann:
    - "guckst Du" in die Tabelle `user_auswahl`
    - siehst, dass Fisch die id 4 besitzt
    - suchst in Tabelle `user_auswahl` nach allen Benutzern, die als `lieblingsessen_id` die id 4 besitzen

    Ein Sql-Statement wäre in etwa:

    SQL
    SELECT  
        `name`,
        COUNT(`id`) AS `Anzahl`
    FROM
        `lieblingsessen`
    JOIN
        `user_auswahl` AS `user_wahl` 
        ON (`lieblingsessen`.`id` = `user_wahl`.`lieblingsessen_id`) 
    WHERE
        `lieblingsessen_id` = 4;


    mit Erklärung:
    am Anfang steht die Grundauswahl:

    SQL
    SELECT -- wähle aus:
        `name`, -- den namen
        COUNT(`id`) AS `Anzahl` -- und zähle die ids und nenne es (AS) `Anzahl`
    FROM -- von
        `lieblingsessen` -- allen vorkommenden speisen 
    WHERE -- wo
        `lieblingsessen_id` = 4; -- die speise die id 4 besitzt


    Jetzt mit dem JOIN:


    Damit hat Du dann zB die Anzahl der Benutzer, die als Lieblingsspeise Fisch angegeben hatten.

    Siehst kompliziert aus. Man muss sich aber einfach nur reindenken können - und das kommt mir der Zeit =)

    ich hoffen das war jetz nicht zu viel. kommt grad nix im Fernsehn =)

    Gibts mehrere Möglichkeiten.
    zB "UNION", "JOIN" oder sogenannte "Subqueries".

    Bsp:

    Hier wäre also 2 Tabellen. Was auffällt ist, dass der Benutzer mit id 3 keinen Eintrag in der Tabelle `benutzeradressen` hat.
    Hier das Sql-Statement, um aus beiden Tabellen die Daten zu bekommen:

    SQL
    SELECT
        `name`,
        `ort`
    FROM
        `benutzer`
    LEFT JOIN -- ~"hänge an" 
        `benutzeradressen` AS `adr` -- die tabelle als name `adr`
        ON (`benutzer`.id = `adr`.`benutzerid`) -- wenn zutrifft (was in klammern steht)

    Durch LEFT JOIN (also durch das LEFT) wird aus der ersten Tabelle trotzdem ein Datensatz geholt, auch wenn kein passender Datensatz in der zweiten Tabelle gefunden wurde.
    Die Felder sind dann mit NULL belegt

    EDIT: hier nochmal ein Bsp für Deine Tabellen


    SQL
    SELECT
        `Vorname`,
        `Name`,
        `Lieblingsessen`
    FROM
        `Tabelle1`
    LEFT JOIN 
        `Tabelle2` 
        USING (`id`)


    Ergebnis sollte sein:

    Code
    Tabelle1
    Vorname | Name  | Lieblingsessen
    -----------------
    hans    | Wurst | wurst
    steffan | bla   | sülz
    iknito  | usw   | NULL

    Wenn ich das ganze dann auf 10 und 15 Sprachen erweitere


    oO?
    Das ist mal ein Vorhaben.
    Eine word by word Übersetzung macht hier dann wohl keinen Sinn mehr.
    Für kleinere Systeme wie zB beim Login macht das Sinn. Dort wird aus dem Schlüssel "user" Werte in verschiedenen Sprachen : "User", "Benutzer", ...

    Für Ganze Texte/Seiten gibts mMn bessere Methoden:
    - google tools zum Übersetzen ganzer Seiten
    - ganze Texte in verschiedenen Sprachen anbieten/anspeichern

    Wenn Du also selbst die Übersetzungen speichern/anbieten willst, dann würde ich die genannten SQL Varianten nutzen und die ganzen Texte darin abspeichern (je nach länge als TEXT, MEDIUMTEXT, LONGTEXT).
    Ob eine Tabelle für alle Sprachen oder pro Sprache eine Tabelle häng dann wohl von der Menge ab -> wird es unübersichtlich, dann mehrere Tabellen.
    (wobei mit "unübersichtlich" nicht wirklich die Ansicht der Tabellen gemeint ist)

    Wenn ich das jetz richtig verstehe:
    "console.log("after: "+vergeben);" sollte also nicht mehr ausgegeben werden?
    Oder anders: wenn .done returnt, dann soll Ende Gelände der function checkUsernameUsing() ?

    Da liegt wohl das Problem:
    Du setzt ein return in .done, was ja selbst eine function ist.
    Dadurch bist Du aus .done raus, allerdings immernoch in checkUsernameUsing().

    ich kenne mich mit jquery nicht aus, aber evtl geht das hier:

    JavaScript
    function checkUsernameUsing(username){
     ...
     var x = .done(function( output ){}
     if(x === ?){return}
     ...
    }

    Fehler deuten =)

    Zitat

    Notice: Array to string conversion in E:\xampp\htdocs\testwebsite\aktuell.php on line 95


    heißt ~"Notiz: Array zu String Umwandlung in ..."

    Das liegt daran, dass Du ja jetzt nicht nur den "artikel" aus der Funktion getPage() zurück gibst.
    Vorher haben wir nur "artikel" zurückgegeben:

    PHP
    $content = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return  $content[0]["artikel"];


    Jetzt aber den kompletten Datensatz:

    PHP
    $content = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return  $content;


    Demnach musst Du außen klären, ob das was zurück kommt das ist, was Du erwartest:


    Wie gesagt - lass Dir ruhig mal die Daten Ausgeben, um zu sehen was Du da zurückbekommst.

    Kommt halt immer darauf an was Du von der Funktion erwartest,
    Ich dachte (sah für mich so aus) als ob Du immer nur 1 Ergebnis erwartest.
    Man kann ja aber alles erweitern.

    hier: (code momentan)


    muss return geändert werden:

    Lass Dir dort (vor dem return) auch gleich mal $content ausgeben, damit Du ne Vorstellung hast, was dort "rauskommt" (format ect):

    PHP
    echo '<pre>';
    var_dump($content);
    echo '</pre>';

    k,
    Erstmal was wegen den Platzhaltern:

    SQL
    WHERE `slug` = "aktuell"


    Du brauchst dort nicht den Wert fest reinschreiben.
    Die Funktion erwartet $pagename. Also wird sicherlich im Script

    PHP
    getPage('aktuell')


    aufgerufen.

    Um den Wert jetzt in die Sql-Query zu bekommen nutzen wir die Platzhalter (zB :platzhalter oder :xyz):

    SQL
    WHERE `slug` = :pagename


    Dieser Platzhalter wird dann mit dem Wert ersetzt, den wir über die Parameter mitgeben:

    PHP
    $para = array(
        ':pagename' => $pagename 
        // :pagename ist der platzhalter (könnte auch :a benannt werden), und $pagename ist die var welche wir in die funktion bekommen ( function getPage($pagename) )
    );


    $table:
    Copy/Paste Fehler.
    Wenn die Abfrage funktioniert hat, dann kommen wir ja zu diesem Punkt:


    Da Du hier nur einen Datensatz erwartest steckt "das Gesuchte" also im Array auf Ebene 0: $content[0]
    Und Du willst ja nur den Artikel zurückgeben, also:

    PHP
    return $content[0]["artikel"];


    hier nochmal alles zusammen:

    k, vorweg: lauras kannste das Thema mal bitte verschieben? Evtl in "Sonstiges" o.ä.

    Zur "Rechtfertigung":
    - es sollte kein tut werden/sein.
    - ich vertrage Kritik und hab damit überhaupt kein Problem. Deshalb will ich hier jetz mal nachhaken
    - "eher angebracht wäre eher etwas ala 'für Anfänger reicht ..." -- geb ich Dir recht

    "außerdem da du dich an null Konventionen hältst sehr schlecht lesbar" -- oO?
    Welche denn? Das Leerzeichen nach nem Komma oder vor der geschweiften Klammer?
    Konventionen sind ja kein "Muss". Und selbst wenn man sich daran nicht hält, muss der Code ja nicht schlecht lesbar sein.
    Die Gewohnheit spielt da ja auch ne große Rolle. Und evtl hab ich mir ja was schlechte angewöhnt.
    Daher die Frage: was ist unkonventionell?

    hm ...
    @Basiii
    ich wollte gerade auf Deinen Post eingehen ... aber irgendwie hab ich dazu gar keine Lust.
    Mir kommts vor, als ob Du nen schlechten Tag hattest o.ä.

    kurz:
    der Post sollte kein "hallo, das hier is awesome, musste haben" sein.
    Es soll nur zeigen wie einfach die PDO Geschichte ist.

    Über den Rest kann man sich streiten, und dazu hab ich kein Bock =)

    edit:
    lauras
    "Einfache Datenbankklasse erstellen" wenn das n Wink sein sollte, erm ... das hier sollte kein tut werden

    edit2:
    lauras tut wäre dementsprechend auch fehl am platz =/

    ich nehm mal frei ... glaub hier passiert komisches.

    Ich glaub ich hab da Dein und wolfs code gemischt :D sorry,

    Fragen ist immer gut. Man muss verstehen, was der Code macht.
    Ich hoffe ich konnte das hier verständlich erklären :D

    Zusätzlich solltest Du Dir das hier mal ansehen: Prepared Statements und Stored Procedures

    Link zum Thema: http://www.php.net/manual/de/pdo.prepared-statements.php

    Hier gibts nix weiter zu sagen, außer dass der code denke ich gut zu verstehen ist und
    wer PDO immer noch nicht nutzt, ist selbst schuld :p

    Die Klasse:

    Bsp zur Nutzung:

    ich glaube (ohne nachzuprüfen) Du mischt hier mysqli functions und mysql functions.
    die "alten" mysql sind depreciated (nicht empfohlen/veraltet) und die mysqli (i für improved) the way to go.

    Aber ... um es gleich von Anfang an richtig zu machen: prepared statements
    in deinem Fall:

    EDIT:
    Da war noch ein Fehler:

    SQL
    SELECT `artikel` FROM `aktuelles` WHERE `slug` = :pagename ASC;
    // SELECT .. FROM ... WHERE ... ORDER BY xyz ASC/DESC
    // also richtig:
    SELECT `artikel` FROM `aktuelles` WHERE `slug` = :pagename ORDER BY `dasNachDemDuSortierenWillst` ASC;

    Empfehlung:

    PHP
    # anstatt:
    $sql = 'SELECT `artikel` FROM `aktuelles` WHERE `slug` = "'.mysqli_real_escape_string($pagename).'" ASC;';
    #mMn besser:
    $sql = "SELECT `artikel` FROM `aktuelles` WHERE `slug` = '".mysqli_real_escape_string($pagename)."' ASC;";


    Also in der Sql-Query Werte mit einfachem Anführungszeichen. (ist aber Geschmackssache)

    Wenn kein Fehler, dann kann es sein, dass zb " page " rein kam. also der Wert in der db nicht existiert.
    Oder Groß/-Kleinschreibung ... ect.

    Einfach mal die Query ausgeben lassen (echo $sql) und direkt anwenden, um zu sehen ob es denn etwas zu SELECTen gibt =)
    (SELECT gibt keinen Fehler aus, wenn nichts "gefunden" wurde.)