Как получить доступ к внутренним элементам этого массива?

#php #mysql #arrays #mysqli #foreach

#php #mysql #массивы #mysqli #foreach

Вопрос:

Я пытаюсь отобразить названия категорий моей таблицы categories в select раскрывающемся списке HTML, но я получаю

Недопустимое смещение строки

Ошибка все время, независимо от того, использую ли я $value['category_name'] или $key['category_name'] .

Categories в таблице есть только столбцы category_id и category_name с двумя строками.

Как получить доступ category_id к этому массиву?

 array(6) {
  ["Field"]=>
  string(11) "category_id"
  ["Type"]=>
  string(7) "int(11)"
  ["Null"]=>
  string(2) "NO"
  ["Key"]=>
  string(3) "PRI"
  ["Default"]=>
  NULL
  ["Extra"]=>
  string(14) "auto_increment"
}
  

Мой код прямо сейчас:

 $q = "SELECT DISTINCT categories.category_name FROM products LEFT JOIN categories ON (products.category_id = categories.category_id)";

$result = mysqli_query($dbc, $q);
$sql = "SHOW COLUMNS FROM `categories`";
$columns = mysqli_query($dbc,$sql);

$arr = [];
while($row = mysqli_fetch_array($columns, MYSQLI_ASSOC)){
    $arr[] = $row;
}

<fieldset>
        <legend>Add Product</legend>
        <p>Product name: <input name="product" type="text" size="60" maxlength="100" required></p>
        <p>Category: <select name="category_id"><?php $i = 1;foreach ($arr as $entry)
                if($i > 1) {continue;}
                { ?><option value="<?php echo $entry['Field'];?>"><?php foreach($entry as $key=>$value) {var_dump($arr);} ?></option> <?php $i  ; }?></select></p>
        <p>Price: <input name="price"></p>
        <p>Amount: <input name="amount"></p>
        <p><input name="submit" type="submit" value="Add This Product"></p>
    </fieldset>
  

Комментарии:

1. В вашем коде ничего не отображается как HTML

2. @GrumpyCrouton <?php foreach($entry as $key=>$value) {var_dump($arr);} ?> На данный момент я оставил такой код, но повторение каждого варианта массива не помогло

3. Какой смысл в «выбрать столбец»?

4. @u_mulder Для вывода названий категорий из таблицы категорий в БД. Чтобы, когда пользователь добавляет новый продукт в базу данных, он мог выбрать название категории из выпадающего списка.

5. «Выбрать столбцы» выбирает определения столбцов для таблицы, а не значения.

Ответ №1:

Фактическая часть кода PHP, похоже, имеет вид:

 $q = "SELECT DISTINCT c.category_name 
        FROM products p
        LEFT
        JOIN categories c
          ON c.category_id = p.category_id";
$result = mysqli_query($dbc, $q);

// the code below ignores result of the preceding query

$sql = "SHOW COLUMNS FROM `categories`";
$columns = mysqli_query($dbc,$sql);

$arr = [];
while( $row = mysqli_fetch_array($columns, MYSQLI_ASSOC) ) {
   $arr[] = $row;
}

$i = 1;
foreach( $arr as $entry ) if( $i > 1 ) { continue; }

// the preceding foreach loop is ended, so the following is not part of that loop
{
  echo $entry['Field'];
  foreach( $entry as $key=>$value ) {
    var_dump($arr);
  }
  $i  ;
}
  

