logik Frage SQL

  • Bin gerade am grübeln, wie ich Daten sinnvoll und traffic-sparend speichere.
    Vorgang ist:
    - neuer Datensatz (Spieler)
    - in db mögliche Daten sind x,y,z
    - beim aktuellen Spieler wurden keine Daten für "z" festgestellt, somit wäre diese NULL


    Wenn ich jetzt prepared Statements nutze, kann ich ja keine SQL-Kette bilden, wie ich es gewohnt war.
    Somit erwartet das stmt x,y,z.
    Mein Gedanke war nun, wenn es kein z gibt, brauch ich kein NULL an die db schicken.
    In wirklichkeit ginge es hier um mehrere (~6, dabei auch größere) Datensätze.


    Das stmt ist also vordefiniert und erwartet x,y,z. Wenn ich kein z übergebe, schmeisst es mir Fehler um die Ohren.
    Also wäre wohl die einzige Möglichkeit 2 Varianten des stmts zu definieren.
    Welches davon genutzt wird, lässt sich relativ einfach dynamisch setzen.


    Frage ist nun. Juckt es die db denn überhaupt, ob ich immer alle Daten an sie schicke,
    oder sollte man doch nur das reinschicken (insert/update), was gerade nötig ist?

  • Fehler:
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    Bsp:
    $stmt->prepare("UPDATE table SET name = :name, nachname = :nachname WHERE column = :id");
    Jetzt schicke ich nur :name rein um bekomme die Fehlermeldung:
    if($stmt->execute(array('name' => 'cottton))){
    ...
    }


    Es erwartet 2 parameter: :name und :nachname



    Was meinst Du mit Standard festlegen?

  • ich kenne deine classe da nicht aber ich füge so neues ein:
    $sql = "INSERT INTO `solutions` (`title` ,`description`)
    VALUES ('".$title."' , '".$description."');";


    mysql_query($sql) or die("Anfrage nicht erfolgreich: ".mysql_error());



    und beim updaten...


    "UPDATE `solutions` SET 'title' = '".$wert."' WHERE `id` = ".$solutionid." LIMIT 1";


    mysql_query($sql) or die("Anfrage nicht erfolgreich: ".mysql_error());


    ligt der fehler nun an deiner sql abfrage oder an deiner classe

  • Nicht meine class. Prepared statements: http://www.php.net/manual/de/pdo.prepared-statements.php


    Ich hab vor paar wochen nen Wink bekommen, dass es "sowas" gibt.
    Und als ich gelesen hab, dass mysql_query und co depreciated und wohl bald (in neueren php versionen) entfernt werden soll, wollte ich gleich auf pre-s. wechseln.


    Vorher hab ich auch alles in $sql geschickt nach dem prinzip

    PHP
    if(isset($soundso)){
     $sql .= ", soundso = ".mysql_real_escape_string($soundso);
    }


    Also konnte man schön die Kette erstellen und abschicken.
    Mit pre-s. ist die Kette aber schon defniert.
    Klar könnte ich es auch erst, wenn ich weiß was ich wirklich brauche, die sql query "preparen". Aber ich glaub das wiederspricht dem Sinn des Ganzen.


    Der Fehler an sich ist kein Problem. (ausser, dass er keine meldung zum Abfangen schmeißt=)
    Hab es jetzt mit 2 varianten gelöst.
    Ein p-statement für den kompletten Datensatz, und einen für den Mindestdatensatz.


    Die Frage ist ja - interessiert es die db überhaupt, ob ich ihr Traffic/Arbeit erspare, in dem ich die Arbeit auf das nötigste reduziere?
    (ich denke dabei auch an die HDDs: Weniger Daten an die db = weniger schreiben auf der HDD ? ?( )

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!