PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   PDO-Rätsel (http://www.selfphp.de/forum/showthread.php?t=24661)

adrianzeitblom 15.05.2012 22:38:36

PDO-Rätsel
 
Hallo,

mag mir (PHP-Newbie) vielleicht jemand helfen, folgende Situation zu verstehen?
Der folgende Code tut nicht, was er soll.
Ich möchte gern, dass Dateinamen aus einem Verzeichnis (Beispiele für [um die Dateiendung bereits gekürzte] Namen: "000001", "000002" etc.) in die Spalte einer MySQL-Tabelle eingetragen werden, jedoch nur, sofern die Namen dort noch nicht vorhanden sind. Die Werte werden der Funktion als Array übergeben. Der folgende Code trägt zwar die Werte ein, jedoch auch dann, wenn sie bereits vorhanden sind.
Falls ihr euch fragt, warum ich die Datenbankverbindung öffne, schließe, um sie dann erneut zu öffnen usw.: Meine zweite Frage wäre, weshalb das notwendig ist. Ich hatte es zunächst probiert, indem ich die PDO-Verbindung am Funktionsbeginn geöffnet und am Ende wieder geschlossen habe, das funktionierte aber nicht: Dann landeten gar keine Daten in der Datenbank.
Hier nun der Code:

Code:

function karteiMitDatenbankAbgleichen($karteiBereinigt) {

    foreach ($karteiBereinigt as $wert) {
        $db = new PDO("mysql:host=localhost;dbname=karteiapp", 'root', '');
        try {
            $countA = $db->exec("SELECT * FROM inhalte WHERE dateiname='$wert'");
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
        $db = null;

        if ($countA == 0) {
            try {
                $db = new PDO("mysql:host=localhost;dbname=karteiapp", 'root', '');
                $countB = $db->exec("INSERT INTO inhalte (dateiname) VALUES ('$wert')");
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
            $db = null;
        }else{
            echo $e->getMessage();
        }
    }
}

Ich befürchte, etwas Grundsätzliches an der Funktionsweise von PDO nicht verstanden zu haben, und es wäre mir eine große Hilfe, wenn mir jemand auf die Sprünge helfen würde... Herzlichen Dank im Voraus!

urvater 16.05.2012 00:20:56

AW: PDO-Rätsel
 
Zitat:

PDO::exec() gibt die Anzahl von Zeilen zurück, welche durch diese Abfrage geändert oder gelöscht wurden. Wenn keine Zeilen geändert wurden, gibt PDO::exec() 0 zurück.
Aus diesem Grund ist $countA IMMER 0, da ja keine Daten geändert bzw. gelöscht wurden.

Verwende
Zitat:

PDO::query() returns a PDOStatement object, or FALSE on failure.
Allerdings hier nicht mehr auf 0 vergleichen.

adrianzeitblom 16.05.2012 00:33:46

AW: PDO-Rätsel
 
Nun funktioniert alles.
Besten Dank für die rasche Antwort!

urvater 16.05.2012 00:57:25

AW: PDO-Rätsel
 
Zitat:

Zitat von adrianzeitblom (Beitrag 143353)
Nun funktioniert alles.
Besten Dank für die rasche Antwort!

Klare Problembeschreibung, den richtigen Code gepostet und zum Schluss noch ein einfaches Problem. Da hilft man doch immer gern und schnell. :D

adrianzeitblom 16.05.2012 01:05:48

AW: PDO-Rätsel
 
Im Folgenden der abgewandelte, funktionierende Code – vielleicht hat ja jemand mal ähnliche Probleme:

Code:

function karteiMitDatenbankAbgleichen($karteiBereinigt) {

    foreach ($karteiBereinigt as $wert) {
        $db = new PDO("mysql:host=localhost;dbname=karteiapp", 'root', '');
        try {
            $countA = $db->query("SELECT * FROM inhalte WHERE dateiname='$wert'")->fetchAll();
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
        $db = null;

        if (!$countA) {
            try {
                $db = new PDO("mysql:host=localhost;dbname=karteiapp", 'root', '');
                $countB = $db->query("INSERT INTO inhalte (dateiname) VALUES ('$wert')");
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
            $db = null;
        }else{
            echo 'Wert schon vorhanden!';
        }
    }
}


Ckaos 16.05.2012 11:31:00

AW: PDO-Rätsel
 
Hi

Zitat:

Der folgende Code trägt zwar die Werte ein, jedoch auch dann, wenn sie bereits vorhanden sind.
vielleicht solltest du einen Index auf "dateiname" setzen und
dann REPLACE benutzen dann sparst du dir den ganzen Prüfkram.

Bsp. *ungetestet*
PHP-Code:

function karteiMitDatenbankAbgleichen($karteiBereinigt) {

            try {
                
$db = new PDO("mysql:host=localhost;dbname=karteiapp"'root''');
                
$countB $db->query("REPLACE INTO inhalte (dateiname) VALUES ('".implode("'),('",$karteiBereinigt)."')");
            } catch (
PDOException $e) {
                echo 
$e->getMessage();
            }
            
$db null;
    }


Vorausgesetzt du hast den Index gesetzt! übernimmt so MySql den rest.

mfg

CKaos

adrianzeitblom 16.05.2012 20:46:30

AW: PDO-Rätsel
 
@CKaos:
Danke Dir, bin schwer beeindruckt: elegante Lösung!
Die MySQL-Erweiterung zum SQL-Standard REPLACE war mir nicht bekannt.
Funktioniert tadellos.


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:37:29 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.