Advertisement
  1. Code
  2. PHP
  3. PHP Scripts

Создайте корзину с PHP и MySQL

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

В этом еженедельном уроке screencast + мы научимся создавать собственную корзину покупок с PHP и MySQL. Вы увидите, что всё не так сложно, как кажется.


Предварительный просмотр скринкастов



Шаг 1

Начнём со структуры папок:


Структура

  • reset.css - вы можете получить по this ссылке
  • style.css - наш css файл для стиля HTML макета
  • connection.php - файл для соединения с базой данных
  • index.php - шаблон корзины покупок
  • cart.php - файл, который меняет продукты в корзине (добавлять, удалять)
  • products.php - страница списка продуктов

Шаг 2

Начнем с разметки html, а затем её оформления. Откройте index.php и скопируйте/вставьте код:

1
 
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 

3
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
4
 
5
<html xmlns="http://www.w3.org/1999/xhtml"> 
6
<head> 
7
   
8
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
9
	<link rel="stylesheet" href="css/reset.css" /> 
10
	<link rel="stylesheet" href="css/style.css" /> 
11
	 
12
	<title>Shopping cart</title> 
13
 
14
</head> 
15
 
16
<body> 
17
	 
18
	<div id="container"> 
19
 
20
		<div id="main"> 
21
			 
22
		</div><!--end main--> 
23
		 
24
		<div id="sidebar"> 
25
			 
26
		</div><!--end sidebar--> 
27
 
28
	</div><!--end container--> 
29
 
30
</body> 
31
</html>

Как вы видите, наша страница имеет две колонки: основной столбец и sidebar. Теперь пройдём в CSS. Откройте файл style.css и пропишите код:

1
 
2
	 
3
body { 
4
	font-family: Verdana; 
5
	font-size: 12px; 
6
	color: #444; 
7
} 
8
 
9
 
10
#container { 
11
	width: 700px; 
12
	margin: 150px auto; 
13
	background-color: #eee; 
14
	overflow: hidden; /* Set overflow: hidden to clear the floats on #main and #sidebar */ 
15
	padding: 15px; 
16
} 
17
 
18
	#main { 
19
		width: 490px; 
20
		float: left; 
21
	} 
22
 
23
	#sidebar { 
24
		width: 200px; 
25
		float: left; 
26
	}

Вот как теперь выглядит наша страница продуктов:



Полный скринкаст



Шаг 3

Прежде чем перейти к части PHP/MySQL, нам нужно создать базу данных. Откройте phpMyadmin и выполните следующие действия:

  1. Перейдите на вкладку Privileges, нажмите кнопку добавления нового пользователя и настройте: Username: tutorial; Host: localhost; Password: supersecretpassword. Теперь убедитесь, что установлены Global privileges; затем переходите к следующему шагу.
  2. Создайте новую базу данных под названием tutorials.
  3. Создайте новую таблицу products и установите количество полей 4. Теперь заполните эти поля так: id_integer - убедитесь, что он установлен в INT и пометьте его как PRIMARY (также установите его в auto_increment); name  - будет VARCHAR длиной 100; description  - VARCHAR длиной 250; price - значение DECIMAL (2,6)
  4. Заполните таблицу несколькими примерами продуктов.

Для экономии времени я экспортировал свою таблицу, чтобы вы просто запустили следующий запрос:

1
 
