Как оптимизировать sql запрос

134
27 декабря 2020, 16:40

Есть код, его суть - периодическое создание ордеров на продажу и покупку

for ($i = 0; $i < $num; $i++) {
    $req = $mysqli->query("SELECT * FROM `coinInfo` WHERE coinName = 'BTC'");
    while($row = $req->fetch_assoc()) {
        $ask = $row["ask"]/100000000;
        $bid = $row["bid"]/100000000;
    }
    $operation = array("BUY", "SELL");
    $rand_keys = array_rand($operation);
    $int = mt_rand(1,4)/10000;
    $fractional = mt_rand(1,99) / 10000;
    $float = $int + $fractional;
    $price          = rand_float($bid,$ask);
    $amount         = $float;
    $type_operation =  $operation[$rand_keys];
    $Responce=create_orders($mysqli,$sesion_id = 299,$contest_id = 1,$price,$amount,$name_val = 'USD',$name_prod = 'BTC',$type_operation);  
}

Мне нужно продублировать эту часть кода для ряда монет, т.е сейчас стоит BTC, для eth все будет тоже самое, кроме двух строчек

$req = $mysqli->query("SELECT * FROM `coinInfo` WHERE coinName = 'ETH'");
$Responce=create_orders($mysqli,$sesion_id = 299,$contest_id = 1,$price,$amount,$name_val = 'USD',$name_prod = 'ETH',$type_operation);  
    }

Можно как-то сократить количество копируемого кода?

Попробовал сделать так:

function createOrders($coinName){
    function rand_float($st_num=0,$end_num=1,$mul=1000000)
{
    if ($st_num>$end_num) return false;
    return mt_rand($st_num*$mul,$end_num*$mul)/$mul;
}
$num= rand(2,4);
for ($i = 0; $i < $num; $i++) {
    $req = $mysqli->query("SELECT * FROM `coinInfo` WHERE coinName = $coinName");
    while($row = $req->fetch_assoc()) {
        $ask = $row["ask"]/100000000;
        $bid = $row["bid"]/100000000;
    }
    $operation = array("BUY", "SELL");
    $rand_keys = array_rand($operation);
    $int = mt_rand(1,4)/10000;
    $fractional = mt_rand(1,99) / 10000;
    $float = $int + $fractional;
    $price          = rand_float($bid,$ask);
    $amount         = $float;
    $type_operation =  $operation[$rand_keys];
    $Responce=create_orders($mysqli,$sesion_id = 299,$contest_id = 1,$price,$amount,$name_val = 'USD',$name_prod=$coinName,$type_operation);  
}
}

$coins = array('BTC', 'ETH');
array_walk($coins, createOrders);

Но получаю ошибку в error log:

Stack trace:
#0 [internal function]: createOrders('BTC', 0)
#1 /home/gamiblxx/public_html/create_order_cron.php(112): array_walk(Array, 'createOrders')
#2 {main}
  thrown in /home/gamiblxx/public_html/create_order_cron.php on line 92
[21-May-2019 01:10:36 America/New_York] PHP Warning:  Use of undefined constant createOrders - assumed 'createOrders' (this will throw an Error in a future version of PHP) in /home/gamiblxx/public_html/create_order_cron.php on line 112
[21-May-2019 01:10:36 America/New_York] PHP Notice:  Undefined variable: mysqli in /home/gamiblxx/public_html/create_order_cron.php on line 92
[21-May-2019 01:10:36 America/New_York] PHP Fatal error:  Uncaught Error: Call to a member function query() on null in /home/gamiblxx/public_html/create_order_cron.php:92
Stack trace:
#0 [internal function]: createOrders('BTC', 0)
#1 /home/gamiblxx/public_html/create_order_cron.php(112): array_walk(Array, 'createOrders')
#2 {main}
  thrown in /home/gamiblxx/public_html/create_order_cron.php on line 92
Answer 1

Оформите ваш код в функцию, которая принимает в качестве аргумента название валюты function createOrders($coinName) и замените "BTC" на $coinName.

Функцию createOrders вызывайте для каждой нужной валюты:

$coins = array('BTC', 'ETH', 'YTN');
array_walk($coins, createOrders);
READ ALSO
Ошибка в подкачке данных у Composera

Ошибка в подкачке данных у Composera

Цель: подкачать данныеПри команде

137
&ldquo;Один&rdquo; объект без singleton

“Один” объект без singleton

Как можно по всему проекту использовать только 1 объект, не используя паттерн синглтон? Или это единственное решение?

117
Почему Observable не является интерфейсом?

Почему Observable не является интерфейсом?

Почему в java Observable является именно классом, а не интерфейсом?

104
Выделение графика на изображении

Выделение графика на изображении

Какие есть способы обработки изображения для выделения графика? То есть из изображения с графиком нужно отделить график от сетки и фона

141