Как мне l oop через этот массив mysql, не замораживая сайт - PullRequest
2 голосов
/ 10 марта 2020

Для моего текущего проекта я заполняю массив, используя sql запрос

"SELECT names FROM students";

и выбрасывая каждый ответ в массив с именем $ names_array.

Затем я использую

foreach($names_array as $value) {
    echo "<option>".$value."</option>";
}

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

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

Итак, предположим, что в таблице базы данных на каждого учащегося также указаны их возраст, рождение и номер опекуна. & guardians email.

Как проверить, существует ли уже набранный студент, и если они есть, получить их дополнительные данные из таблицы?

Если я смогу каким-то образом получить введенное имя в PHP Я мог бы просто просмотреть таблицу, которая была бы намного быстрее, но я попытался сделать это, и я не могу это сделать.

Я использовал очень неэффективный метод, где я json_enc ode массив, полученный из запроса sql

"SELECT * FROM students";

, а затем используйте

echo "<script>var names = ".$names_json."</script>";

, чтобы иметь возможность получить его в js. Теперь, проанализировав и обойдя его, я могу найти свои необходимые данные, но, учитывая, что таблица базы данных уже имеет 6000 опций и продолжает увеличиваться, она начинает требовать времени до l oop, особенно если имя, которое я ищу находится в конце массива. Теперь это может занять от 1 до 15 секунд, когда веб-сайт полностью заморожен и выглядит так, как будто он завис до тех пор, пока не будет завершен и не сделает то, что мне нужно сделать с данными.

Я пытался использовать предлагаемое решение здесь но это, похоже, ничего не меняет.

Пожалуйста, кто-нибудь знает лучший способ сделать то, что я, по сути, уже делаю, без временной блокировки сайта? Или, может быть, совершенно другой способ получения других частей данных? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Сначала на стороне сервера - нумерация страниц / лимит, не «выбирать все»

SELECT names FROM students WHERE names LIKE ? ORDER BY names LIMIT 20;

Второй на стороне клиента - отложенная загрузка через ajax, но сначала после, например, пользовательского ввода 3 символы имени.

1 голос
/ 10 марта 2020

для предотвращения загрузки скрипта, чтобы заморозить загрузку веб-сайта, вы можете добавить атрибут defer, например:

echo "<script defer>...some long logic....</script>";

Для простого поиска по массиву вы можете отсортировать его по найденному значению, затем используйте двоичный поиск

Кроме того, вы можете сохранить его в литеральном объекте, где ключ - это имя, а значение - объект всех данных ученика. это потребует некоторого места в памяти, но сделает поиск супер быстрым

0 голосов
/ 23 марта 2020

Полагаю, мне следует ответить на этот вопрос, если кто-то в конечном итоге столкнется с той же проблемой.

Я слегка изменяю foreach l oop, добавляя идентификатор в качестве идентификатора данных к опциям

foreach($names_array as $value) {
    echo "<option data-id='".$value['names_id']"'>".$value['names_name']."</option>";
}

Через js (и jquery) вы можете получить идентификатор выбранного студента следующим образом:

currentVal = $("#inputID").val();
currentID = $("#listID option[value='" + currentVal + "']".attr('data-id');

теперь вы можете найти индекс выбранного студента в namesArray делает это:

if (currentID != undefined || currentVal != "" || currentVal != " ") {
  arrayIndex = namesArray.findIndex(x => x.names_id == currentID);
  currentArray = namesArray[arrayIndex];
}

где namesArray - это переменная 'names' json, которую я повторяю в сценарии, показанном в вопросе, и блок if не позволяет даже проверять массив, если идентификатор равен undefined или ввод пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...