Ergebnis 1 bis 9 von 9

Thema: $result von Database->execute() auswerten

  1. #1
    Contao-Nutzer
    Registriert seit
    11.08.2011.
    Beiträge
    2

    Standard $result von Database->execute() auswerten

    Hallo,

    ich habe ein Update/Insert Szenario in SQL. Nun wollte ich wie üblich zuerst versuchen ein Update zu machen und wenn der Datensatz nicht existiert die Fehlermeldung abfangen und dann ein Insert zu übermitteln. Gerade beim auswerten des $result komme ich nicht so recht weiter. Wie komme ich an den Rückgabecode vom SQL? Hat jemand eventuell einen heißen Tipp?

    Danke!

  2. #2
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    $objquery=$this->Database->prepare('UPDATE tl_something SET published=0 WHERE pid=?');
    $objquery->execute(5);
    var_dump($objQuery->affectedRows);

    $objquery=$this->Database->prepare('INSERT INTO tl_something %s');
    $objquery->set('muh' => 'maeh')->execute();
    var_dump($objQuery->insertId); 
    hth
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  3. #3
    Contao-Nutzer
    Registriert seit
    11.08.2011.
    Beiträge
    2

    Standard

    Vielen Dank!

    Genau nach diesem Codeschnipsel habe ich gebraucht.... funktioniert wunderbar :-)

  4. #4
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Die Abfrage von affectedRows ist leider untauglich in Contao 3.2.20.

    Beispiel:
    In einer Tabelle, wo tstamp noch nicht gesetzt ist, mache ich ein UPDATE-Query. affectedRows liefert korrekt 0, bei nicht gefundenen Datensätzen. Ein nachfolgendes INSERT-Statement würde jetzt funktionieren.

    Zweiter Aufruf wenige Minuten später mit der gleichen Abfrage: affectedRows liefert nach UPDATE bei allen Datensätzen 0! Ein jetzt folgendes INSERT-Statement würde die Datensätze duplizieren.

    Wichtig vielleicht dabei: Ich greife bei WHERE nicht auf die ID zu, sondern auf ein anderes beliebiges Feld, dessen Inhalt aber auch immer nur einmal vorkommt (kann nicht als unique definiert werden).

    Entweder gibt es noch etwas anderes als affectedRows oder ich muß noch eine dritte Abfrage mit SELECT versuchen.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  5. #5
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Ohne deine Queries zu kennen kann man dir nicht sagen warum du eine 0 bei affectedRows bekommst bzw. was genau du erreichen willst.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  6. #6
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Hier der Codeteil mit der Abfrage:
    PHP-Code:
    // Abfrage
    $result $dewis->Abfrage($param);

    // Mit dem Ergebnis der Abfrage wird jetzt die Datenbank aktualisiert
    foreach($result->members as $m
    {
        
    $set = array
        (
            
    'nachname'        => $m->surname,
            
    'vorname'        => $m->firstname,
            
    'titel'            => $m->title,
            
    'geschlecht'    => ($m->gender == 'm') ? 'M' : ($m->gender == 'f' 'W' strtoupper($m->gender)),
            
    'zpsver'        => $m->vkz,
            
    'zpsmgl'        => $m->membership,
            
    'status'        => ($m->state == '') ? 'A' $m->state,
            
    'dwz'            => $m->rating,
            
    'dwzindex'        => $m->ratingIndex,
            
    'fideelo'        => $m->elo,
            
    'fidetitel'        => $m->fideTitle,
            
    'elobase'        => '',
        );
        
    // Update der Tabelle
        
    $objSpieler = \Database::getInstance()->prepare('UPDATE tl_dwz_spi %s WHERE dewis_id = ?')
                                          ->
    set($set
                                          ->
    execute($m->pid); 
        
    // Abfrage, ob ein Update erfolgte oder nicht
        
    $status $objSpieler->affectedRows;
        echo 
    "Status: $status (".$m->surname.",".$m->firstname.")<br>";

    Die Tabelle tl_dwz_spi ist vor dem ersten Update noch relativ jungfräulich. Es gibt die contaoeigenen Felder id und tstamp und ansonsten nur eigene Felder. tstamp ist nach dem Erstimport noch leer. Das Feld dewis_id ist eigentlich "unique", bei vielen Datensätzen aber auch leer.

    In dem Code aktualisiere ich die Tabelle nun mit Daten aus einer SOAP-Abfrage ($result = $dewis->Abfrage ...). Beim ersten Durchlauf meldet mir affectedRows korrekt 1 oder 0 betroffene Datensätze und ich könnte entsprechend ein INSERT vornehmen, um neue Datensätze mit noch unbekannter dewis_id hinzuzufügen.
    Wenn ich jetzt meine Seite aktualisiere und noch einmal die gleichen Daten der SOAP-Abfrage durchjage, meldet mir affectedRows bei jedem Datensatz 0. Es wurde nichts von Contao verändert, obwohl zumindest tstamp geändert werden müßte. An dieser Stelle kann ich also nicht mehr unterscheiden, ob das Update nicht erfolgt ist, weil a) nichts Neues dazugekommen ist oder b) die 0 geliefert wird, weil der Datensatz nicht vorhanden ist.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  7. #7
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Dir fehlt da was essentielles.
    PHP-Code:
    // [...]
        
    $set = array
        (
            
    // [...]
            
    'tstamp'        => time(),
        );
    // [...]

    Zitat Zitat von Samson1964 Beitrag anzeigen
    Hier der Codeteil mit der Abfrage:
    In dem Code aktualisiere ich die Tabelle nun mit Daten aus einer SOAP-Abfrage ($result = $dewis->Abfrage ...). Beim ersten Durchlauf meldet mir affectedRows korrekt 1 oder 0 betroffene Datensätze und ich könnte entsprechend ein INSERT vornehmen, um neue Datensätze mit noch unbekannter dewis_id hinzuzufügen.
    Richtig, das passt auch so.
    Zitat Zitat von Samson1964 Beitrag anzeigen
    Hier der Codeteil mit der Abfrage:
    Wenn ich jetzt meine Seite aktualisiere und noch einmal die gleichen Daten der SOAP-Abfrage durchjage, meldet mir affectedRows bei jedem Datensatz 0. Es wurde nichts von Contao verändert, obwohl zumindest tstamp geändert werden müßte. An dieser Stelle kann ich also nicht mehr unterscheiden, ob das Update nicht erfolgt ist, weil a) nichts Neues dazugekommen ist oder b) die 0 geliefert wird, weil der Datensatz nicht vorhanden ist.
    Klar meldet es hierbei 0, denn nach deinem Code wurde nichts geaendert.
    Ich habe mal nun das updaten der tstamp Spalte entsprechend markiert, das fehlt in deinem Code naemlich komplett.
    Contao manipuliert nicht einfach deine Queries, ebenso gibt es keine Trigger o.ae. welche magischerweise den tstamp aktualisieren, das musst du schon selber machen.
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  8. #8
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Wow, das war's! Bisher war ich der Meinung, Contao würde tstamp selbst verwalten. Und wahrscheinlich ist das auch so.
    Ich habe bei meinem Code völlig ausgeblendet, daß ich die Tabellenaktualisierung in meinem Fall ja komplett selbst vornehme...
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  9. #9
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Bisher war ich der Meinung, Contao würde tstamp selbst verwalten. .
    Das gilt aber wohl nur, wenn Du Datensätze über das Backend bearbeitest. Auch bei Verwendung eines Models muss man den tstamp selbst setzen wie ich heute lernen misste ;-)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •