Для хранения данных удобно использовать массивы.
В этой статье мы рассмотрим цикл Массив <-> База Данных <-> Массив
Примеры будут приведены с использованием библиотеки PDO и устаревшего, но простого mysql_query.
Начнём с массива. Предположим что у нас есть массив товаров примерно следующего содержания:
'title' => 'Яблоки',
'price' => 17,
'catalog' => 1,
'count' => 114,
),
'title' => 'Груши',
'price' => 25,
'catalog' => 1,
'count' => 85,
),
'title' => 'Молоко',
'price' => 15,
'catalog' => 13,
'count' => 100,
),
'title' => 'Канцелярия',
'price' => 80,
'catalog' => 17,
'count' => 56,
),
'title' => 'iPhone 4S',
'price' => 5000,
'catalog' => 18,
'count' => 100,
),
);
Теперь в переменной $products хранится двумерный ассоциативный массив. Массив первого уровня является не ассоциативным, так как в качестве ключей у него цифры, а каждый массив второго уровня уже является ассоциативным, так как по имени ключа разработчик может понять что же в нём хранится.
И необходимо поместить этот массив в базу данных.
Так как я уже знаю структуру массива, то могу спроектировать соответствующую таблицу.
[sql]
CREATE TABLE IF NOT EXISTS `my_products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`price` int(11) NOT NULL,
`catalog` int(11) NOT NULL,
`kol` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
[/sql]
Данный код можете запустить через PhpMyAdmin.
Потом необходимо соединиться с базой данных.
//mysql_query
//PDO
$db = new PDO('mysql:dbname=db_name; host=localhost',"user_name","user_password",
array(PDO
::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Я явно указал кодировку UTF-8, чтобы избежать появления крикозябр в таблице.
Запрос можно выполнить двумя способами - по одному запросу на каждый товар, или одним запросом поместить сразу все товары.
Вначале реализуем пятью отдельными запросами.
//mysql_query
foreach ($products as $prod) {
$sql = "
INSERT INTO `my_products`
(`id`,`title`,`price`,`catalog`,`kol`)
VALUES
(NULL,'".$prod['title']."','".$prod['price']."','".$prod['catalog']."','".$prod['count']."')
";
}
//PDO
foreach ($products as $prod) {
$sql="insert into `my_products` (`title`,`price`,`catalog`,`kol`) values (:title,:price,:catalog,:kol)";
$sth=$db->prepare($sql);
$sth->bindValue(':title', $prod['title']);
$sth->bindValue(':price', $prod['price']);
$sth->bindValue(':catalog', $prod['catalog']);
$sth->bindValue(':kol', $prod['count']);
$sth->execute();
}
Недостатком такого подходя является то, что запросы к БД исполняются в цикле. Запомните раз и навсегда - никогда не делайте запросов в цикле. Команда INSERT позволяет добавить в таблицу сразу несколько строк. Выглядеть это будет следующим образом.
//mysql_query
foreach ($products as $prod) {
foreach ($prod as $item) {
$value[] = "'" . $item . "'";
}
$string[] = '(' . implode(',', $value) . ')'; // Если этот участок сложен для вас - раскоментите,
// и поймёте как формируется переменная $string
// echo $string . '<br />';
}
$sql = "INSERT INTO `my_products`
(`id`,`title`,`price`,`catalog`,`kol`)
// Вот и конечный запрос.
// echo $sql . '<br />';
//PDO
$i = 0;
while ($i < count($products)) { foreach ($products[0] as $key => $item) {
$value[] = ':' . $key . '_' . $i;
}
$string[] = '(' . implode(',', $value) . ')'; $i++;
}
$sql="insert into `my_products` (`title`,`price`,`catalog`,`kol`) values " . implode(',', $string);
$sth=$db->prepare($sql);
foreach ($products as $key => $prod) {
$sth->bindValue(':title_' . $key, $prod['title']);
$sth->bindValue(':price_' . $key, $prod['price']);
$sth->bindValue(':catalog_' . $key, $prod['catalog']);
$sth->bindValue(':count_' . $key, $prod['count']);
}
$sth->execute();
</>
Таким образом можно перегнать массив данных в БД. Сам массив может взяться откуда угодно, например распаршен XML файл, получены данные формы, данные из другой БД и т.д.
А чтобы получить массив - достаточно сделать 1 единственный запрос на выборку данных.
//mysql_query
//print_r($row);
echo $row['title'] . ' стоят ' . $row['price'] . '<br />';
}
//PDO
$sql = 'SELECT * FROM `my_products`';
$sth = $db->prepare($sql);
$sth->execute();
$res = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $row){
echo $row['title'] . ' стоят ' . $row['price'] . '<br />';
}
Вот собственно и всё. Как видите - ничего сложного, правда пример достаточно примитивный.
При работе с БД посредством mysql_query - обязательно оборачивайте переменные в запросе функцией
mysql_real_escape_string
Вот так:
$sql = "
INSERT INTO `my_products`
(`id`,`title`,`price`,`catalog`,`kol`)
VALUES
(
NULL,
)
";
Без такой защиты(или аналогичной другой) ваш сайт будет уязвим для SQL-инъекций, и ваш сайт могут тупо взломать и грохнуть.->->