如何访问此数组的内部元素?

时间:2019-03-19 19:53:35

标签: php mysql arrays foreach mysqli-fetch-array

编辑:

我正在尝试在select HTML下拉列表中显示我的类别表的类别名称,但是我得到了

  

非法字符串偏移

始终出错,无论我使用$value['category_name']还是$key['category_name']

Categories表只有两行的category_idcategory_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 个答案:

答案 0 :(得分: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 ?遍历数组的每个元素,并在永远无法满足的条件下执行“继续”,这又有什么用呢?为什么我们需要执行SHOW COLUMNS查询?

这只是一个不连贯的rigmarole。

我只是在猜测,但是看来我们要完成的工作是检索category_idcategory_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 :(得分:0)

您的代码中有一些错误。

您的HTML代码中的foreach循环将括号放在错误的位置:

A_list = [1,2,4,6,7,10,12,13]
B_list = [20,22,23,26]
C_list = [36,37,39]

由于您的foreach循环在每次迭代中仅填充一个值,因此没有键。

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

完整代码:

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

来源:PHP-foreach

答案 2 :(得分:0)

要从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'] ?>