Array VS Serialized String

s@nch0

Хочу всё знать
Что правильнее передавать в качестве параметра для функции: Array или Serialized String ?
В качестве массива будет массив $_POST, а в качестве Serialized String будет serialize($_POST).

Ессно если учитывать, что для того, чтоб передать строку, нужно потратить время на сериализацию. А потом в самой функции для работы с элементами массива провести обратную операцию, то ответ напрашивается сам собой.

Однако может с точки зрения гуру-программирования мои рассуждения ошибочны ? :)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ага, вопрос, КАКОЙ функции и зачем тебе надо передавать сериализованный массив?
 

s@nch0

Хочу всё знать
Да видимо я что-то ступил. %)
В общем, вопрос глупый...

c0dex
В функцию будет передаваться массив данных, элементы которого будут добавлены в таблицу. Для каждого элемента массива есть своё поле.
Массив однородный. Т.е. $_POST['name']="Дуся" и т.д.
 

melo

однажды
передавай массив, потомучто потом после сериализации тебе все равно надо будет выделять данные.
 

A1x

Новичок
$_POST вообще-то суперглобальный, так что его куда-то передаветь без надобности
 

s@nch0

Хочу всё знать
melo
Ну да, я отписал это в первом посте. Вопрос был скорее не с точки зрения оптимизации. А изящности, что ли...
 

iceman

говнокодер
s@nch0
забудь про сериализацию. в бд должны быть конкретные данные...
 

s@nch0

Хочу всё знать
iceman
Да в БД я и не собирался хранить сериализованные данные. :)

Ну а по поводу утверждения - бывают случаи, когда удобнее сохранить в какой-то колонке кучу данных. А не плодить кучу колонок в таблице. Ну, это моё имхо. )
 

melo

однажды
бывает и такое, когда лучше хранить сериализованный объект, это уже от задач зависит.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
s@nch0
Это твое имхо, и плодить ничего не надо. Все решается выравниванием твоих данных вертикально в таблицу ключ - значение с необходимыми идентификаторами привязки, если надо
 

Активист

Активист
Команда форума
Сюрилизацией удобно хранить объекты, или, например использовать сюреализацию для хранения данных типичных для БД в файловой системе.

Например (обратить внимание на методы store и restore)
PHP:
<?php 
class order_basket {
	/**
	 * Container for items objects 
	 * @var array Array of order_item
	 */
	public $items = array();
	
	/**
	 * Total summ of objects
	 * @var integer
	 */
	public $summ = 0;
	
	/**
	 * Constructor;
	 */
	function __construct() {
		$this->restore();
	} 
	
	/**
	 * Autoload system for unseriliaze items object
	 * @param string $name
	 */
	function __autoload($name) {
		
		switch ($name) {
			case "order_item": require_once("modules/order/classes/{$name}.php"); break;
			default:
				throw new Exception("Call to undeclared class: {$name}");
		}	
	}
	
	/**
	 * Add item to basker
	 * 
	 * @param MySQL $MySQL
	 * @param intager $productId
	 * @param intager $count
	 */
	public function add(MySQL $MySQL, $productId, $count) {
		if ($count < 1) {
			throw new Exception("Вы не можете положить в корзину ноль товаров");
		}
		
		
		$MySQL->query("SELECT `id`, `articul`, `productTitle`, `cost`, `productMainPhoto` FROM `catalogProducts` WHERE `id` = '".(int)$productId."'");
		
		if ($MySQL->num_rows() !== 1) {
			throw new Exception("Ошибка. Указанный Вами продукт не найден");
		}
		
		$result = $MySQL->next_row_assoc();
		/* eof of todo block */
		
		if (($key = $this->foundByProductId($productId)) !== false) {
			$this->items[$key]->plus($count);
		} else {
			$item = new order_item();
			$item->setProductId($productId);
			$item->setPhoto($result['productMainPhoto']);
			$item->setActucul($result['articul']);
			$item->setTitle($result['productTitle']);
			$item->setCount($count);
			$item->setCost($result['cost']);
			
			$this->items[] = $item;
		}
		
		$this->calculate();
		$this->store();
	}
	
	/**
	 * Recount items by product
	 * @param int $productId
	 * @param int $count
	 */
	public function recount($productId, $count) {
		if (($key = $this->foundByProductId($productId)) !== false) {
			if ((int)$count == 0) {
			} else {
				$this->items[$key]->setCount($count);
			}
		}
		$this->calculate();
		$this->store();
	}
	
	/**
	 * Remove object from items array
	 * 
	 * @var int $key
	 * @return void;
	 */
	
	public function remove($key) {
		if (isset($this->items[$key])) {
			unset($this->items[$key]);
		}
	}
	
	/**
	 * Return size of basket
	 * 
	 * @return integer
	 */
	public function sizeof() {
		return sizeof($this->items);
	}
	
	/**
	 * Store basket into session
	 * 
	 * @return void;
	 */
	public function store() {
		$_SESSION['basket'] = serialize($this->items);
	}
	
	/**
	 * Restore basket from session
	 * 
	 * @return void;
	 */
	public function restore() {
		$this->items = isset($_SESSION['basket']) ? unserialize($_SESSION['basket']) : array();
	}
	
	/** 
	 * Clear basket
	 * 
	 * @return void;
	 */
	public function clear() {
		$this->items = array();
		$this->store(); 
	}
	
	/**
	 * Calculate total somm of order in basket
	 * 
	 * @return void;
	 */
	public function summ() {
		return $this->summ;
	}
	 
	/** 
	 * Found exists item by object id
	 *  
	 * @param bool|integer $productId
	 */
	private function foundByProductId($productId) {
		foreach ($this->items as $key => $item) {
			/* @var order_item $item */
			if ($item->productId == $productId) {
				return $key;
			}
		}
		return false;
	} 
	
	/**
	 * Calculete total summ of basket
	 * 
	 * @return void;
	 */
	private function calculate() {
		$this->summ = 0;
		
		foreach ($this->items as $item) {
			/* @var order_item $item */
			$this->summ += $item->summ;
		}
		return $this->summ; 
	}
}
?>
 

Активист

Активист
Команда форума
Вурдалак
> __sleep() и __wakeup()
Потому что хранениние - есть store, а серилизацию я делаю не самого объекта - корзины, а массива объектов order_item, если бы я всю корзину серилазирвал,
то магические методы были бы тут уместны, а так, они не уместны, или я ошибаюсь, приведи пример о там, как ты хочешь использовать эти методы.

> — надо объяснять почему так писать нехорошо?
Ну я только за. Аутолаудом решается проблема PHP_Incomplete_Class, использовать колбек, имхо, незачем. Но все равно объясни и покажи что не так ))
 

tz-lom

Продвинутый новичок
Активист, в принципе я согласен с Вурдалак , не стоит называть метод именем магической функции,можно запутаться
 

Вурдалак

Продвинутый новичок
Активист, так корзина именно товарами и определяется. Правильнее корзину сериализовать. И попутно: корзина не должна сама искать товар в БД. Правильнее будет
PHP:
class Order_Basket
{
    // ...

    public function add(Product $product)
    {
        // ...

        $this->items[] = new Order_Item($product);

        // ...
    }
}
PHP:
$basket->add(Product::findById($productId));
Ну я только за. Аутолаудом решается проблема PHP_Incomplete_Class, использовать колбек, имхо, незачем. Но все равно объясни и покажи что не так ))
— как уже заметили, не рекомендуется использовать для своих методов имена с «__». Да и сам класс корзины тоже к заказам относится, но подгружается кем-то другим. Это «кто-то другой» не может order_item подгружать?
 
Сверху