#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. Извините, вы ничего не исправили.