2
CREATE TABLE IF NOT EXISTS `products` ( 
3
  `id_product` int(11) NOT NULL AUTO_INCREMENT, 
4
  `name` varchar(100) NOT NULL, 
5
  `description` varchar(250) NOT NULL, 
6
  `price` decimal(6,2) NOT NULL, 
7
  PRIMARY KEY (`id_product`) 
8
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 
9
 
10
INSERT INTO `products` (`id_product`, `name`, `description`, `price`) VALUES 
11
(1, 'Product 1', 'Some random description', '15.00'), 
12
(2, 'Product 2', 'Some random description', '20.00'), 
13
(3, 'Product 3', 'Some random description', '50.00'), 
14
(4, 'Product 4', 'Some random description', '55.00'), 
15
(5, 'Product 5', 'Some random description', '54.00'), 
16
(6, 'Product 6', 'Some random description', '34.00');




Шаг 4

До извлечения данных из базы данных я сделаю index.php шаблон для списка продуктов и корзины. Поэтому добавьте следующий код в начало страницы index.php:

1
 
2
<?php 
3
	session_start(); 
4
	require("includes/connection.php"); 
5
	if(isset($_GET['page'])){ 
6
		 
7
		$pages=array("products", "cart"); 
8
		 
9
		if(in_array($_GET['page'], $pages)) { 
10
			 
11
			$_page=$_GET['page']; 
12
			 
13
		}else{ 
14
			 
15
			$_page="products"; 
16
			 
17
		} 
18
		 
19
	}else{ 
20
		 
21
		$_page="products"; 
22
		 
23
	} 
24
?>
  1. session_start() - для дальнейшего использования; это позволит нам использовать сеансы (очень важно, чтобы session_start был написан прежде, чем другие данные будут отправлены в браузер).
  2. Во второй строке мы укажем connection.php, который установит соединение с базой данных (мы рассмотрим это в секунду). И ещё одно: разница между include и require заключается в том, что если вы используете require и файл не может быть найден, выполнение скрипта закончится. Если вы используете "include", скрипт продолжит работать.
  3. Вместо копирования всего html-кода (ссылка на css, на js) для каждого файла на вашем сайте, можете просто сделать их все относительно одного файла. Сначала я проверяю, есть ли переменная GET, называемая "page set". Если нет, я создаю новую переменную _pages. Указывая сначала переменную GET, называемую pages, я хочу убедиться, что файл, который я собираюсь включить, является допустимой страницей.

Для этого нам нужно включить файл; добавьте эту строку в index.php между div с id "main":

1
 
2
	<?php require($_page.".php"); ?>

Теперь у нас полный index.php:

1
 
2
	<?php 
3
	session_start(); 
4
	require("includes/connection.php"); 
5
	if(isset($_GET['page'])){ 
6
		 
7
		$pages=array("products", "cart"); 
8
		 
9
		if(in_array($_GET['page'], $pages)) { 
10
			 
11
			$_page=$_GET['page']; 
12
			 
13
		}else{ 
14
			 
15
			$_page="products"; 
16
			 
17
		} 
18
		 
19
	}else{ 
20
		 
21
		$_page="products"; 
22
		 
23
	} 
24
 
25
?> 
26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
27
<html xmlns="http://www.w3.org/1999/xhtml"> 
28
<head> 
29
	 
30
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
31
	<link rel="stylesheet" href="css/reset.css" /> 
32
	<link rel="stylesheet" href="css/style.css" /> 
33
	 
34
 
35
	<title>Shopping Cart</title> 
36
 
37
 
38
</head> 
39
 
40
<body> 
41
	 
42
	<div id="container"> 
43
 
44
		<div id="main"> 
45
			 
46
			<?php require($_page.".php"); ?> 
47
 
48
		</div><!--end of main--> 
49
		 
50
		<div id="sidebar"> 
51
			 
52
		</div><!--end of sidebar--> 
53
 
54
	</div><!--end container--> 
55
 
56
</body> 
57
</html>

Давайте создадим соединение с MySQL. Откройте connections.php и пропишите следующее:

1
 
2
	<?php 
3
 
4
	$server="localhost"; 
5
	$user="tutorial"; 
6
	$pass="supersecretpassword"; 
7
	$db="tutorials"; 
8
	 
9
	// connect to mysql 

10
	 
11
	mysql_connect($server, $user, $pass) or die("Sorry, can't connect to the mysql."); 
12
	 
13
	// select the db 

14
	 
15
	mysql_select_db($db) or die("Sorry, can't select the database."); 
16
 
17
?>

Шаг 5

Пропишем разметку для страницы продуктов. Откройте её и введите следующее:

1
 
2
<h1>Product List</h1> 
3
	<table> 
4
	    <tr> 
5
	        <th>Name</th> 
6
	        <th>Description</th> 
7
	        <th>Price</th> 
8
	        <th>Action</th> 
9
	    </tr> 
10
	    <tr> 
11
	        <td>Product 1</td> 
12
	        <td>Some random description</td> 
13
	        <td>15 $</th> 
14
	        <td><a href="#">Add to cart</a></td> 
15
	    </tr> 
16
	     <tr> 
17
	        <td>Product 2</td> 
18
	        <td>Some random description</td> 
19
	        <td>25 $</th> 
20
	        <td><a href="#">Add to cart</a></td> 
21
	    </tr> 
22
	</table>

Давайте посмотрим на страницу:


Как видите, это довольно уродливо. Давайте добавим этот CSS.

1
 
2
a {color: #48577D; text-decoration: none;} 
3
 
4
a:hover {text-decoration: underline;} 
5
 
6
h1, h2 {margin-bottom: 15px} 
7
 
8
h1 {font-size: 18px;} 
9
h2 {font-size: 16px} 
10
	#main table { 
11
			width: 480px; 
12
		} 
13
		 
14
			#main table th { 
15
				padding: 10px; 
16
				background-color: #48577D; 
17
				color: #fff; 
18
				text-align: left; 
19
			} 
