Requêtes SQL Magento 1

10

Je suis en train de mettre en place des fonctionnalités de reporting pour mon entreprise, je collecte des données auprès de Google, Moz et notre Courrier. Dans le cadre du reporting, je souhaite également obtenir des données de Magento. Comme cela sera hébergé dans un dossier très sécurisé sur notre serveur. Ce que je voudrais savoir, c'est quel est le moyen le plus sûr pour moi d'exécuter des requêtes sur les données Magento?

je pourrais courir

  • Requêtes SQL directes en dehors de Magento

  • Les requêtes SQL à l'intérieur de Magento mais auraient alors des problèmes pour les retirer automatiquement de Magento

  • API Magento

Que fais-je le mieux du point de vue de la sécurité et des performances pour mon site Web?

Will Wright
la source

Réponses:

18

Oui, vous pouvez exécuter des requêtes SQL directes dans Magento, la meilleure façon de le faire est d'utiliser la ressource de lecture / écriture. Vous pouvez l'insatier avec:

    $ resource = Mage :: getSingleton ('core / ressource');

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

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

Pour exécuter une sélection, vous pouvez faire quelque chose comme ceci:

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

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

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

    / * obtenez les résultats * /
    var_dump ($ results);

Pour écrire quelque chose dans la base de données, utilisez:

    $ resource = Mage :: getSingleton ('core / ressource');

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

    $ table = $ resource-> getTableName ('catalogue / produit');

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

    $ writeConnection-> query ($ query);

J'espère que cela vous aidera.

Kay Int Veen
la source
Merci @Kay, savez-vous quelles seraient les conséquences de ma requête sur la base de données en dehors de Magento?
Will Wright
Pas tant que ça, ce n'est tout simplement pas la meilleure pratique. et vous pouvez risquer des incohérences mais normalement aucun problème. mais maintenant vous gardez tout serré dans un flux de travail
Kay Int Veen
Où trouver toutes ces requêtes?
partho
3
Veuillez garder à l'esprit que l'écriture dans la base de données de cette manière introduit une vulnérabilité d'injection SQL . Ne faites cela que si vous êtes sûr que vos valeurs sont sûres.
bassplayer7
18

Il existe un moyen plus approprié de le faire pour éviter les injections SQL.

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

Vous pouvez créer:

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

Lis:

$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);

Mise à jour:

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

Supprimer:

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

Insérer plusieurs:

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

Insérer la mise à jour sur le doublon:

$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
la source
2
Agréable. J'ai appris la logique de requête de base de données dans Magento.
Anse
1
Wow, j'aurais aimé savoir que c'était possible quand j'ai commencé à travailler sur Magento il y a des années. Grande explication!
Eric Seastrand