Prüfen ob Datensatz vorhanden, rowCount doch ok bei Select ??
hawkmaster
- datenbank
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
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.
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
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