Update nur geänderte Daten und zeige geändertes an

  • PHP

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von Link.

    Hi,

    du updatest eine Identnummer und knüpfst die WHERE-Klausel an die geänderte Nummer? wtf?!

    Mach mal in Zeile 3 folgendes: echo "<pre>" . print_r($Datensatz, true) . "</pre>"; Das foreach verschiebst du dann natürlich in Zeile 4 ..^^


    Link :thumbup:
    Hello World
    Ich Idiot, hatte dem Speichernbutton, der das alles auslöst, nur eine id zugewiesen, aber kein name Attribut :whistling:

    Außerdem fehlte bei mysqli_query der zweite Parameter ($verbindung, "SELECT * ...).

    Leider geht es nicht, dein Code spuckt folgendes aus:

    Quellcode

    1. mysqli_result Object
    2. (
    3. [current_field] => 0
    4. [field_count] => 29
    5. [lengths] =>
    6. [num_rows] => 1
    7. [type] => 0
    8. )


    Ach ja, und die eigentliche Fehlermeldung lautet:

    Quellcode

    1. Warning: mysqli_affected_rows() expects parameter 1 to be mysqli, string given


    /EDIT:
    Nein. Man kann auch die ID ändern, die wird eingetragen WO die vorherige ID war ;)
    Hi,

    ja aber wenn's ne PRIMARY und AUTO_INCREMENT ID ist, update sie am besten gar nicht.

    Stimmt, du musst dir den Inhalt von $Datensatz ja auch erst mit mysqli_fetch_array($Datenbank, FETCH_ASSOC) holen.

    Die Fehlermeldung entsteht vermutlich in Zeile #12. Da wird ja $verbindung als erstes Argument erwartet, du übergibst aber das SQL-Statement.

    Link :thumbup:
    Hello World
    Hm, mysqli_affected rows erwartet irgendwie keine zweite Variable. Zumindest spuckt er dann einen Fehler aus, wenn ich $verbindung hinzufüge.

    Wo genau soll ich das fetch array einfügen? Hab das dann bei $Datensatz hinzugefügt, aber dann geht gar nichts mehr ^^

    PHP-Quellcode

    1. $Datensatz = mysqli_query($verbindung, "SELECT * FROM `Tabelle` WHERE `Identnummer` = " . mysqli_real_escape_string($verbindung, $_POST['originalid']));
    2. $Datensatz = mysqli_fetch_array($verbindung, FETCH_ASSOC);


    Wegen der ID: Ja, passiert in der Praxis eigentlich nie, dass die mal geändert werden muss. Trotzdem muss die Funktion da sein für den Fall der Fälle
    Aha!
    Ich hab's!
    Es heißt MYSQLI_ASSOC anstelle von FETCH_ASSOC.

    Seit mysql improved ;)

    Er führt es jetzt zumindest aus und zeigt mir (so wie es aussieht, momentan noch scheinbar willkürlisch //EDIT: Muss das erst überprüfen. Wird wohl falsch übertragen vom Formular) geänderte Datensätze an.

    Der Fehler ist noch vorhanden und schätze erst dann geht es:
    Warning: mysqli_affected_rows() expects parameter 1 to be mysqli, string given in
    Hi,

    ja, die Fehlermeldung hab ich ja bereits geschrieben woran das liegt. Du musst als erstes Argument $verbindung nehmen und als zweites dann das SQL-Statement.

    Link :thumbup:
    Hello World

    Link schrieb:

    Hi,

    ja, die Fehlermeldung hab ich ja bereits geschrieben woran das liegt. Du musst als erstes Argument $verbindung nehmen und als zweites dann das SQL-Statement.

    Link :thumbup:


    So, endlich geht es!

    mysqli_affected_rows hat überhaupt nicht funktioniert. Hab jetzt stattdessen fetch array und query genutzt, es geht. Allerdings war der Synax vom UPDATE SET Befehl falsch, da hat er immer rumgemeckert. Jetzt geht alles. Die ' und ` mochte er nicht. Habe jetzt nur ' neben die Variablen gemacht.

    Was nur komisch ist, ist, dass er bei einer ganz bestimmten Spalte nicht anzeigt, dass diese geändert wurde, sofern dies stimmt. Naja, weiß nicht woran das liegen könnte, ist aber nicht ganz so schlimm. Der Rest geht
    Hi,

    ja kann sein. Was MySQLi angeht bin ich kein Profi. Mit PDO hätt' ich dir schneller helfen können.
    Normalerweise sind Backticks (um Tabellen- und Spaltennamen rum) Pflicht. Teilweise kann man sich die einfachen Anführungszeichen sparen, aber nur wenn man z.B. mit PDO die Strings quoted ($db->quote("Wert")). Ob's da ein Äquivalent für mysqli gibt weiß ich ned, müsste aber eigentlich (vllt. $db->real_escape_string("Wert") oder so). Weil das setzt die Anführungszeichen automatisch.
    Jetzt hake ich aber zum Thema PDO nochmal nach. Was spricht dagegen, mit PDO parallel eine Verbindung herzustellen, um die Änderung nach und nach zu übernehmen? Dann hättest du quasi den Code von meinem 1. Post fast 1:1 übernehmen können und das Problem wär erledigt^^ Sorry dass ich so penetrant bin.

    Um welche Spalte geht es genau? Das kriegen wir sicher auch noch hin.

    Link :thumbup:
    Hello World
    Guten Morgen,

    erstmal nochmal vielen Dank für deine Hilfe.

    Bin halt einfach eine andere Schreibweise gewohnt (prozedurale MySQLI Schreibweise nennt man das glaube ich) ^^ So habe ich es damals halt gelernt und kann mich damit zur Zeit eher anfreunden, was allerdings nicht bedeutet, dass ich PDO komplett verabscheue. Es ist relativ simpel und größtenteils selbsterklärend, dennoch schreibe ich derzeit vieles so, wie ich es gelernt habe.
    In naher Zukunft ändere ich dies voraussichtlich sogar und eigne mir andere "Schreibweisen" an, eventuell dann sogar direkt PDO. Möchte sowieso mehr in die "objektorierentierte Schreibweise" von MySQLi übergehen.

    Die Spalte, um die es sich handelt, ist "Prueffrist", welche leider ein wenig komplizierter ist, da diese leider falsch in der DB meiner Firma angelegt worden ist. Dort ist sie als String abgelegt in einem völlig beklopptem Format, z.B. Monat(e).
    Von daher muss ich diesen vorerst zerlegen und später wieder in dieses Format bringen.
    Nach etlichen Versuchen mit preg_replace usw. ist es mir gelungen, es wieder richtig hinzubekommen.
    Dennoch wird, auch bei Änderungen des Formats, dies nicht aufgelistet.
    Woran dies liegt, kann ich mir nicht erklären, schließlich überprüft dein Code ja, ob Änderungen vorgenommen wurden. Dies müsste ja spätestens dann der Fall sein, wenn ich den Wert von z.B. 12 Monaten auf 30 oder so stelle
    Hi,

    nicht nur hinsichtlich MySQL/PDO sondern generell solltest du dir objektorientiertes Programmieren aneignen. Gut, MySQLi kann man objektorientiert und auch prozedural benutzen. Aber warum Kompromisse eingehen ;) Aber mach wie du für richtig hältst. Nimm dir aber 2 Minuten und schau dir das kurz an: staticfloat.com/php-programmie…schnittstelle-ist-besser/ So jetzt aber Schluss mit dem Thema :p

    Also wenn du wie du ja sagst den Wert vor dem Eintragen erst wieder zurecht-formatieren musst, kann ja die Prüfung auf Gleichheit gar nicht stattfinden. Weil du vergleichst ja den Eintrag aus den bisherigen Daten ($Datensatz) mit denen aus $_POST. Wenn du aber $_POST['Prueffrist'] erst noch entsprechend replacen musst, kann das ja erst hinterher verglichen werden. Oder nich?

    Link :thumbup:
    Hello World

    Link schrieb:

    kann ja die Prüfung auf Gleichheit gar nicht stattfinden. Weil du vergleichst ja den Eintrag aus den bisherigen Daten ($Datensatz) mit denen aus $_POST.

    Stimmt!
    Daran liegt es.

    Okay, dann weiß ich ja jetzt, wieso das nicht geht.
    Naja, dann baue ich halt eine zusätzliche Prüfung ein und frage dadurch ab, ob sich das geändert hat.

    Danke Dir!

    Werde mir den Link dann anschauen, ich glaube ich sollte mir langsam echt die objektorientierte Schreibweise aneignen (oder gleich PDO :P )
    Hi,

    ja, und auch hier würde ich keine großartigen Code-Konstrukte überlegen. Ganz einfach bevor die Schleife durchlaufen wird (die ja $Datensatz['feld'] mid $_POST['feld'] vergleicht) direkt die Ersetzung vornehmen. Sowas wie $_POST['feld'] = str_replace('abc', 'wasauchimmer', $_POST['feld']);. Wenn die Schleife dann eben danach durchlaufen wird, passt der Wert ja bereits und wurde entsprechend so zusammenformatiert dass es passt.

    Link :thumbup:
    Hello World