Simon: affected_rows ist immer -1

Hi,
Ich will mit $stmt->affected_rows; prüfen ob ein Eintrag bereits vorhanden ist. Ich bekomme aber immer '-1' egal ob etwas vorhanden ist oder nicht.

Liegt das an etwas Bestimmten oder soll ich mal das Script posten?

MfG
Simon

  1. Hi!

    Ich will mit $stmt->affected_rows; prüfen ob ein Eintrag bereits vorhanden ist. Ich bekomme aber immer '-1' egal ob etwas vorhanden ist oder nicht.

    Wer oder was ist $stmt? Nach welchen Operationen, sagt die Dokumentation deiner verwendeten Klasse, hat welcheklasseauchimmer::affected_rows einen sinnvollen Wert? Und welches SQL-Statement verwendest du?

    Liegt das an etwas Bestimmten oder soll ich mal das Script posten?

    Üblicherweise - keine Ahnung, ob das was du machst üblich ist, denn du zeigst es ja nicht - fragt man Daten mit SELECT ab, affected Rows gibt es jedoch nur mit einer Daten ändernden Funktion.

    Zusatzfrage: warum fragst du nach der Existenz? Willst du anschließend einen Datensatz hinzufügen, wenn das Existenzkriterium noch nicht existiert und ansonsten nicht? Dazu eignet sich besser ein Unique Index über dem Existenzkriterium (kann auch mehrere Spalten umfassen) und ein unbedingtes INSERT. Wenn es daraufhin einen Unique-constraint-Fehler gibt, war der Datensatz schon da, ansonsten wurde er eingefügt. Bei dieser Vorgehensweise kann es auch nicht passieren, dass sich zwischen Abfrage und Eintrag ein anderer Prozess dazwischen schmuggelt.

    Lo!

    1. Sorry, war da wieder mal zu schnell.

      Also das Ganze mach ich mit mysqli und will überprüfen ob ein Eintrag vorhanden ist.

      $dbhost = 'localhost';  
      $dbuser = 'xxx';  
      $dbpass = 'xxx';  
      $dbname = 'xxx';  
        
      $db = new mysqli($dbhost, $dbuser, $dbpass, $dbname);  
      if (mysqli_connect_errno() == 1)  
      {  
        die('Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>'.mysqli_connect_errno().':'.mysqli_connect_error().'</strong>');  
      }  
      //Prüfen ob eintrag schon vorhanden ist  
      $sql = 'SELECT  
               *  
              FROM  
                `DB`  
              WHERE  
                `datum` = ?  
              AND  
                `stunde` = ?';  
      if(!$stmt = $db->prepare($sql))  
      {  
        echo $db->error;  
      }  
      $stmt->bind_param('ii',$Datum, $Stunde);  
      if(!$stmt->execute())  
      {  
        echo $stmt->error;  
      }  
      $anzahl = $stmt->affected_rows;  
      $stmt->fetch();  
      $stmt->close();
      ~~~``{:.language-php}  
        
      MfG  
      Simon
      
      1. Hoi!

        $sql = 'SELECT
                 *
                FROM
                  DB
                WHERE
                  datum = ?
                AND
                  stunde = ?';

        Ich zitiere hier mal dedlfix: 'affected Rows gibt es jedoch nur mit einer Daten ändernden Funktion'

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
        1. Ich zitiere hier mal dedlfix: 'affected Rows gibt es jedoch nur mit einer Daten ändernden Funktion'

          Hab ich aber anders gelesen:

          laut phpBuddy.eu:

          "Dem affected_rows fällt eine besondere Rolle zu. So kann man es bei MySQLi jetzt auch als Ersatz für num_rows verwenden. Benutzt man in einem Query INSERT, UPDATE, REPLACE oder DELETE, liefert affected_rows die Anzahl der betroffenen Datensätze. Benutzt man in einem Query SELECT, liefert affected_rows die Anzahl der gefundenen Datensätze"

          Oder ist das jetzt dich falsch?

          1. Hi!

            Ich zitiere hier mal dedlfix: 'affected Rows gibt es jedoch nur mit einer Daten ändernden Funktion'
            Hab ich aber anders gelesen:
            laut phpBuddy.eu:
            Oder ist das jetzt dich falsch?

            Nein, er hat Recht, und ich auch. Allerdings hast du nicht richtig gelesen und mir war auch nicht bekannt, dass mysqli::affected_rows wie mysqli::num_rows arbeitet, nicht aber mysqli_stmt::affected_rows. Nachzulesen in den jeweiligen Handbuch-Kapiteln.

            Lo!

          2. Dir fehlt noch ein
            $stmt->store_result();