Maik W. aus E.: mySQL-4.1.15 & PHP Alle mit Group gruppierten Datensätze updaten

Tach zusammen,

in meine Arbeitszeitverwaltungsprojekt lasse ich mir offene Arbeiten zum Abrechnen anzeigen.

Der SELECT dazu lautet:

  
SELECT a.arbeit_id, a.name, a.projekt_ref, a.bearbeiter, a.festpreis,  
SUM(TIME_TO_SEC(TIMEDIFF(a.ende,a.anfang))/3600) AS diff,  
a.datum, a.abrechenbar, k.stundensatz, p.projekt_name  
FROM azvs_arbeiten a, azvs_kunden k, azvs_projekte p  
WHERE a.kunden_ref='$_POST[kunden_ref]'  
AND a.kunden_ref=k.id  
AND a.projekt_ref=p.projekt_id  
AND a.abgerechnet='0'  
GROUP BY a.name, a.kunden_ref, a.projekt_ref, a.bearbeiter, a.abrechenbar  
ORDER BY a.projekt_ref  

Damit habe ich gleiche Arbeiten eines Projektes schön summiert angezeigt.

Jeder Arbeit spendiere ich eine checkbox

  
<input type="checkbox" name="abrechnen[]" value="<?=$abrechnung_daten["arbeit_id"]?>">  

um die abzurechnenden zu markieren.

Alle markierten Arbeiten werden als abgerechnet markiert, einer Rechnung zugewiesen u.ä.
Allerdings erwische ich nur die angezeigten Datensätze einer Arbeit, die gruppierten Kollegen werden nicht upgedatet.

Wie muß mein UPDATE-Befehl aussehen, wenn ich auch die Datensätze erwischen will, die in der 'a.name'-Spalte gleich sind?

Danke und
http://www.gruss-aus-essen.de

Maik

