Функция implode php

102
29 декабря 2020, 22:00

Есть код:

$query = $mysqli->query("SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price`, SUM(`amount`) as amount , `total`, `dttm_create_order`, `dttm_close_order`, `status` FROM (SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price` , `amount` as amount , `total` , `dttm_create_order`, `dttm_close_order`, `status` FROM `bitorders` UNION SELECT `contest_id`, `type_operation`, `name_val`, `name_prod`, `price`, `amount` as amount , `total`, `dttm_create_order`, `dttm_close_order`, `status` FROM `orders` ) as tableobsh WHERE `name_prod`= 'aaa' AND status = 0 GROUP BY price , type_operation ORDER BY price " );
    while ($row = $query->fetch_assoc()) {
        //$orderbook['order_id'][]      = $row['order_id'];
        $orderbook['price'][]      = $row['price']/100000000;
        //$orderbook['user_id'][]      = $row['user_id'];
        $orderbook['contest_id'][]      = $row['contest_id'];
        $orderbook['type_operation'][]   = $row['type_operation'];
        $orderbook['name_val'][]  = $row['name_val'];
        $orderbook['name_prod'][]   = $row['name_prod'];
        $orderbook['amount'][]    = $row['amount']/100000000;
        $orderbook['total'][]     = $row['total']/100000000;
        $orderbook['dttm_create_order'][]    = $row['dttm_create_order'];
        $orderbook['dttm_close_order'][]      = $row['dttm_close_order'];
        $orderbook['status'][]      = $row['status'];
    }
    $out = array(
        'orderbook' => $orderbook
    );

Будет ли идентичен данный код, если я запрос $query изменю, поменяв

WHERE `name_prod`= 'aaa'

на

$coins = array('aaa', 'bbb', 'ccc');
WHERE `name_prod` IN (" . implode(',', $coins) . ")

Т.е мне нужно весь код применить для массива name_prod

Answer 1

И да и нет. Если вопрос об SQL и операторе IN, то верно - заменяйте. Если вопрос о php то имейте в виду, что implode объединит значения вашего массива в строку "aaa,bbb,ccc", что в итоге приведёт в запросу вида:

select
  ...
from ...
where name_prod in (aaa,bbb,ccc)

На такой запрос вы получите сообщение об ошибке: неизвестный столбец 'aaa' в 'where clause', - так как aaa,bbb,ccc уже не будет строками с данном запросе.

Чтоб устранить ошибку вам необходимо будет либо изначально формировать массив с кавычками:

$coins = array("'aaa'", "'bbb'", "'ccc'");

Либо сделать это на этапе формирования запроса:

$coins = ["aaa", "bbb", "ccc"];
// some code
$name_prod = implode(", ",
    array_map(
        function($value) {
            return "'$value'";
        },
        $coins
    )
);
$query = ".. where name_prod in ($name_prod) and ...";

Кроме того, обратите внимание на то, что, итерируясь по результатам запроса, вы выполняете действия, которые можно было бы выполнить на этапе выполнения запроса к БД, например деление на 100000000 можно выполнять прямо в запросе:

select
    contest_id,
    type_operation,
    name_val,
    name_prod,
    price / 100000000 as price,
    SUM(amount) / 100000000 as amount,
    total / 100000000 as total,
    dttm_create_order,
    dttm_close_order,
    status
from some_table
Answer 2

Смело меняйте, это распространённая практика особенно когда в IN используется 1000 параметров. Это однозначно будет быстрее нежели запрос с 1000 “AND” или 1000 запросов. Но главное не переуспрдствовать. Если планируются частые выборки по строковому полю подумайте, возможно стоит использовать индекс для этого поля. Так же, если данные для этого массива получаете от пользователя, то лучше использовать PDO где все переменные будут вынесены в параметры, это поможет избежать SQL инъекции.

READ ALSO
Сетеры и гетеры для Jackson де\сериализации

Сетеры и гетеры для Jackson де\сериализации

Для десериализации и сериализации использую библиотеку JacksonИногда на практике встречаюсь с требованием прописать сеттеры для класса сущности,...

121
Сервер томкат не хочет обрабатывать jsp

Сервер томкат не хочет обрабатывать jsp

There's a problem: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') (line 1, column 2)

100
Не могу найти минимальный элемент в коллекции

Не могу найти минимальный элемент в коллекции

Ребят, почему ошибка? Что ему не нравится?

141
Почему метод не возвращает true, false? [закрыт]

Почему метод не возвращает true, false? [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

104