PHP заполняет html, выбирает массив из функции

Итак, это может показаться глупым вопросом. Я просмотрел другие потоки с этой вещью, и я не нашел ДОЛГО то, что я ищу.

Я получаю эту ошибку:

Предупреждение: указан недопустимый аргумент для foreach() в файле entry.php в строке 118.

строка 118 - это foreach, который я использую здесь:

<select id="Location" name="Location" class="text">
<option selected="selected"> - Choose Location - </option>
<?php 
    $locations = getLocationList();//this returns an array from separate function
    foreach($locations as $location) {//<-Line 118
        echo "<option value=". $location['locationID'] .">".$location['locationName']."</option> ";
    }
?>
</select>

Он не заполняется, он просто выдает ошибку. Мысли?

OK EDIT Вот как я извлекаю данные в отдельную функцию:

function getLocationList()
{
    $mydb = new myDBC();//<-this calls my secure connection class
    $table = "LocationTable";
    $sql = "SELECT `locationID`, `locationName` FROM " .$table;
    $rez = $mydb->runQuery($sql);//<-this connects runs my query
    if(isset($rez))
    {
        $newRow = mysqli_fetch_array($rez);//<-is this not returning an array?
        return $newRow;
    }
}

person Mark Bogner    schedule 15.06.2015    source источник
comment
Что вам говорит var_dump из $locations? Действительно ли он возвращает массив или, может быть, нулевое значение?   -  person Barry    schedule 15.06.2015
comment
Он ничего не возвращает - значит, он, вероятно, неправильно извлекает данные...?   -  person Mark Bogner    schedule 15.06.2015
comment
убедитесь, что вы подключены к базе данных, если вы получаете данные из базы данных, а также проверьте getLocationList(), как если бы он был пуст, это означает, что он ничего не возвращает   -  person insanityCode    schedule 15.06.2015
comment
Итак, я пошел и изменил способ извлечения, и когда я делаю var_dump, я получаю только одно местоположение из 12 array(4) { [0]=>string(1) "1" ["locationID"]=> string(1) "1" [1]=> string(7) "Atlanta" ["locationName"]=>string(7) "Atlanta" }   -  person Mark Bogner    schedule 15.06.2015
comment
Мне кажется, что ваш метод getLocationList(); полностью испорчен. Предоставьте код для этой функции, чтобы мы могли проверить.   -  person CodeGodie    schedule 15.06.2015


Ответы (2)


Когда у вас есть такие ошибки, как Warning: Invalid argument supplied for foreach(), это буквально означает, что любая переменная, которую вы используете в своем foreach(), не является ни массивом, ни объектом. Убедитесь, что $locations является либо массивом, либо объектом. Если вы это исправите, это сработает.

Хорошо, после проверки обновления попробуйте внести следующие изменения:

Измените это:

if (isset($rez)) {
    $newRow = mysqli_fetch_array($rez); //<-is this not returning an array?
    return $newRow;
}

К этому:

if (isset($rez)) {
    return $rez->fetch_assoc();
}

Хорошо, кажется, что ваш класс/библиотека не является полной библиотекой, и поэтому вам нужно добавить свой собственный код, чтобы улучшить ее. Чтобы это работало так, как вы хотите, добавьте эту функцию где-нибудь в свой DBClass.php.

function convert_result_to_arr($result) {
    if ($result) {
        while ($row = $result->fetch_assoc()) {
            $arr[] = $row;
        }
    }
    return $arr;
}

Это преобразует ваши результаты в соответствующий многомерный массив, чтобы вы могли выполнять итерацию и получать информацию.

Теперь вы можете использовать его так:

$rez = $mydb->runQuery($sql); //<-this connects runs my query
$rez_converted = $mydb->convert_result_to_arr($rez);
if(isset($rez_converted )){
        return $rez_converted ;
}

Теперь вы можете повторить, как вы изначально хотели:

foreach($locations as $location) {//<-Line 118
        echo "<option value=". $location['locationID'] .">".$location['locationName']."</option> ";
    }

