Magento 1 SQL-Abfragen

10

Ich bin gerade dabei, einige Berichtsfunktionen für mein Unternehmen einzurichten. Ich sammle Daten von Google, Moz und unserem Kurier. Im Rahmen der Berichterstattung möchte ich auch Daten von Magento erhalten. Da dies in einem sehr sicheren Ordner auf unserem Server gehostet wird. Ich möchte wissen, wie ich am sichersten Abfragen zu den Magento-Daten ausführen kann.

Ich könnte rennen

  • Direkte SQL-Abfragen außerhalb von Magento

  • SQL-Abfragen in Magento haben dann aber Probleme, sie automatisch aus Magento zu entfernen

  • Magento API

Was mache ich unter Sicherheits- und Leistungsgesichtspunkten für meine Website am besten?

Will Wright
quelle

Antworten:

18

Ja, Sie können direkte SQL-Abfragen in Magento ausführen. Der beste Weg, dies zu tun, ist die Verwendung der Lese- / Schreibressource. Sie können es mit folgenden unersättlich machen:

    $ resource = Mage :: getSingleton ('Kern / Ressource');

    $ readConnection = $ resource-> getConnection ('core_read');

    $ writeConnection = $ resource-> getConnection ('core_write');

Um eine Auswahl auszuführen, können Sie Folgendes tun:

    $ readConnection = $ resource-> getConnection ('core_read');

    $ query = 'SELECT * FROM'. $ resource-> getTableName ('Katalog / Produkt');

    $ results = $ readConnection-> fetchAll ($ query);

    / * erhalte die Ergebnisse * /
    var_dump ($ results);

Um etwas in die Datenbank zu schreiben, verwenden Sie:

    $ resource = Mage :: getSingleton ('Kern / Ressource');

    $ writeConnection = $ resource-> getConnection ('core_write');

    $ table = $ resource-> getTableName ('Katalog / Produkt');

    $ query = "UPDATE {$ table} SET {item} = '{value}' WHERE entity_id = 'value'";

    $ writeConnection-> query ($ query);

Hoffe das hilft dir weiter.

Kay Int Veen
quelle
Danke @Kay, weißt du, was die Konsequenzen wären, wenn ich die Datenbank außerhalb von Magento abfragen würde?
Will Wright
Nicht so viel, es ist einfach keine bewährte Methode. und Sie können Inkonsistenzen riskieren, aber normalerweise kein Problem. Aber jetzt halten Sie alles in einem Workflow fest
Kay Int Veen
Wo finde ich all diese Fragen?
Partho
1
Beachten Sie bitte, dass das Schreiben in die Datenbank auf diese Weise eine SQL-Injection-Sicherheitsanfälligkeit verursacht . Tun Sie dies nur, wenn Sie sicher sind , dass Ihre Werte sicher sind.
bassplayer7
17

Es gibt eine bessere Möglichkeit, dies zu tun, um SQL-Injektionen zu vermeiden.

$resource = Mage::getSingleton('core/resource');
$write = $resource->getConnection('core_write');
$table = $resource->getTableName('your/model');

Sie können erstellen:

$write->insert(
    $table, 
    ['column_1' => 1, 'column_2' => 2]
);

Lesen:

$select = $write->select()
    ->from(['tbl' => $table], ['entity_id', 'company'])
    ->join(['tbl2' => $table2], 'tbl.entity_id = tbl2.product_id', ['stuff'])
    ->where('name LIKE ?', "%{$name}%")
    ->group('company');
$results = $write->fetchAll($select);

Aktualisieren:

$write->update(
    $table,
    ['column_1' => 3, 'column_2' => 4],
    ['entity_id = ?' => 123]
);

Löschen:

$write->delete(
    $table,
    ['entity_id IN (?)' => [123, 456]]
);

Mehrere einfügen:

$rows = [
    ['col_1'=>'value1', 'col_2'=>'value2', 'col_3'=>'value3'],
    ['col_1'=>'value3', 'col_2'=>'value4', 'col_3'=>'value5'],
];
$write->insertMultiple($table, $rows);

Update beim Duplizieren einfügen:

$data = [];
$data[] = [
    'sku' => $sku,
    'name' => $name
];
$write->insertOnDuplicate(
    $table,
    $data, // Could also be an array of rows like insertMultiple
    ['name'] // this is the fields that will be updated in case of duplication
);
Shadowbob
quelle
2
Nett. Hat mir die Datenbankabfragelogik in Magento beigebracht.
Anse
1
Wow, ich wünschte, ich wüsste, dass dies möglich ist, als ich vor Jahren anfing, an Magento zu arbeiten. Tolle Erklärung!
Eric Seastrand