Задать вопрос

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

Есть задача обмена информацией между десктопным приложением и БД.
Прямое подключение (запрос) к расшаренной БД не рассматривается (по многим моментам).
Запрос должен быть к сайту (скрипту).
Как можно оптимизировать этот код с запросом?

Сейчас "система" состоит из 2х файлов.
Файл 1 куда непосредственно отправляются POST запросы и откуда приходит ответ.
Файл 2 - файл с функциями.
Файл 2 (функции) включен в файл 1 (include).

Файл 1 куда непосредственно отправляются POST запросы
include_once (__DIR__.'/functions.php'); //Подключим функции

//Принимаем данные - имя функции и параметры - 100 штук
//Имя
if (array_key_exists('function', $_POST)) $function=$mysqli->real_escape_string($_POST['function']);
//Параметры
$parameters_number=0;
for($i=1; $i<=100; $i++)
{
$parameter='parameter_'.$i;
if (array_key_exists($parameter, $_POST)) {$parameters[$i]=$mysqli->real_escape_string($_POST[$parameter]); $parameters_number++;} else $parameters[$i]='';
}

//Вызов нужной функции
if ($function=='get_all_last_data')
{
echo crypto_functions\get_all_last_data($parameters[1],$parameters[2]); //Вызвали и вывели результат
exit(); //Стоп.
}


Файл 2 - файл с функциями
function get_all_last_data($limit, $request_identifier)
{
global $mysqli, $main_settings; //Подключение к БД
$response='ok'; //ответ по умолчанию, ну должны же мы что то ответить
//Запрос 1 - Получаем массив с тикерами Тикер - просто строка, то что потом будем искать в БД.
$mysqli->select_db($main_settings['base']['base_3']) or die ($mysqli->error); //Выбор нужной базы
$mysqli_request="SELECT `ticker` FROM `data_data` ORDER BY `id` DESC LIMIT 100 "; //100 последних значений из базы. Не подготавливаемый запрос т.к. вызываем 1 раз
$mysqli_result=$mysqli->query($mysqli_request) or die ($response='error '.$mysqli->error);
$mysqli->close; //Принудительно закрываем соединение (оптимизация)
$num_rows = $mysqli_result->num_rows;
for ($i=1;$i<=$num_rows; $i++)
{
$row = $mysqli_result->fetch_assoc();
$ticker=$row['ticker'];
$stock_cryptocurrency_array[$i]=$ticker;
}
//Получили массив с тикерами. Фильтруем т.к. нам нужны уникальные тикеры.
$stock_cryptocurrency_array = array_unique($stock_cryptocurrency_array);

//Получаем основные данные, которые и отправим назад в ответе
$data='{'; //Начало json строки Как тут получить строку нужного вида с помощью json_encode - непонятно...
foreach ($stock_cryptocurrency_array as $array_name => $array_value)
{
$ticker=$array_value; //Тикер в переменную для удобства
$data=$data.'"'.$ticker.'":{'; //И снова дополняем нашу  json строку
//Подготавливаемый запрос т.к. тикеров много и запросов будет много
$stmt = $mysqli->prepare("SELECT * FROM `data_data` WHERE `ticker`=? ORDER BY `id` DESC LIMIT ?");
$stmt->bind_param('ss',$ticker,$limit);
$stmt->execute();
$mysqli_result = $stmt->get_result();
$num_rows = $mysqli_result->num_rows;
for ($i=1;$i<=$num_rows; $i++)
{
$row = $mysqli_result->fetch_assoc();
$value=$row['value'];
$time=$row['time'];
$date=$row['date'];
$data=$data.'"'.$i.'":{"value":"'.$value.'", "time":"'.$time.'", "date":"'.$date.'"},'; //Всё получили и в строку
}
$data=substr($data,0,-1);//убираем последнюю запятую
$data=$data.'},';
}
$data=$data.'"request_identifier":"'.$request_identifier.'"'; //Дополняем нашу json строку ещё одним значением
$data=$data.'}'; //Завершаем нашу json строку
$response=$data;
$mysqli_result->free_result; //Принудительно освобождаем память результата (оптимизация)
return $response; //Возвращаем ответ
}
  • Вопрос задан
  • 113 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
1) prepare и bind_param не нужно делать в цикле, можно один раз до цикла;
2) скорее всего, можно вообще не делать запрос в цикле, а получить все данные одним запросом. Нужно смотреть на структуру таблицы и данных в ней;
3) не понимаю, зачем закрывать подключение к БД, если вы его сразу используете дальше по коду. Кроме этого, вы неправильно его закрываете, close это метод, поэтому нужны скобки: ->close();
4) нет необходимости экранировать входящие параметры, если вы используете подготовленные запросы (prepared statement);
5) всё-таки лучше использовать json_encode а не собирать json вручную;

P.S. пожалуйста, используйте отступы (табуляцию) в коде, его будет намного удобнее читать и вам и тем, кто отвечает на вопрос.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы