В PHP сравните массив с полем в таблице MySQL - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть две таблицы;один список названий местоположений, другой список компаний, в поле которого хранятся потенциально несколько местоположений, в которых работает компания:

id  LocationName
1   Aberdeen
2   Dundee
3   Edinburgh
4   Glasgow


idCompany   CompanyName Locations
1           CompanyA    1, 2, 3, 4
2           CompanyB    2, 4
3           CompanyC    1

Для страницы сведений о каждой компании я хочу перечислить местоположения, в которыхони работают, отображая имя каждого.Например.для компании B:

Dundee
Glasgow

и т. д.

Исходя из фона VB, я бы просто просматривал каждый набор данных и сравнивал каждый, чтобы найти совпадения, но это в PHP и яне могу заставить его работать:

// Query for specific firm
    $sqlCompany= "SELECT * FROM company_details WHERE CompanyID='".$CompanyID."';";  
    $rstCompany= mysqli_query($conn, $sqlCompany);
    $row = mysqli_fetch_assoc($rstCompany);

// Query list of Locations
    $sqlLocationNames= "SELECT * FROM Locations ORDER BY LocationName ASC;";  
    $rstLocationNames= mysqli_query($conn, $sqlLocationNames);

// Explode the field of locations into an array:    
    $LocationArray = $row["Locations"];
    $LocationArray = explode (",", $LocationArray);

    for ($i = 0; $i < count($LocationArray); $i++) {
        while ($rowLocationNames = mysqli_fetch_assoc($rstLocationNames)) {
            if ($LocationArray[$i]==$rowLocationNames["idLocation"]) {
                echo $rowLocationNames["LocationName"]."<br />";
                }
            }
        }

Запустив это для компании А, я ожидаю получить список из четырех местоположений сверху, но я получу только первое местоположение (Абердин).Я перепробовал каждую комбинацию, но безрезультатно.Мне нужно сохранить структурированные данные таким образом, так как я намереваюсь иметь множитель выбора для вставки, а также редактирования данных, когда я смогу заставить это работать.Есть идеи, где я иду не так?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вместо того, чтобы зацикливать выборку из базы данных внутри итерации массива, что приводит к тому, что не остается данных для чтения, когда вы приходите ко второй записи в массиве (и, следовательно, самое большее один выход, как вы видите),просто зациклите выборку из базы данных и используйте in_array, чтобы определить, выводить ли имя местоположения:

   while ($rowLocationNames = mysqli_fetch_assoc($rstLocationNames)) {
       if (in_array($rowLocationNames["idLocation"], $LocationArray)) {
           echo $rowLocationNames["LocationName"]."<br />";
       }
   }
0 голосов
/ 12 февраля 2019

Проблема в том, что ваш цикл while для чтения имен местоположений из БД вложен в цикл for.После первой итерации цикла for указатель базы данных находится в конце набора записей, поэтому при переходе к следующей итерации не остается записей для чтения.

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

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