(Там нет ссылки на $result , результирующий набор из этого первого запроса просто отбрасывается. Трудно определить, для чего это должно быть выполнено. зачем вообще нужна переменная $i ? Что общего с циклическим перебором каждого элемента массива и выполнением «continue» при условии, которое никогда не будет выполнено? И зачем нам нужно выполнять запрос SHOW COLUMNS?

Это просто бессвязная чушь.

Я просто предполагаю, но похоже, что работа, которую мы хотим выполнить, — это получить список category_id и category_name значений и оформить этот список как

  <select ... > 
   <option value="42">Computers     </option>
   <option value="43">Smartphpones  </option>
 </select>
  

Но опять же, я просто предполагаю.

Похоже, мы могли бы получить это с помощью запроса и сохранить в массиве:

 $sql = "SELECT c.category_id
             , c.category_name
          FROM products p
          LEFT
          JOIN categories c
            ON c.category_id = p.category_id
         GROUP
            BY c.category_id
             , c.category_name
         ORDER
            BY c.category_name";
$result = mysqli_query($dbc, $sql);
$arr = [];
while( $row = mysqli_fetch_array($result, MYSQLI_ASSOC) ) {
   $arr[] = $row;
}
  

И как только мы сделаем это при инициализации, а затем, когда мы завершим html-страницу, когда мы дойдем до того, что захотим поместить список в html, мы сделаем это в цикле примерно так:

   foreach( $arr as $val ) {
      echo $val['category_id'];
      echo $val['category_name'];
  }
  

Комментарии:

1.Спасибо, я совершенно не заметил, что использовал неправильный SQL-запрос. Предполагалось, что это будет ерунда, $q не $sql ПОКАЗЫВАЮЩАЯ ТАБЛИЦЫ. Неудивительно, что я не получал значения. И да, вы правы насчет того, чего я хочу достичь. Теперь в моем раскрывающемся списке select отображаются значения категории. Предполагается, что у select value атрибута есть category_id , который в моей таблице DB 2 равен категории компьютеров, а 3 — смартфонам. К сожалению, var_dump нигде не отображает category_id.

2. Запрос должен возвращать category_id столбец вместе с category_name столбцом, как показано в примере SQL, который я привел.

3. Спасибо, вы мне очень помогли. Теперь я получаю правильный идентификатор категории для значений моего атрибута select и значений name в выпадающем списке. Просто теперь, когда у меня все собрано и работает, мой выпадающий список выводит оба значения id и name в html в select вот так: 2Smartphones lol. РЕДАКТИРОВАТЬ: исправлено.

Ответ №2:

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

Поэтому вместо

 <option value="<?php echo $entry['Field'];?>">
  

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

 <option value="<?php echo $entry['category_id'];?>">
  

и вместо

 <?php foreach($entry as $key=>$value) {var_dump($arr);} ?>
  

используйте

 <?php echo $entry['category_name'] ?>
  

Ответ №3:

У вас есть некоторые ошибки в коде.

Ваш цикл foreach в вашем HTML-коде имеет скобку в неправильном месте:

 <p>Category: <select name="category_id">
<?php 
    $i = 1;
    foreach ($arr as $entry) { //<-- You was missing this
        if($i > 1) continue;
?>
  

Поскольку ваш цикл foreach заполняет только одно значение на каждой итерации, ключа не будет.

 <option value="<?php echo $entry; ?>">
  

Завершенный код:

 $q = "SELECT DISTINCT categories.category_name FROM products LEFT JOIN categories ON (products.category_id = categories.category_id)";

$result = mysqli_query($dbc, $q);
$sql = "SELECT * FROM `categories`";
$columns = mysqli_query($dbc,$sql);

$arr = [];
while($row = mysqli_fetch_array($columns, MYSQLI_ASSOC)){
    $arr[] = $row;
}

<fieldset>
    <legend>Add Product</legend>
    <p>Product name: <input name="product" type="text" size="60" maxlength="100" required></p>
    <p>Category: 
        <select name="category_id">    
            <?php 
                foreach ($arr as $entry) {
                    echo '<option value="' . $entry['category_name']. '"></option>
                }
            ?>
        </select>
    </p>
    <p>Price: <input name="price"></p>
    <p>Amount: <input name="amount"></p>
    <p><input name="submit" type="submit" value="Add This Product"></p>
</fieldset>
  

Исходники: PHP-foreach

Комментарии:

1. Вы понимаете, что каждый элемент $ arr является массивом?

2. @u_mulder что вы имеете в виду?

3. $entry — это массив , не так ли?

4. Хорошо, похоже, вы не знаете, что происходит, когда вы повторяете массив.

5. Извините, вы ничего не исправили.