Создание массива с массивами из запроса mysql

#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. хммм .. это кажется более близким к тому, что я хочу сделать … я проверю это сейчас.