Magento 1 SQL-запросы

10

Я нахожусь в процессе настройки некоторых функций отчетности для моей компании, я собираю данные от таких как Google, Moz и нашего Курьера. В рамках репортажа я также хочу получить данные от Magento. Поскольку это будет размещено в очень безопасной папке на нашем сервере. Что я хотел бы знать, так это какой самый безопасный способ для меня выполнять запросы к данным Magento?

Я мог бежать

  • Прямые SQL-запросы вне Magento

  • SQL-запросы внутри Magento, но тогда возникнут проблемы с их автоматическим удалением из Magento.

  • Magento API

Что я лучше всего делаю с точки зрения безопасности и производительности для моего сайта?

Уилл Райт
источник

Ответы:

18

Да, вы можете выполнять прямые sql-запросы в Magento, лучший способ сделать это - использовать ресурс read write. Вы можете сделать это с помощью:

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

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

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

Для запуска выбора вы можете сделать что-то вроде этого:

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

    $ query = 'SELECT * FROM'. $ Ресурсо-> getTableName ( 'каталог / продукт');

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

    / * получить результаты * /
    var_dump ($ результатов);

Для записи чего-либо в базу данных используйте:

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

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

    $ table = $ resource-> getTableName ('каталог / продукт');

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

    $ WriteConnection-> запрос ($ запроса);

Надеюсь, это поможет вам.

Kay Int Veen
источник
Спасибо @ Кей, ты знаешь, каковы будут последствия моего запроса к БД за пределами Magento?
Уилл Райт
Не так уж много, это просто не лучшая практика. и вы можете рискнуть несоответствиями, но обычно это не проблема. но теперь вы держите все это в одном рабочем процессе
Kay Int Veen
Где найти все эти запросы?
Парто
3
Пожалуйста, имейте в виду, что запись в базу данных таким способом вводит уязвимость SQL-инъекции . Делайте это только в том случае, если вы уверены, что ваши ценности в безопасности.
bassplayer7
18

Есть более правильный способ сделать это, чтобы избежать SQL-инъекций.

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

Вы можете создать:

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

Читать:

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

Обновить:

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

Удалять:

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

Вставить несколько:

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

Вставить обновление на дубликат:

$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
источник
2
Ницца. Научил меня логике запросов к базе данных в Magento.
Анс
1
Ого, я бы хотел знать, что это возможно, когда я начал работать над Magento много лет назад. Отличное объяснение!
Эрик Сеастранд