编辑:
我正在尝试在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>
谢谢。
答案 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_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 :(得分: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'] ?>