--
Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
Maik. W. aus E. sagt Dankeschön ;-)
  1. Moin!

    Der SELECT dazu lautet:

    WHERE a.kunden_ref='$_POST[kunden_ref]'

      
    SQL-Inject-Alarm! Gehst du immer so leichtfertig mit der Sicherheit um?  
      
    Nutzerdaten gehören entschärft - im Zweifel mindestens mysql\_real\_escape\_string().  
      
    
    > Alle markierten Arbeiten werden als abgerechnet markiert, einer Rechnung zugewiesen u.ä.  
    > Allerdings erwische ich nur die angezeigten Datensätze einer Arbeit, die gruppierten Kollegen werden nicht upgedatet.  
      
    Ein UPDATE und irgendeine Gruppierung irgendeines vorhergehenden SELECTs haben nicht das geringste miteinander zu tun.  
      
    Offensichtlich ist dein UPDATE fehlerhaft. Nur: Keiner kennt es bislang, also kann auch keiner sagen, was fehlt. Aber augenscheinlich fehlt die korrekte WHERE-Bedingung im UPDATE.  
      
    
    > Wie muß mein UPDATE-Befehl aussehen, wenn ich auch die Datensätze erwischen will, die in der 'a.name'-Spalte gleich sind?  
      
    UPDATE .... WHERE a.name = 'der name' ?  
      
     - Sven Rautenberg
    
    -- 
    "Love your nation - respect the others."
    
    1. yo,

      Ein UPDATE und irgendeine Gruppierung irgendeines vorhergehenden SELECTs haben nicht das geringste miteinander zu tun.

      ganz so ist es nicht. in aller regel ist es eine gute idee, vor dem update ein select zu machen, um zu sehen, ob man wirklich die richtigen datensätze trifft. so könnte ich es mir jedenfalls vorstellen.

      was mir aber auffält ist, das hier wieder die übliche mysql problematik zu tage kommt. grundsätzlich sollte man über alle spalten auch gruppen, die man ausgeben will. und das ist bei deiner abfrage nicht der fall. leider gibt mysql keine fehlermeldung mehr aus, jedes andere dbms würde bei dieser abfrage die ausfürhung verweigern. da würde ich als erstes ansetzen und dann sehen, wie es weitergeht.

      Ilja

      1. Moin!

        Ein UPDATE und irgendeine Gruppierung irgendeines vorhergehenden SELECTs haben nicht das geringste miteinander zu tun.

        ganz so ist es nicht. in aller regel ist es eine gute idee, vor dem update ein select zu machen, um zu sehen, ob man wirklich die richtigen datensätze trifft. so könnte ich es mir jedenfalls vorstellen.

        Du sprichst von menschlicher Interaktion. Klar, ein Mensch möchte eventuell erstmal alle Datensätze sehen, bevor er eine Massenänderung durchführt.

        Dennoch: Das hat auf SQL-Ebene nichts miteinander zu tun. Zumal das Verfahren bei Interaktion über den Browser nicht nur zwei komplett unabhängige SQL-Querys enthält, sondern zwischendurch sogar die Verbindung zur Datenbank geschlossen und wieder neu geöffnet wird, weil zwei verschiedene HTTP-Requests zweimal ein Skript starten.

        Es gibt also auf SQL-Ebene keine Methode, erstmal ein SELECT zu machen, und dann das Ergebnis mit UPDATE zu aktualisieren.

        Insbesondere in diesem Beispiel nicht, weil obendrein die Datensätze ja auch noch gruppiert werden.

        was mir aber auffält ist, das hier wieder die übliche mysql problematik zu tage kommt. grundsätzlich sollte man über alle spalten auch gruppen, die man ausgeben will. und das ist bei deiner abfrage nicht der fall. leider gibt mysql keine fehlermeldung mehr aus, jedes andere dbms würde bei dieser abfrage die ausfürhung verweigern. da würde ich als erstes ansetzen und dann sehen, wie es weitergeht.

        Stimmt, das war mir so noch gar nicht aufgefallen, denn immerhin sind ja etliche Spalten in GROUP BY aufgeführt - aber eben weniger, als tatsächlich im SELECT abgefragt werden.

        Das sollte in der Tat korrigiert werden. Wenn die zusätzlichen Spalten tatsächlich korrekt (im Sinne von MySQL) in allen Datensätzen identische Daten stehen haben, stört deren zusätzliche Auflistung in GROUP BY ja das Ergebnis absolut nicht.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. yo,

          Es gibt also auf SQL-Ebene keine Methode, erstmal ein SELECT zu machen, und dann das Ergebnis mit UPDATE zu aktualisieren.

          so wie es aussieht, macht er erst eine abfrage, um aus den ergebnissen die checkboxen zu bilden, die wiederum den Update erhalten sollen. insofern gibt es schon eine beziehung zwischen dem select und dem update. sein select scheint aber nicht alle gewünschten datensätze zu erfassen, die ein update bekommen sollen, wenn ich das richtig verstanden habe. sein problem ist also nicht das update, sondern der select.

          Ilja

    2. Tach auch Sven,

      SQL-Inject-Alarm! Gehst du immer so leichtfertig mit der Sicherheit um?

      Nur bei lokalen Projekten, bei denen ich der einzige User bin.

      Nutzerdaten gehören entschärft - im Zweifel mindestens mysql_real_escape_string().

      Na gut...

      Offensichtlich ist dein UPDATE fehlerhaft. Nur: Keiner kennt es bislang, also kann auch keiner sagen, was fehlt. Aber augenscheinlich fehlt die korrekte WHERE-Bedingung im UPDATE.

      Bisher

        
      UPDATE azvs_arbeiten SET abgerechnet='1' WHERE arbeit_id='id des markierten Datensatzes'  
      
      

      Hier müßte der Zusatz hin, der auch Datensätze updated, die den gleichen Namen, das gleiche Projekt, etc. haben.

      ich habe eine Schleife gebaut, um die Parameter abzuprüfen,

        
       $noch_offen_query=mysql_query("SELECT arbeit_id, name, projekt_ref FROM azvs_arbeiten WHERE abgerechnet='0' AND kunden_ref='$_POST[kunden_ref]'");  
       $anz = mysql_num_rows($noch_offen_query);  
        
        
       for($b=0; $b<=$anz; $b++){  
        $noch_offen = @mysql_fetch_array($noch_offen_query, MYSQL_ASSOC);  
        if(in_array($noch_offen["arbeit_id"], $_POST["abrechnen"])){  
         mysql_query("UPDATE azvs_arbeiten SET abgerechnet='1' WHERE arbeit_id='$noch_offen[arbeit_id]'");  
         mysql_query("UPDATE azvs_arbeiten SET abgerechnet='1' WHERE name='$noch_offen[name]' AND projekt_ref='$noch_offen[projekt_ref]'");  
        
        }  
       }  
      
      

      Damit werden alle abgeräumt, die ich haben will.

      UPDATE .... WHERE a.name = 'der name' ?

      Danke für den Schubs in die richtige Richtung!

      http://www.gruss-aus-essen.de

      Maik

      --
      Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
      Maik. W. aus E. sagt Dankeschön ;-)
  2. Hi,

    in meine Arbeitszeitverwaltungsprojekt lasse ich mir offene Arbeiten zum Abrechnen anzeigen.
    Alle markierten Arbeiten werden als abgerechnet markiert, einer Rechnung zugewiesen u.ä.
    Allerdings erwische ich nur die angezeigten Datensätze einer Arbeit, die gruppierten Kollegen werden nicht upgedatet.

    Hm - Du hast also pro Arbeit mehrere Datensätze in ein und derselben Tabelle - einen pro Bearbeiter - die sich nur im Bearbeiter unterscheiden?

    Das hieße, daß das Datenmodell nicht richtig normalisiert ist.

    Da solltest Du dann m.E. ansetzen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Tach auch MudGuard,

      Hm - Du hast also pro Arbeit mehrere Datensätze in ein und derselben Tabelle - einen pro Bearbeiter - die sich nur im Bearbeiter unterscheiden?

      Nein. Ich habe in einer Tabelle mehrere Datensätze, die sich in mehr als nur dem Bearbeiter unterscheiden.

      Ich werde das aber unten für alle nochmal ein bißchen erläutern.

      http://www.gruss-aus-essen.de

      Maik

      --
      Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!
      Maik. W. aus E. sagt Dankeschön ;-)
  3. Tach zusammen,

    Der SELECT dazu lautet:

    SELECT a.arbeit_id, a.name, a.projekt_ref, a.bearbeiter, a.festpreis,
    SUM(TIME_TO_SEC(TIMEDIFF(a.ende,a.anfang))/3600) AS diff,
    a.datum, a.abrechenbar, k.stundensatz, p.projekt_name
    FROM azvs_arbeiten a, azvs_kunden k, azvs_projekte p
    WHERE a.kunden_ref='$_POST[kunden_ref]'
    AND a.kunden_ref=k.id
    AND a.projekt_ref=p.projekt_id
    AND a.abgerechnet='0'
    GROUP BY a.name, a.kunden_ref, a.projekt_ref, a.bearbeiter, a.abrechenbar
    ORDER BY a.projekt_ref

    
    >   
    > Damit habe ich gleiche Arbeiten eines Projektes schön summiert angezeigt.  
    
    Die Gruppierung ist einfach "organisch gewachsen", da ich ein 'SUM' nicht ohne 'GROUP' bekomme. Dann wollte ich noch dies und das anzeigen lassen, so kam immer mehr zusammen. Daß ich auch alle selektierten Werte auch gruppieren muß, hat mir wirklich keiner gesagt, das ist inzwischen erledigt. Mein Problem ist inzwischen gelöst, siehe [meine Antwort ](https://forum.selfhtml.org/?t=133734&m=867272) auf Svens Beitrag  
      
      
    <http://www.gruss-aus-essen.de>  
      
    Maik
    
    -- 
    ![Diese Dauerleihgabe wird Ihnen präsentiert von ROMY!](http://www.gruss-aus-essen.de/selfforum/totes_huhn.jpg)  
    Maik. W. aus E. sagt Dankeschön ;-)