Magento 1 SQL-запити


10

Я зараз налагоджую деяку функціональність звітності для своєї компанії, я збираю дані від подібних Google, Moz та нашого кур'єра. У рамках звітності я також хочу отримати дані від Magento. Так як це буде розміщено у дуже захищеній папці на нашому сервері. Що я хотів би знати, що це найбезпечніший спосіб для запуску запитів на Magento Data?

Я міг бігати

  • Прямі запити SQL за межами Magento

  • SQL запити всередині Magento, але тоді виникнуть проблеми з автоматичним виведенням їх з Magento

  • API Magento

Що мені найкраще робити з точки зору безпеки та ефективності для мого веб-сайту?

Відповіді:


18

Так, ви можете запускати прямі запити sql в Magento, найкращий спосіб зробити це - використовувати ресурс читання запису. Ви можете наситити це:

    $ resource = Mage :: getSingleton ('ядро / ресурс');

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

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

Для запуску вибору ви можете зробити щось подібне:

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

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

    $ results = $ readConnection-> fetchAll ($ запит);

    / * отримати результати * /
    var_dump ($ результати);

Щоб щось написати в базу даних, використовуйте:

    $ resource = Mage :: getSingleton ('ядро / ресурс');

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

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

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

    $ writeConnection-> query ($ query);

Сподіваюся, це допоможе вам.


Дякую @Kay, ти знаєш, які наслідки буде для мене, коли я запитаю на ДБ за межами Magento?
Буде Райт

Не так вже й багато, це просто не найкраща практика. і ви можете ризикувати невідповідностями, але зазвичай це не виникає проблем. але тепер ви тримаєте все це за один робочий процес
Kay Int Veen

Де знайти усі ці запити?
partho

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

2
Приємно. Навчив мене логіці запитів бази даних у Magento.
Анс

1
Нічого собі, хотілося б, щоб я знав, що це можливо, коли я почав працювати над Magento років тому. Чудове пояснення!
Eric Seastrand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.