20
			 
21
			#main table td { 
22
				padding: 5px; 
23
			} 
24
			#main table tr { 
25
				background-color: #d3dcf2; 
26
			}

Okay: другое дело:


Выглядит намного лучше, не так ли? Внизу указан полный код style.css:

1
 
2
body { 
3
	font-family: Verdana; 
4
	font-size: 12px; 
5
	color: #444; 
6
} 
7
 
8
a {color: #48577D; text-decoration: none;} 
9
 
10
a:hover {text-decoration: underline;} 
11
 
12
h1, h2 {margin-bottom: 15px} 
13
 
14
h1 {font-size: 18px;} 
15
h2 {font-size: 16px} 
16
 
17
#container { 
18
	width: 700px; 
19
	margin: 150px auto; 
20
	background-color: #eee; 
21
	padding:15px; 
22
	overflow: hidden; 
23
} 
24
 
25
	#main { 
26
		width: 490px; 
27
		float: left; 
28
	} 
29
	 
30
		#main table { 
31
			width: 480px; 
32
		} 
33
		 
34
			#main table th { 
35
				padding: 10px; 
36
				background-color: #48577D; 
37
				color: #fff; 
38
				text-align: left; 
39
			} 
40
			 
41
			#main table td { 
42
				padding: 5px; 
43
			} 
44
			 
45
			#main table tr { 
46
				background-color: #d3dcf2; 
47
			} 
48
	 
49
	#sidebar { 
50
		width: 200px; 
51
		float: left; 
52
	}

Шаг 6

Прежде чем извлечь продукт из базы данных, давайте удалим последние две строки из нашей таблицы (были нужны только для того, чтобы увидеть, как она будет выглядеть). Удалить это:

1
 
2
		    <tr> 
3
	        <td>Product 1</td> 
4
	        <td>Some random description</td> 
5
	        <td>15 $</th> 
6
	        <td><a href="#">Add to cart</a></td> 
7
	    </tr> 
8
	     <tr> 
9
	        <td>Product 2</td> 
10
	        <td>Some random description</td> 
11
	        <td>25 $</th> 
12
	        <td><a href="#">Add to cart</a></td> 
13
	    </tr>

Отлично! Теперь в том месте, где были строки таблицы, введите следующий код PHP:

1
 
2
	<?php 
3
 
4
	$sql="SELECT * FROM products ORDER BY name ASC"; 
5
	$query=mysql_query($sql); 
6
	 
7
	while ($row=mysql_fetch_array($query)) { 
8
		 
9
?> 
10
		<tr> 
11
		    <td><?php echo $row['name'] ?></td> 
12
		    <td><?php echo $row['description'] ?></td> 
13
		    <td><?php echo $row['price'] ?>$</td> 
14
		    <td><a href="index.php?page=products&action=add&id=<?php echo $row['id_product'] ?>">Add to cart</a></td> 
15
		</tr> 
16
<?php 
17
		 
18
	} 
