Как получить доступ к этому массиву внутренних элементов? - PullRequest
0 голосов
/ 19 марта 2019

EDIT:

Я пытаюсь отобразить имена категорий моей таблицы категорий внутри 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>

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Фактическая часть кода 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? Какова работа с циклическим прохождением каждого элемента массива и выполнением «продолжения» с условием, которое никогда не будет выполнено?И почему нам нужно выполнить запрос 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'];
  }
0 голосов
/ 19 марта 2019

Для получения содержимого массивов из результатов 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'] ?>
0 голосов
/ 19 марта 2019

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

Ваш цикл 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

...