Kategorien anlegen (PHP) führt zu Fehlern?!

Wie ihr hier unten sehen könnt, versuche ich hier Kategorien anzulegen.
Warum auch immer klappt das aber nicht.

Wenn ich mir das ganze ausgebe, bekomme ich bei den Unterkategorien keine Ausgabe. Der Titel ist immer “”.

Entferne ich das save() von $oCategory, bekomme ich die Namen der Unterkategorien angezeigt, allerdings wird nichts gespeichert.

Woran liegt das?! Überseh ich irgendwas essentielles?


foreach ($aResults as $firstLevelCat)
        {
            echo "now importing " . $firstLevelCat['title'] . "...
";
            $randHash = md5(time());

            $oCategory = oxnew('oxcategory');
            $oCategory->setId($randHash);
            $oCategory->oxcategories__oxtitle = new oxField($firstLevelCat['title']);
            $oCategory->oxcategories__oxparentid = new oxField('oxrootid');
            $oCategory->save();

            // time for the next generation, prepare those statements.
            $sSql2 = "SELECT `title` FROM `" . $this->categoryTable . "` WHERE pid = '" . $firstLevelCat['uid'] . "' AND deleted = '0' AND hidden ='0'";
            $aResults2 = $this->db->getAll($sSql2);


            // .. 2nd level categories
            foreach ($aResults2 as $secondLevelCat)
            {
                echo " |->" . $secondLevelCat['title'] . "
";
                $oCategory2 = oxnew('oxcategory');
                $oCategory2->oxcategories__oxtitle = new oxField($secondLevelCat['title']);
                $oCategory2->oxcategories__oxparentid = new oxField($randHash);
                // $oCategory2->save();
            }
        }

Kurz geschrieben was ich machen will:

Ich muss aus einem fremden Shop die Kategorien importieren. Diese sind aufgeteilt in Über- und Unterkategorie.

In der 1. foreach-Schleife will ich nun also die Hauptkategorie anlegen.
Ich setze fix eine ID mit md5(time()); // ich weiß, ginge auch mit setId() -> gleicher effekt, schon probiert.

Nachdem ich also den Titel und die oxparentid gesetzt habe, speichere ich das ganze.

Der 1. Durchlauf klappt auch, dann wirds seltsam.

In der nächsten foreach erstelle ich also wieder eine neue Kategorie. Ich setze eine ID, vergebe Titel und für die parentid nehme ich die OXID der Überkategorie. Speichern, ende.

Irgendwie stimmt da aber etwas nicht, denn nur die 1. Kategorie wird angelegt und die anderen haben keinen Namen und keine parentid. WTF?

wenn ich das save() entferne, wie gesagt, bekomme ich die namen… halp :frowning:

lol

okay. Habs gefunden. Ich weiß zwar nicht wieso, aber plötzlich wird aus meinem assoziativem Array plötzlich eins mit numerischem Index. Ich kanns euch nicht erklären…


public function __construct()
    {
        // initialize Database
        $this->db = oxDb::getDb(oxDb::FETCH_MODE_ASSOC);
        $this->run();
    }

In der 2. foreach ist es dann numerisch. Nehme ich die zuordnung wie oben beschrieben weg
($oCategory->oxcategories__oxparentid = new oxField(‘oxrootid’); + save() bleibt es assoziativ.

Oje, so etwas hatte ich auch schon mal, ist leider sehr schwierig einzugrenzen. Denkst du, dass da ein Bug dahinter steckt? Kann man das mit einem kleinen “Proof-of-Concept” zuverlässig reproduzieren?

[QUOTE=martin.wegele;161580]Oje, so etwas hatte ich auch schon mal, ist leider sehr schwierig einzugrenzen. Denkst du, dass da ein Bug dahinter steckt? Kann man das mit einem kleinen “Proof-of-Concept” zuverlässig reproduzieren?[/QUOTE]

Ich werde versuchen nachher ein kleinen Testcase aufzubereiten. Das klingt pauschal erstmal wie nen Bug für mich. Ich aktualisiere diesen Post hier heute Abend mal, sobald ich das ganze irgendwie vorbereitet habe.

So:

Das hier konnte ich vorbereiten http://pastebin.com/hSKx1CD4

Das 1. Array ist korrekt, dass 2. Array mMn nicht. (1. assoziativ, 2. numerisch)

// Update:
Wenn ich den fetch-mode neu setze, klappt es wieder, also unmittelbar vor dem 2. Query.

Komischerweise tritt das Verhalten auch nur IN der foreach auf. Wenn ich eine Testausgabe außerhalb mache, quasi 2x getAll() hintereinander, ist der fetch-mode noch korrekt.

Kann das jemand von euch ebenso reproduzieren?

Ich nehme an dass der Fetchmode in einer Methode, z.B. oxnew, geändert wird, oxdb ist ja ein Singleton.