19
 
20
?>
  1. Итак, сначала мы используем SELECT для извлечения продуктов, затем перебираем каждую строку из базы данных и переводим её на страницу в строке таблицы.
  2. Вы видите, что anchor ссылается на ту же страницу (когда пользователь выбирает продукт, добавляя в корзину/сеанс). Мы передаём некоторые дополнительные переменные, такие как id продукта.

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



Шаг 7

Давайте сделаем anchor работу, добавив следующий код в начало нашей страницы:

1
 
2
<?php 
3
 
4
	if(isset($_GET['action']) && $_GET['action']=="add"){ 
5
		 
6
		$id=intval($_GET['id']); 
7
		 
8
		if(isset($_SESSION['cart'][$id])){ 
9
			 
10
			$_SESSION['cart'][$id]['quantity']++; 
11
			 
12
		}else{ 
13
			 
14
			$sql_s="SELECT * FROM products 

15
				WHERE id_product={$id}"; 
16
			$query_s=mysql_query($sql_s); 
17
			if(mysql_num_rows($query_s)!=0){ 
18
				$row_s=mysql_fetch_array($query_s); 
19
				 
20
				$_SESSION['cart'][$row_s['id_product']]=array( 
21
						"quantity" => 1, 
22
						"price" => $row_s['price'] 
23
					); 
24
				 
25
				 
26
			}else{ 
27
				 
28
				$message="This product id it's invalid!"; 
29
				 
30
			} 
31
			 
32
		} 
33
		 
34
	} 
35
 
36
?>
  1. Если переменная GET, называемая action, установлена и её значение равно ADD, мы выполняем код.
  2. Мы удостоверяемся, что id, прошедший через переменную GET, является целым числом
  3. Если id продукта находится в корзине SESSION, мы просто увеличиваем его количество на 1
  4. Если id не находится в сеансе, нам нужно убедиться, что id, прошедший через переменную GET, существует в базе данных. Если да, мы берем цену и создаём сессию. Если это не так, мы устанавливаем переменную с именем message, которая будет содержать нашу ошибку.

Проверим, установлена ли эта переменная сообщения и вызовите её на страницу (введите этот код под заголовком страницы H1):

1
 
2
		<?php 
3
		if(isset($message)){ 
4
			echo "<h2>$message</h2>"; 
5
		} 
6
	?>

Вот полная страница products.php.

1
 
2
<?php 
3
 
4
	if(isset($_GET['action']) && $_GET['action']=="add"){ 
5
		 
6
		$id=intval($_GET['id']); 
7
		 
8
		if(isset($_SESSION['cart'][$id])){ 
9
			 
10
			$_SESSION['cart'][$id]['quantity']++; 
11
			 
12
		}else{ 
13
			 
14
			$sql_s="SELECT * FROM products 

15
				WHERE id_product={$id}"; 
16
			$query_s=mysql_query($sql_s); 
17
			if(mysql_num_rows($query_s)!=0){ 
18
				$row_s=mysql_fetch_array($query_s); 
19
				 
20
				$_SESSION['cart'][$row_s['id_product']]=array( 
21
						"quantity" => 1, 
22
						"price" => $row_s['price'] 
23
					); 
24
				 
25
				 
26
			}else{ 
27
				 
28
				$message="This product id it's invalid!"; 
29
				 
30
			} 
31
			 
32
		} 
33
		 
34
	} 
35
 
36
?> 
37
	<h1>Product List</h1> 
38
	<?php 
39
		if(isset($message)){ 
40
			echo "<h2>$message</h2>"; 
41
		} 
42
	?> 
43
	<table> 
44
		<tr> 
45
			<th>Name</th> 
46
			<th>Description</th> 
47
			<th>Price</th> 
48
			<th>Action</th> 
49
		</tr> 
50
		 
51
		<?php 
52
		 
