mysql und php insert/update

  • da ich ja nen vollhorst in sachen php bin und mit datenbanken auch net so viel zu tun hatte bsiher brauch ich nochmal die hilfe von einem php/msql-crack ;)

    also kurz mal die sachlage erklärt:
    ich hab 3 tables (user, skill und userskill-- jeweils mit id, name- ausser userskill da sind usr_id und skl_id zu einem primary key zusammengefasst und dazu kommt noch nen skill-lvl-indikator)

    über die tabelle userskill mach ich die abfragen, was auch funktioniert. ich kann via dropdown die entsprechenden werte auswählen und ausgeben lassen.

    jetzt hab ich folgende ausgabe:
    [Blockierte Grafik: http://home.arcor.de/synaptic/hier/db_ausgabe.png]

    wie man sieht hab ich mich bei der bewertung für sql vertan und würd des gerne ändern. (statt "kann ich" lieber ein "geht so" )
    denn es kann ja sein, dass sich an den fähigkeiten was ändert ;)
    wie kann ich sowas machen wie "update oder insert"?
    und wie kann ich die meldungen der db in meine datei reinbekommen?

    ich will also ne abfrage haben ob da nen eintrag ist, den entsprechend updaten oder wenn nix drin is dann insert into.
    hab bisher nur:

    Code
    if(isset($_GET['skill_eintrag'])){
    
    
    				$sql = "INSERT INTO userskill VALUES
    							(".$form_user.",".$form_skill.",".$form_slvl.")";
    
    		echo "Eintrag durchgeführt";
    		}


    was aber meiner anforderung mal gar nicht gerecht wird...
    zumal ja das echo immer ausgeführt wird (hatte ich auch erstmal nur zur kontrolle obs wirklich funzt)

    wenn mal jemand kurz nen zaun zum winken hat fänd ich des mal obergeilo ;)

  • jaa wie der syntax im sql is is dabei kein thema.. nur wie kann ich via php abfragen ob der eintrag als solches schon existiert?
    ich muss ja irgendwie ne kontrollstruktur haben an der ich festmache ob ich nen update oder insert benutze.

  • asooo... da würd mir nur der einfachste weg einfallen.. ala

    Code
    $query = "SELECT * from ..... where ....";
    $result = mysql_query($query);
    if (mysql_num_rows($result) != 0)
    ....

    bin allerdings auch noch recht neu in php.... *G*

  • Kürzer aber vllt etwas unsauberer, ungetestet:

    oder:

    Die Felder sind alle int, oder? ansonsten in den sql-befehlen noch ' ' um alle strings.

  • ach jo des könnte klappen..
    also nur zum verständnis:
    ich mach nen select auf entsprechende zeile, wenn dann ne 0 zurückkäme wäre der rückgabewert false und damit könnte ich ein insert durchführen, da ja keine entsprechenden daten in der bank liegen,
    ansonsten käme dann das update mit entsprechenden werten dran..

    hab ich des so richtig vertanden?
    (bin heut schon seit halb 9 heut früh am rechner mit insgesamt maximal 2.5 bis 3 std unterbrechung)

  • jup, genau so dacht ich mir des....

    allerdings hab ich grad noch ne andere idee gehabt.

    - ein delete statt des selectes
    - ein insert

    so wird das feld, falls vorhanden gelöscht, und anschließen ein neues angefügt.

  • danke ihr beiden, ich denke ich werd mich dann morgen in aller frische dransetzen ;)
    welche methode ich benutzen werde weiß ich noch net.. evtl wirds nen hybrid ;)

    DANKE nochmal :smilie176: :haende: :danke2: :danke: :streichel:

  • Hmm, also das mit dem UPDATE lässt sich eigentlich ganz einfach gestalten.

    SQL
    UPDATE tabelle SET spalte = wert WHERE id = id_vom_betreffenden_user


    Damit werden vor allem nicht alle Zeilen gesetzt, wie in Drivers Version, und wenn es den Benutzer nicht gibt, passiert auch nichts.

    Viele liebe Grüße
    The User

  • @ user

    wennst den user dann nicht gibt, gibt dann bandits mysql_error was zurück ?
    weil dann könnte man ja die abfrage auch so gestallten:

    - update
    - wenn mysql_error -> insert

  • Zitat von driver

    - update
    - wenn mysql_error -> insert


    Wenn ein update nicht funktioniert, weil ein entsprechender datensatz nicht vorhanden ist, dann wird kein fehler gesetzt, sprich, mysql_error ist in dem moment nicht zur überprüfung, ob ein datensatz geändert wurde, zu gebrauchen. Mit mysql_affected_rows kommt man da weiter, allerdings auch nur bedingt. Denn wenn der Datensatz existiert, aber keine änderung durchgeführt wird, liefert mysql_affected_rows leider auch 0 zurück. Daher einfach replace statt update/insert benutzen.

  • ui ui ui fette sache das hier trotz scheinbar guter lösung noch so viel geschrieben wurde ;)

    ein ausdrückliches DANKE noch an Bandit, werde diese Variante dann wohl nutzen! konnte mich noch net um die beiden links kümmern, werd ich aber tun, sobald ich die mir aktuell vorliegende seite dem proprietären scheiss (ie6 + ie7-wobei des mit dem ie7 ja noch geht ohne grosse probleme) angepasst habe...
    wieder einmal ein grund für http://www.savethedevelopers.org/