Deutschland United States United Kingdom
ContentLion - Open Source CMS

QA Plugindata

Kannst du mir dafür nochmal ne Beschreibung per PM schicken und den Unterschied zu unseren Settings betonen? Die sind ja auch dafür da, um Einstellungen von Plugins zu speichern.

Hab noch nen coolen Tipp für dich, was das Plugin noch beschleunigt.

Schau dir mal ON DUPLICATE KEY an.
Dann sparst du dir das getData und brauchst auch kein UPDATE-Statement mehr zu machen.
http://dev.mysql.com/doc/refman/5.1/de/i…-duplicate.html

Kannst du die Funktionen noch statisch machen? Dann spart man sich den Current() aufruf. Macht bei dem Plugin ja aktuell eh keinen Sinn, zwei Instanzen zu haben.
Setzt $data dann oben auf null statt array() und prüfst bei getData, mit isset, ob das schon vorhanden ist. Wenn nicht, lädst du die Daten nach. Beim set fügst du das Element dann nur ein, wenn die Daten geladen werden, andernfalls werden ja später eh die aktuellen werte rausgeholt. So würdest du beim Speichern die Daten gar nicht auslesen müssen.

Vielleicht könntest du ja noch unseren Cache benutzen, ähnlich wie bei den Settings, so spart man sich die Select-Queries, kannst dich ja auch mal an das Memcached-Plugin wagen (und als optionale Abhängigkeit nutzen): http://www.contentlion.de/plugins/memcached.html

EDIT: Warum kann man eigentlich bei setData einen areaType angeben, bei getData aber nicht? Und wo wird das last_update wieder ausgelesen?

@Duplicate Key:
Ist nen bissel kompliziert, schaus mir morgen mal genauer an. ;)

@Statische Funtionen:
Ja, sehr gute Idee! ;)

@Memcached:
Hmmm...
Wie mache ich dass dann so kompatibel, dass auch der normale Cache gehen würde?

kannst einfach mit class_exists prüfen, ob die Memcached-Klasse da ist, wenn nicht, nimmst den normalen. Aufbau ist sowieso der gleiche.

Ok. :)

Kannst du zu dem DUPLICATE mal nen Bsp.-Code posten?
Ich versteh nämlich nicht, wie das hier einzusetzen ist. :D

INSERT INTO tabelle
SET spalte1 = 1,
splate2 = 2
ON DUPLICATE KEY UPDATE spalte2 = 3

Wenn Spalte1 der Primary Key ist und dieser schon vergeben ist, wird spalte2 auf 3 gesetzt, andernfalls auf 2. Kannst im Update natürlich auch mehrere Sachen schreiben (Kommagetrennt)

Nur versteh ich nicht, wie dass das Ganze bei setData() beschleunigen soll... :S

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public function setData ($property$value$area "global"$areaType "core"$last_update null) {
        $property_escape DataBase::Current()->EscapeString($property);
        $value_escape DataBase::Current()->EscapeString($value);
        $area_escape DataBase::Current()->EscapeString($area);
        $areaType_escape DataBase::Current()->EscapeString($areaType);
        if(is_null($last_update)){
            $last_update "NOW()";
        } else{
            $last_update "'".DataBase::Current()->EscapeString($area)."'";
        }
         
        if ($this->getData($property$area) == null) {
            DataBase::Current()->Execute("INSERT INTO `{'dbprefix'}plugin_plugindata_data` (
            `property`, `value`, `last_update`, `area`, `areaType`
            ) VALUES (
             '" $property_escape "', '" $value_escape "', " $last_update ", '" $area_escape "', '" $areaType_escape "'
            ); ");
        } else {
            DataBase::Current()->Execute("UPDATE `{'dbprefix'}plugin_plugindata_data` SET `value` = '" $value_escape "', `last_update` = " $last_update " WHERE `property` = '" $property_escape "' AND `area` = '" $area_escape "'; ");
        }
        
        $this->data[$area][$property] = $value;
        
    }


Da lese ich doch vorher gar nicht aus, ob Einträge vorhanden sind... :huh:

getData brauchst dann nicht mehr aufrufen und sparst im Optimalfall das Select darin. Und du musst nicht beide Stellen updaten ;-)

Aber wie unterscheide ich dann, ob ein UPDATE oder ein INSERT-Query durchgeführt werden muss? :D
Ich kapiers irgendwie net so richtig. xD ^^

ON DUPLICATE KEY macht beides auf einmal,
du brauchst kein Update mehr^^ Ist der Datensatz da, wird er automatisch geupdatet.

Ich glaub, ich habe es jetzt verstanden. xD
So?:

PHP-Quelltext

1
2
3
4
5
DataBase::Current()->Execute("INSERT INTO `{'dbprefix'}plugin_plugindata_data` (
            `property`, `value`, `last_update`, `area`, `areaType`
            ) VALUES (
             '" $property_escape "', '" $value_escape "', " $last_update ", '" $area_escape "', '" $areaType_escape "'
            ) ON DUPLICATE KEY UPDATE `value` = '" $value_escape "', `last_update` = " $last_update "; ");

Supi, habs comitted, kannst's jetzt testen. :)

Top! Wenn du das Ganze jetzt noch statisch machst, wäre es ideal (siehe meinen Kommentar vom 01.05.2013, 13:04)

So, müsste jetzt statisch sein. ;)