53
			$sql="SELECT * FROM products ORDER BY name ASC"; 
54
			$query=mysql_query($sql); 
55
			 
56
			while ($row=mysql_fetch_array($query)) { 
57
				 
58
		?> 
59
			<tr> 
60
			    <td><?php echo $row['name'] ?></td> 
61
			    <td><?php echo $row['description'] ?></td> 
62
			    <td><?php echo $row['price'] ?>$</td> 
63
			    <td><a href="index.php?page=products&action=add&id=<?php echo $row['id_product'] ?>">Add to cart</a></td> 
64
			</tr> 
65
		<?php 
66
				 
67
			} 
68
		 
69
		?> 
70
		 
71
	</table>

 Вот сообщение об ошибке, если id недействителен



Шаг 8

Вернёмся к index.php и пропишем sidebar. Добавьте следующий код:

1
 
2
	<h1>Cart</h1> 
3
	<?php 
4
	 
5
		if(isset($_SESSION['cart'])){ 
6
			 
7
			$sql="SELECT * FROM products WHERE id_product IN ("; 
8
			 
9
			foreach($_SESSION['cart'] as $id => $value) { 
10
				$sql.=$id.","; 
11
			} 
12
			 
13
			$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
14
			$query=mysql_query($sql); 
15
			while($row=mysql_fetch_array($query)){ 
16
				 
17
			?> 
18
				<p><?php echo $row['name'] ?> x <?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?></p> 
19
			<?php 
20
				 
21
			} 
22
		?> 
23
			<hr /> 
24
			<a href="index.php?page=cart">Go to cart</a> 
25
		<?php 
26
			 
27
		}else{ 
28
			 
29
			echo "<p>Your Cart is empty. Please add some products.</p>"; 
30
			 
31
		} 
32
	 
33
	?>
  1. Сначала проверим, установлен ли сеанс корзины. Если нет, мы выводим сообщение, предупреждая пользователя о том, что корзина пуста.
  2. Затем создаём mysql SELECT, но мы выбираем только те продукты, которые присутствуют в этом сеансе. Для этого используем функцию foreach. Итак, мы проходим цикл и добавляем идентификатор продукта в SELECT. Затем мы используем функцию substr для удаления последней запятой из SELECT.
  3. В конце выводим данные в браузер.

Посмотрите на картинку снизу:



Поскольку index.php является шаблоном для всех файлов, sidebar также будет виден в cart.php. Разве это не круто ?!


Шаг 9

Наконец, откройте cart.php и введите код:

1
 
2
<h1>View cart</h1> 
3
<a href="index.php?page=products">Go back to products page</a> 
4
<form method="post" action="index.php?page=cart"> 
5
     
6
	<table> 
7
	     
8
		<tr> 
9
		    <th>Name</th> 
10
		    <th>Quantity</th> 
11
		    <th>Price</th> 
12
		    <th>Items Price</th> 
13
		</tr> 
14
		 
15
		<?php 
16
		 
17
			$sql="SELECT * FROM products WHERE id_product IN ("; 
18
					 
19
					foreach($_SESSION['cart'] as $id => $value) { 
20
						$sql.=$id.","; 
21
					} 
22
					 
23
					$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
24
					$query=mysql_query($sql); 
25
					$totalprice=0; 
26
					while($row=mysql_fetch_array($query)){ 
27
						$subtotal=$_SESSION['cart'][$row['id_product']]['quantity']*$row['price']; 
28
						$totalprice+=$subtotal; 
29
					?> 
30
						<tr> 
31
						    <td><?php echo $row['name'] ?></td> 
32
						    <td><input type="text" name="quantity[<?php echo $row['id_product'] ?>]" size="5" value="<?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?>" /></td> 
33
						    <td><?php echo $row['price'] ?>$</td> 
34
						    <td><?php echo $_SESSION['cart'][$row['id_product']]['quantity']*$row['price'] ?>$</td> 
35
						</tr> 
36
					<?php 
37
						 
38
					} 
39
		?> 
40
					<tr> 
