Consultas SQL de Magento 1

10

Estoy en el proceso de configurar algunas funciones de informes para mi empresa, estoy recopilando datos de personas como Google, Moz y nuestro servicio de mensajería. Como parte de los informes, también quiero obtener datos de Magento. Como esto será alojado en una carpeta muy segura en nuestro servidor. Lo que me gustaría saber es cuál es la forma más segura de ejecutar consultas en los datos de Magento.

podría correr

  • Consultas directas de SQL fuera de Magento

  • Consultas SQL dentro de Magento pero luego tendrían problemas para sacarlas de Magento automáticamente

  • API de Magento

¿Qué estoy haciendo mejor desde un punto de vista de seguridad y rendimiento para mi sitio web?

Will Wright
fuente

Respuestas:

18

Sí, puede ejecutar consultas sql directas dentro de Magento, la mejor manera de hacerlo es usar el recurso de lectura y escritura. Puedes insaturarlo con:

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

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

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

Para ejecutar una selección, puede hacer algo como esto:

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

    $ query = 'SELECCIONAR * DESDE'. $ resource-> getTableName ('catálogo / producto');

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

    / * obtener los resultados * /
    var_dump ($ resultados);

Para escribir algo en la base de datos use:

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

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

    $ tabla = $ recurso-> getTableName ('catálogo / producto');

    $ query = "ACTUALIZACIÓN {$ table} SET {item} = '{value}' WHERE entity_id = 'value'";

    $ writeConnection-> query ($ consulta);

Espero que esto te ayude.

Kay Int Veen
fuente
Gracias @Kay, ¿sabes cuáles serían las consecuencias de que yo consultara la base de datos fuera de Magento?
Will Wright
No tanto, simplemente no es la mejor práctica. y puede arriesgarse a inconsistencias, pero normalmente no hay problema. pero ahora lo tienes todo apretado en un solo flujo de trabajo
Kay Int Veen
¿Dónde encontrar todas estas consultas?
partho
3
Tenga en cuenta que escribir en la base de datos de esta manera introduce una vulnerabilidad de inyección SQL . Solo haga esto si está seguro de que sus valores están seguros.
bassplayer7
18

Hay una forma más adecuada de hacer esto para evitar inyecciones SQL.

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

Puedes crear:

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

Leer:

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

Actualizar:

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

Eliminar:

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

Insertar Múltiple:

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

Insertar actualización en duplicado:

$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
fuente
2
Agradable. Me enseñó la lógica de consulta de la base de datos en Magento.
Anse
1
Wow, desearía saber que esto era posible cuando comencé a trabajar en Magento hace años. ¡Gran explicación!
Eric Seastrand