Как получить время, которое пользователь тратит на весь путь от начала сеанса до конца сеанса в AppInsights

Я понимаю, что прошло какое-то время, поскольку в этом вопросе была новая деятельность. Но, как комментировали другие плакаты, get_result() теперь доступен только на PHP, установив собственный драйвер MySQL (mysqlnd), и в некоторых случаях может оказаться невозможным или желательным установить mysqlnd. Итак, я подумал, что было бы полезно опубликовать этот ответ с информацией о том, как получить функциональность, предлагаемую get_result(), - без использования get_result().

get_result() / часто сочетается с fetch_array() прокручивать результирующий набор и сохранять значения из каждой строки результирующего набора в числовом индексированном или ассоциативном массиве. Например, приведенный ниже код использует get_result () с fetch_array () для циклического преобразования в результирующий набор, сохраняя значения из каждой строки в числовом индексированном массиве $ data []:

$c=1000;
$sql="select account_id, username from accounts where account_idprepare($sql);                 
$stmt->bind_param('i', $c);                                             
$stmt->execute();
$result = $stmt->get_result();       
while($data = $result->fetch_array(MYSQLI_NUM)) {
   print $data[0] . ', ' . $data[1] . "
\n"; }

Однако, если get_result() недоступен (поскольку mysqlnd не установлен), это приводит к проблеме сохранения значений из каждой строки результирующего набора в массиве без использования get_result(). Или, как переносить устаревший код, который использует get_result() для запуска без него (например, используя bind_result() вместо этого), - как можно меньше воздействовать на остальную часть кода.

Оказывается, что сохранение значения из каждой строки в массиве с числовой индексацией не так прямолинейны, используя bind_result(). bind_result() ожидает список скалярных переменных (а не массив). Таким образом, требуется некоторое выполнение, чтобы сохранить значения из каждой строки результирующего набора в массиве.

Конечно, код можно легко изменить следующим образом:

$c=1000;
$sql="select account_id, username from accounts where account_idprepare($sql);                 
$stmt->bind_param('i', $c);                                             
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
   print $data[0] . ', ' . $data[1] . "
\n"; }

Но для этого требуется, чтобы явным образом перечислял $ data [0], $ data [1] и т. д. индивидуально в вызове bind_result(), что не является идеальным. Мы хотим, чтобы решение, которое не требует, чтобы явным образом перечислил $ data [0], $ data [1], ... $ data [N-1] (где N - количество полей в инструкции select) в вызове bind_results(). Если мы переносим устаревшее приложение с большим количеством запросов, и каждый запрос может содержать другое количество полей в предложении select, миграция будет очень трудоемкой и подверженной ошибкам, если мы используем такое решение, как

В идеале нам нужен фрагмент кода «замены замены», чтобы заменить только строку, содержащую функцию get_result(), и цикл while () на следующей строке. Код замены должен иметь ту же функцию, что и код, который он заменяет, не затрагивая ни одну из строк раньше или любую из строк после - включая строки внутри цикла while (). В идеале мы хотим, чтобы код замены был как можно более компактным, и мы не хотим, чтобы код замены был заменен на количество полей в предложении select запроса.

Поиск в Интернете я нашел ряд решений, которые используют bind_param() с call_user_func_array() (например, Динамически связывают параметры mysqli_stmt, а затем связывают результат (PHP) ), но большинство решений, которые я нашел в конечном итоге приводят к сохранению результатов в ассоциативном массиве, а не в численном индексировании массива, и многие из этих решений были не такими компактными, как я хотел бы и / или не были бы пригодны в качестве «замены для замены». Однако из приведенных мною примеров я смог собрать это решение, которое соответствует счету:

$c=1000;
$sql="select account_id, username from accounts where account_idprepare($sql);                 
$stmt->bind_param('i', $c);                                             
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) { 
    $var = $i;
    $$var = null; 
    $data[$var] = &$$var; 
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
   print $data[0] . ', ' . $data[1] . "
\n"; }

Конечно, цикл for () может быть свернут в одну строку, чтобы сделать это более компактный.

Надеюсь, это поможет любому, кто ищет решение, используя bind_result() для хранения значений из каждой строки в массиве с числовой индексацией и / или ищет способ переноса устаревшего кода с помощью get_result() , Комментарии приветствуются.

0
задан Ignacio Soler Garcia 18 January 2019 в 07:17
поделиться

1 ответ

То, что вы ищете, это корреляция. Вы можете найти описание встроенных функций здесь . Вы также можете выдать свой собственный Id корреляции (новый Guid) и передать его с вашим кодом, чтобы он был на 100% явным и учитывал сценарии, когда пользователь может «отсутствовать» в приложении в течение длительного периода (например, уходит из своего браузера). для кофе и возвращается через 30 минут, возможно, после перезапуска службы приложения по какой-то причине). Вам все еще нужно будет рассчитать время, которое потребовалось каждому этапу путешествия, а также использовать инструмент для пользовательского интерфейса, если вы хотите отслеживать активность / неактивность во взаимодействии с пользователем.

0
ответ дан Murray Foxcroft 18 January 2019 в 07:17
поделиться
Другие вопросы по тегам:

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