#php #mysql #arrays
#php #mysql #массивы
Вопрос:
Работая над интернет-магазином, я должен считывать из БД продукты, у которых productpack не равен null.
productpack из БД выглядит следующим образом : 0141,3122,0104,0111,3114,0106,0117 .
Я пытаюсь получить все элементы БД, для которых установлен productpack (не null), и преобразовать их в массив с массивами с этими кодами (0141,3122,0104,0111,3114,0106,0117).
function p_productpacks(){
$productpacks = array();
$pack = array();
$q = mysql_query('SELECT productpack FROM products WHERE productpack <> "";');
while($p = mysql_fetch_object($q)){
$pack = explode(",", $p);
$productpacks[] = $pack;
}
return $productpacks;
}
Комментарии:
1. Похоже, что ваша модель базы данных не нормализована должным образом. Всякий раз, когда вы чувствуете необходимость написать свою собственную маленькую логику микро-базы данных внутри базы данных, что-то не так.
Ответ №1:
Вам необходимо создать массив, иначе вы перезаписываете существующие пакеты:
$pack = explode(",", $p->productpack);
$productpacks[] = $pack;
Для получения дополнительной информации прочитайте о документах array_push
Docs и PHP Arrays Docs (и mysql_fetch_object
Docs).
Комментарии:
1. Итак, в чем тогда ваш вопрос?
2. хорошо … почему-то это не работает, я не знаю почему. массив пуст
3. ну, это не будет работать должным образом, если запятая является допустимым символом для имени пакета продукта
Ответ №2:
Вы можете получить все пакеты продуктов в массиве CSV с помощью:
$result = mysql_query("SELECT GROUP_CONCAT(productpack) as productpacks
FROM products WHERE productpack <> '' ");
if ($result) {
$row = mysql_fetch_row($result);
$productpacks_as_CSV_string = $row['productpacks'];
}
Таким образом, вам нужно получить только одну строку из базы данных, экономя много времени.
Смотрите: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
Ответ №3:
mysql_fetch_object возвращает объект и не может использоваться с обработкой строк .. если вы определенно хотите использовать это, вам нужно сделать что-то вроде:
$pack=explode(',',$p->productpack);
$productpacks[]=$pack
Или вместо этого использовать старый добрый массив:
while ($p = mysql_query($q))
{
$pack = explode(",", $p['productpack']);
$productpacks[] = $pack;
}
Комментарии:
1. хммм .. это кажется более близким к тому, что я хочу сделать … я проверю это сейчас.