hawkmaster: Prüfen ob Datensatz vorhanden, rowCount doch ok bei Select ??

Hallo zusammen,

ich möchte herausfinden ob in einer Tabelle schon ein Datensatz steht oder ob sie leer ist. Wenn leer dann Insert, wenn schon vorhanden dann Update.

Bisher hatte ich in meinen Script meist mit "mysql_num_rows" gearbeitet.
Ich möchte nun versuchen auf PDO umzustellen.

Mich würde einfach interessieren wie ihr das macht bzw. welches die beste Möglichkeit ist.
Ich habe mal folgende Möglichkeiten getestet.

1.
$result = $DBO->query("SELECT Artikel FROM  test WHERE TestID='0' ");
$sqlvalues = $result->fetch(PDO::FETCH_ASSOC);
if($sqlvalues){
//schon vorhanden, mache update..
}else{
//nichts gefunden, mache insert
}

2.
$result = $DBO->query("SELECT * FROM test WHERE testID = '{$row['ID']}'") ;
if ($result->fetchColumn() == 0) {
//schon vorhanden, mache update..
}else{
//nichts gefunden, mache insert
}

3. oder vielleicht zuerst ein Select count() voranstellen?
SELECT COUNT(id) AS anzahl FROM tabelle'...

4.
$result = $DBO->query("SELECT TestID FROM Test WHERE  ID = '10'") ;
$anzahl = $result->rowCount();

Bei der 4. Variante mit rowCount bin ich mir sehr unsicher.
Im Manual und anderen Quellen steht immer das rowCount bei einer Select Abfrage nicht funktioniert. Dies speziell auch bei MySQL.
Meine Versuche hatten aber immer das richtige Ergebnis gebracht.
Kann es sein das es mittlerweile doch funktioniert (PHP 5.2)

vielen Dank und viele Grüße
hawk

  1. ich möchte herausfinden ob in einer Tabelle schon ein Datensatz steht oder ob sie leer ist. Wenn leer dann Insert, wenn schon vorhanden dann Update.

    Bisher hatte ich in meinen Script meist mit "mysql_num_rows" gearbeitet.
    Ich möchte nun versuchen auf PDO umzustellen.

    Kenn ich nicht, ich kann aber auch kaum PHP, wobei das aber egal sein dürfte.
    Ich mach das mittlerweile so, erst ein UPDATE .... das liefert die Anzahl der betroffenen Zeilen, d.h. wenn diese Null sind, dann ein INSERT, damit sparst du dir eine Abfrage.

    Struppi.

    1. Hallo,

      <<Ich mach das mittlerweile so, erst ein UPDATE .... das liefert die Anzahl der betroffenen Zeilen, d.h. wenn diese Null sind, dann ein INSERT, damit sparst du dir eine Abfrage.>>

      ok das wäre eine Möglichkeit.
      Was aber wenn es um kein Insert oder Update geht?
      Also nur prüfen ob etwas in Tabelle steht,
      wenn ja, event,. weiterer Select aus andere Tabelle oder andere Aktion?

      Welche  meiner genannten Vorschläge sind ok?

      Und: Wie ist das mit dem rowCount()?
      Zuverlässig oder eher nicht?

      vielen Dank und viele Grüße
      hawk

  2. Moin Moin!

    ich möchte herausfinden ob in einer Tabelle schon ein Datensatz steht oder ob sie leer ist. Wenn leer dann Insert, wenn schon vorhanden dann Update.

    Naiver Ansatz, wenn update und insert gleich wahrscheinlich sind:

    1. Starte Transaktion
    2. "select count(*) from tabelle where ..."
    (So muß die DB nicht die gesamte Tabelle absammeln und als Result Set vorbereiten, nur um die Anzahl der Zeilen zu ermitteln.)
    3. Wenn 0 insert, sonst update
    4. Beende Transaktion

    Falls update wahrscheinlicher ist:

    1. Starte Transaktion
    2. update
    3. insert, falls update keine Zeile aktualisiert hat
    4. Beende Transaktion

    Falls insert wahrscheinlicher ist:

    1. Starte Transaktion
    2. insert
    3. update, falls insert fehlschlug
    4. Beende Transaktion

    Die Transaktion sollte vor Race Conditions schützen, falls zwischen den beiden Schritten sich ein anderer Prozess an der gleichen Tabelle und am gleichen Datensatz zu schaffen macht.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".