41
					    <td colspan="4">Total Price: <?php echo $totalprice ?></td> 
42
					</tr> 
43
		 
44
	</table> 
45
	<br /> 
46
	<button type="submit" name="submit">Update Cart</button> 
47
</form> 
48
<br /> 
49
<p>To remove an item, set it's quantity to 0. </p>

Он похож на код из index.php и products.php, поэтому я не буду объяснять всё снова. Вы заметили, что количество теперь отображается не в форме, а в поле ввода (чтобы мы могли изменять количество). Кроме того, таблица заключена в form tag. Чтобы получить общую стоимость элементов, мы умножаем количество конкретного продукта (из сеанса) id на его цену. Это повторяется в каждом цикле.

ПРИМЕЧАНИЕ: input  - это массив, key - это id продукта, а quantity  - значение количества.



Шаг 10

Наконец, нам нужно заставить форму работать. Поэтому добавьте этот код в начало страницы cart.php.

1
 
2
if(isset($_POST['submit'])){ 
3
 
4
foreach($_POST['quantity'] as $key => $val) { 
5
	if($val==0) { 
6
		unset($_SESSION['cart'][$key]); 
7
	}else{ 
8
		$_SESSION['cart'][$key]['quantity']=$val; 
9
	} 
10
} 
11
 
12
}
  1. Сначала проверяем, была ли предоставлена форма. Если была и значение ввода было равно нулю, мы отменяем этот сеанс.
  2. Если было любое другое значение, вместо него мы указываем количество.

Вот заполненный cart.php

1
 
2
	<?php 
3
 
4
	if(isset($_POST['submit'])){ 
5
		 
6
		foreach($_POST['quantity'] as $key => $val) { 
7
			if($val==0) { 
8
				unset($_SESSION['cart'][$key]); 
9
			}else{ 
10
				$_SESSION['cart'][$key]['quantity']=$val; 
11
			} 
12
		} 
13
		 
14
	} 
15
 
16
?> 
17
 
18
<h1>View cart</h1> 
19
<a href="index.php?page=products">Go back to the products page.</a> 
20
<form method="post" action="index.php?page=cart"> 
21
     
22
	<table> 
23
	     
24
		<tr> 
25
		    <th>Name</th> 
26
		    <th>Quantity</th> 
27
		    <th>Price</th> 
28
		    <th>Items Price</th> 
29
		</tr> 
30
		 
31
		<?php 
32
		 
33
			$sql="SELECT * FROM products WHERE id_product IN ("; 
34
					 
35
					foreach($_SESSION['cart'] as $id => $value) { 
36
						$sql.=$id.","; 
37
					} 
38
					 
39
					$sql=substr($sql, 0, -1).") ORDER BY name ASC"; 
40
					$query=mysql_query($sql); 
41
					$totalprice=0; 
42
					while($row=mysql_fetch_array($query)){ 
43
						$subtotal=$_SESSION['cart'][$row['id_product']]['quantity']*$row['price']; 
44
						$totalprice+=$subtotal; 
45
					?> 
46
						<tr> 
47
						    <td><?php echo $row['name'] ?></td> 
48
						    <td><input type="text" name="quantity[<?php echo $row['id_product'] ?>]" size="5" value="<?php echo $_SESSION['cart'][$row['id_product']]['quantity'] ?>" /></td> 
49
						    <td><?php echo $row['price'] ?>$</td> 
50
						    <td><?php echo $_SESSION['cart'][$row['id_product']]['quantity']*$row['price'] ?>$</td> 
51
						</tr> 
52
					<?php 
53
						 
54
					} 
55
		?> 
56
					<tr> 
57
					    <td colspan="4">Total Price: <?php echo $totalprice ?></td> 
58
					</tr> 
59
		 
60
	</table> 
61
	<br /> 
62
	<button type="submit" name="submit">Update Cart</button> 
63
</form> 
64
<br /> 
65
<p>To remove an item set its quantity to 0. </p>

Надеюсь, урок вам понравился. Если появятся вопросы, посмотрите более подробный видеоурок!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.