Consultas SQL do Magento 1

10

Estou no processo de configurar algumas funcionalidades de relatórios para minha empresa. Estou coletando dados de empresas como Google, Moz e Courier. Como parte do relatório, também quero obter dados do Magento. Como isso será hospedado em uma pasta muito segura em nosso servidor. O que eu gostaria de saber é qual é a maneira mais segura de executar consultas nos dados do Magento?

eu poderia correr

  • Consultas SQL diretas fora do Magento

  • Consultas SQL dentro do Magento, mas teria problemas para tirá-las do Magento automaticamente

  • API Magento

O que devo fazer do ponto de vista de segurança e desempenho do meu site?

Will Wright
fonte

Respostas:

18

Sim, você pode executar consultas sql diretas no Magento, a melhor maneira de fazer isso é usar o recurso de leitura e gravação. Você pode insatiá-lo com:

    $ resource = Mage :: getSingleton ('núcleo / recurso');

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

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

Para executar uma seleção, você pode fazer algo assim:

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

    $ query = 'SELECT * FROM'. $ resource-> getTableName ('catálogo / produto');

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

    / * obtenha os resultados * /
    var_dump ($ resultados);

Para escrever algo no banco de dados, use:

    $ resource = Mage :: getSingleton ('núcleo / recurso');

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

    $ table = $ resource-> getTableName ('catálogo / produto');

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

    $ writeConnection-> query ($ query);

Espero que isso ajude você.

Kay Int Veen
fonte
Obrigado @Kay, você sabe quais seriam as consequências de eu consultar o db fora do Magento?
Will Wright
Não muito, apenas não é uma prática recomendada. e você pode arriscar inconsistências, mas normalmente não há problema. mas agora você manter tudo apertado em um fluxo de trabalho
Kay Int Veen
Onde encontrar todas essas consultas?
partho 27/06
3
Lembre-se de que a gravação no banco de dados dessa maneira introduz uma vulnerabilidade de injeção SQL . Faça isso apenas se tiver certeza de que seus valores são seguros.
bassplayer7
18

Existe uma maneira mais adequada de fazer isso para evitar injeções de SQL.

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

Você pode criar:

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

Ler:

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

Atualizar:

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

Excluir:

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

Inserir vários:

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

Inserir atualização ao duplicar:

$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
fonte
2
Agradável. Ensinou-me a lógica de consulta de banco de dados no Magento.
Anse
11
Uau, eu gostaria de saber que isso era possível quando comecei a trabalhar no Magento anos atrás. Ótima explicação!
Eric Seastrand 12/07/19