Я также настоятельно рекомендую вам перейти на платформу MVC. Я рекомендую Codeigniter для начала. Вам не нужно будет беспокоиться обо всем этом вместе с другими проблемами, которые возникают.

person CodeGodie    schedule 15.06.2015
comment
теперь, когда данные извлекаются надлежащим образом, я получаю следующую информацию: Недопустимое смещение строки 'locationID' в entry.php в строке 120, что является моим оператором эха. - person Mark Bogner; 15.06.2015
comment
вероятно, потому что вы не получаете массив. Что вы получаете, когда var_dump($location); ? - person CodeGodie; 15.06.2015
comment
подождите... Я собираюсь показать вам, как я извлекаю данные из исходного поста... - person Mark Bogner; 15.06.2015
comment
является ли myDBC пользовательской библиотекой? если да, то где мы можем найти документацию? - person CodeGodie; 15.06.2015
comment
Да, это мой класс подключения, который также выполняет мои запросы. - person Mark Bogner; 15.06.2015
comment
Я нашел его в Интернете несколько месяцев назад. Я думаю, что это на github. Я посмотрю, смогу ли я найти его. - person Mark Bogner; 15.06.2015
comment
Так ты выдумал? Вам нужно будет показать нам код для этого. Специально для этого метода $mydb->runQuery($sql); - person CodeGodie; 15.06.2015
comment
Я не думаю, что могу разместить его здесь с этим вопросом, не так ли? Должен ли я отправить его вам? - person Mark Bogner; 15.06.2015
comment
ждать. Попробуйте еще одну вещь. Я опубликую это в своем ответе - person CodeGodie; 15.06.2015
comment
Я получаю:<select id="Location" name="Location" class="text"> <option selected="selected"> - Choose Location - </option> <b>Warning</b>: Illegal string offset 'locationID' in <b>entry.php</b> on line <b>121</b><br /> <b>Warning</b>: Illegal string offset 'LocationName' in <b>entry.php</b> on line <b>121</b><br /> <option value=1>1</option> <br /> <b>Warning</b>: Illegal string offset 'locationID' in <b>entry.php</b> on line <b>121</b><br /> <br /> <b>Warning</b>: Illegal string offset 'locationName' in <b>entry.php</b> on line <b>121</b><br /> <option value=A>A</option> </select> - person Mark Bogner; 15.06.2015
comment
Я готов. будет отправлять с моего gmail (mb2000inc). - person Mark Bogner; 15.06.2015
comment
Это работает. Хотя, первая запись повторяется один раз - в остальном это здорово. - person Mark Bogner; 15.06.2015
comment
странно, что вы получаете этот дополнительный. Этого не должно быть. Дайте мне знать, если вам все еще нужна помощь с этим. - person CodeGodie; 15.06.2015
comment
Хех, понял. У меня был лишний в БД - person Mark Bogner; 15.06.2015

Пробовали ли вы делать print_r() или var_dump() из $locations. В вашем цикле foreach все в порядке, поэтому, скорее всего, функция getLocationList() возвращает не массив или пустой массив.

До foreach() вы можете проверить count($locations)

    <?php 
    $locations = getLocationList();//this returns an array from separate function
    if(count($locations)>0)
    {
        foreach($locations as $location) 
        {
              echo "<option value=". $location['locationID'] .">".$location['locationName']."</option> ";
        }
    }
    ?>
person AnkiiG    schedule 15.06.2015
comment
Приходилось ли пытаться поместить foreach в if(count($locations)>0) { }? - person AnkiiG; 15.06.2015
comment
Я получаю эту информацию: Illegal string offset 'locationID' in entry.php on line 120, которая является моим оператором эха - person Mark Bogner; 15.06.2015
comment
Вставьте результат print_r($locations); - person AnkiiG; 15.06.2015
comment
Это var_dump() результат. Вставьте print_r() результат. - person AnkiiG; 15.06.2015
comment
Давайте продолжим обсуждение в чате. - person AnkiiG; 15.06.2015