php - 如何从 PHP/MySQL 中检索逗号分隔的值?
问题描述
目前我正在一个电子商务网站上工作,并且我已经成功地将动态多选下拉值插入到带有 implode 的数据库中。他们看起来像2, 3, 4
。
现在我想检索那些没有逗号和空格的值并将它们显示为按钮,我尝试使用 explode 但它不起作用。
这是我的表:
这是我用来插入大小值的代码
// Inserting Multiple Sizes into Database
$tshirt_sizes_array = array();
foreach($_POST['t_size'] as $key=>$value){
$tshirt_sizes_array[].= $value;
$tshirt_sizes = implode(', ', $tshirt_sizes_array);
}
现在我想用explode检索这些值,但它不起作用,下面是我用来检索大小值的代码
while($row = mysqli_fetch_array($run_get_sizes)){
$pr_sizes = explode(", ", $row['size_title']);
}
如果字段中存储了单个大小,它只会检索该值。像2
or 3
,并且当有多个值 as 时不起作用2, 3, 4
。
任何帮助将不胜感激!
更新
我的 SQL 查询:
$t_sizes = $row_t['tshirt_size'];
$get_sizes = "SELECT * FROM tshirt_sizes WHERE size_id = $t_sizes";
while($row_t4 = mysqli_fetch_array($run_get_sizes)){
$pr_sizes = $row_t4['size_title'];
}
获取 T 恤型号代码
function get_tshirt_modal(){
global $conn;
$get_t = "SELECT * FROM tshirts ORDER BY RAND() LIMIT 0,6";
$run_t = mysqli_query($conn, $get_t);
while($row_t = mysqli_fetch_array($run_t)){
$t_id = $row_t['tshirt_id'];
$t_name = $row_t['tshirt_title'];
$t_price = $row_t['tshirt_price'];
$t_sale_price = $row_t['tshirt_sale_price'];
$t_pre_1 = $row_t['tshirt_preview1'];
$t_pre_2 = $row_t['tshirt_preview2'];
$t_status = $row_t['tshirt_status'];
$t_desc = $row_t['tshirt_desc'];
$t_cat = $row_t['tshirt_category'];
$t_sizes = $row_t['tshirt_size'];
$get_status = "SELECT * FROM product_status WHERE p_status_id = $t_status";
$run_get_status = mysqli_query($conn, $get_status);
$get_cat = "SELECT * FROM tshirt_categories WHERE tshirt_category_id = $t_cat";
$run_get_cat = mysqli_query($conn, $get_cat);
$get_sizes = "SELECT * FROM tshirt_sizes WHERE size_id IN($t_sizes)";
$run_get_sizes = mysqli_query($conn, $get_sizes);
while($row_t2 = mysqli_fetch_array($run_get_status)){
$pr_status = $row_t2['p_status_title'];
$pr_status_lowercase = strtolower($pr_status);
while($row_t3 = mysqli_fetch_array($run_get_cat)){
$pr_cat = $row_t3['tshirt_category_title'];
while($row_t4 = mysqli_fetch_array($run_get_sizes)){
$pr_sizes = $row_t4['size_title'];
foreach($pr_sizes as $key=>$value){
echo "<div class='modal fade product-modal' id='productModal$t_id' tabindex='-1' role='dialog' aria-hidden='true'>
<div class='modal-dialog' role='document'>
<div class='modal-content'>
<div class='modal-body'>
<button type='button' class='close custom-close' data-dismiss='modal' aria-label='Close'>
<span aria-hidden='true'><i class='dl-icon-close'></i></span>
</button>
<div class='row'>
<div class='col-md-6'>
<div class='product-image-carousel nav-vertical-center nav-style-1'>
<div class='product-image'>
<div class='product-image--holder'>
<a href='product-details.php?t_id=$t_id'>
<img src='images/tshirt_preview_images/$t_pre_1' alt='Product Image' class='primary-image'>
</a>
</div>";
if (!empty($pr_status_lowercase == 'none')) {
// Don't Show Any Badge
}else{
echo "<span class='product-badge $pr_status_lowercase'>$pr_status</span>";
}
echo "</div>
</div>
</div>
<div class='col-md-6'>
<div class='modal-box product-summary'>
<h3 class='product-title mb--15'>$t_name</h3>
<span class='product-price-wrapper mb--20'>
<span class='money'>₹$t_sale_price</span>
<span class='product-price-old'>
<span class='money'>₹$t_price</span>
</span>
</span>
<div class='product-action d-flex flex-row align-items-center mb--30' style='margin-top:15px'>
<div class='quantity'>
<input type='number' class='quantity-input' name='qty' id='qty' value='1' min='1'>
</div>
<button type='button' class='btn btn-style-1 btn-semi-large add-to-cart'
onclick='window.location.href='cart.php''>
Add To Cart
</button>
<a href='wishlist.php?t_id=$t_id'><i class='dl-icon-heart2'></i></a>
</div>
<p class='product-short-description mb--25 mb-md--20'>$t_desc</p>
<div class='product-meta float-left'>
<span class='sku_wrapper font-size-12'>Tags -
<a href='shop-sidebar.html' rel='tag'>Style Blogger </a>
<a href='shop-sidebar.html' rel='tag'>Style </a>
<a href='shop-sidebar.html' rel='tag'>Trending</a>
</span>
<span class='posted_in font-size-12'>Category -
<a href='shop-sidebar.php' rel='tag'>$pr_cat</a>
</span>
<span class='posted_in font-size-12'>Available Sizes -
<a href='shop-sidebar.php' rel='tag'>$value</a>
</span>
</div>
<div class='product-share-box float-right'>
<span class='font-size-12'>Let's Vibe Humanity</span>
<!-- Social Icons Start Here -->
<ul class='social social-small'>
<li class='social__item'>
<a href='https://facebook.com' class='social__link'>
<i class='fa fa-facebook'></i>
</a>
</li>
<li class='social__item'>
<a href='https://twitter.com' class='social__link'>
<i class='fa fa-twitter'></i>
</a>
</li>
<li class='social__item'>
<a href='https://plus.google.com' class='social__link'>
<i class='fa fa-google-plus'></i>
</a>
</li>
<li class='social__item'>
<a href='https://plus.google.com' class='social__link'>
<i class='fa fa-pinterest-p'></i>
</a>
</li>
</ul>
<!-- Social Icons End Here -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>";}
}
}
}
}
}
更新决赛
伙计们,这是工作代码
$availableSizeArr = [];
while($row_t4 = mysqli_fetch_array($run_get_sizes)){
$pr_sizes = $row_t4['size_title'];
$availableSizeArr[] = "<a href='shop-sidebar.php' rel='tag'>$pr_sizes</a>";
}
$availableSizes = implode(', ', $availableSizeArr);
非常感谢@biesior 的帮助!
解决方案
正如评论中提到的其他人一样,您应该考虑重组数据库以使其正常化。
一个与您非常接近的解决方案是使用 SET 数据类型(它在 MySQL/MariaDB 中可用,当您有一组固定的值要存储时,它对于像您这样的情况非常有用)。方法如下:
CREATE TABLE shirts(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
sizes SET("XS", "S", "M", "L", "XL", "XXL", "XXXL")
);
INSERT INTO shirts(name, sizes) VALUES
("shirt1", "S,M,L"),
("shirt2", "L,XL"),
("shirt3", "M");
SELECT * FROM shirts;
+----+--------+-------+
| id | name | sizes |
+----+--------+-------+
| 1 | shirt1 | S,M,L |
| 2 | shirt2 | L,XL |
| 3 | shirt3 | M |
+----+--------+-------+
以这种方式管理它要容易得多,并且在存储方面非常有效。是的,它离你已经拥有的代码也不远了!而且您根本不需要“动态尺寸表”表 - 所有内容都存储在 tshirts 表中。我的建议是基于您永远不会添加新 T 恤尺寸的假设——它们始终是一个固定的集合(就像您将来永远不会添加“XXXXXXXXL”一样)。最后——在里面搜索真的很简单。例如,如果用户只想搜索尺寸为“M”的衬衫,您可以像这样获取列表:
SELECT * FROM shirts
WHERE FIND_IN_SET("M", sizes)>0;
如果您必须有动态的 T 恤尺寸,那么您应该在尺寸表和衬衫表之间建立 M:M 关系。可以这样做:
CREATE TABLE shirts_sizes(
size_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
size_title VARCHAR(5)
);
INSERT INTO shirts_sizes(size_title) VALUES
("XS"),("S"),("M"),("L"),("XL"),("XXL"),("XXXL");
CREATE TABLE shirts(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
INSERT INTO shirts(name) VALUES
("shirt1"),
("shirt2"),
("shirt3");
CREATE TABLE shirts_sizes_availability(
size_id INT NOT NULL,
shirt_id INT NOT NULL,
PRIMARY KEY(size_id, shirt_id),
FOREIGN KEY(size_id) REFERENCES shirts_sizes(size_id),
FOREIGN KEY(shirt_id) REFERENCES shirts(id)
);
INSERT INTO shirts_sizes_availability(shirt_id,size_id) VALUES
(1,2),(1,3),(1,4),(2,4),(2,5),(3,3);
请注意,现在我们在连接表的单独行中插入特定的衬衫尺寸,而不是用逗号值分隔。以下是稍后提取它们的方法:
SELECT shirts.id, shirts.name, shirts_sizes.size_title
FROM shirts
JOIN shirts_sizes_availability
ON shirts.id = shirts_sizes_availability.shirt_id
JOIN shirts_sizes
ON shirts_sizes_availability.size_id = shirts_sizes.size_id;
+----+--------+------------+
| id | name | size_title |
+----+--------+------------+
| 1 | shirt1 | S |
| 1 | shirt1 | M |
| 1 | shirt1 | L |
| 2 | shirt2 | L |
| 2 | shirt2 | XL |
| 3 | shirt3 | M |
+----+--------+------------+
根据前面的示例,如果您只搜索尺寸为“M”的衬衫,则可以在此处轻松添加 WHERE 子句。如果你想像前面的例子一样将它们以逗号分隔,你可以像这样使用 GROUP_CONCAT:
SELECT shirts.id, shirts.name, GROUP_CONCAT(shirts_sizes.size_title) AS sizes
FROM shirts
JOIN shirts_sizes_availability
ON shirts.id = shirts_sizes_availability.shirt_id
JOIN shirts_sizes
ON shirts_sizes_availability.size_id = shirts_sizes.size_id
GROUP BY shirts.id;
+----+--------+-------+
| id | name | sizes |
+----+--------+-------+
| 1 | shirt1 | S,M,L |
| 2 | shirt2 | L,XL |
| 3 | shirt3 | M |
+----+--------+-------+
尽管我在上面说了所有这些,但我不明白为什么爆炸不起作用。这是一个可以正常工作的简化示例:
//You should have fetched that string from the DB
$row['size_title'] = "S,L,XL";
//Now I explode it
$pr_sizes = explode(",", $row['size_title']);
//And each element is stored correctly
echo $pr_sizes[0]."<br />"; //prints "S"
echo $pr_sizes[1]."<br />"; //prints "L"
echo $pr_sizes[2]; //prints "XL"
推荐阅读
- java - 测试中未调用方法拦截器
- static - mypy TypeVar 包括绑定类以及子类
- java - Swagger - Jersey - Tomcat(无法生成 swagger.json,显示 404:未找到)
- firebase - 向新用户发送欢迎邮件(flutter web)
- python - 我想将属于同一类的点绘制在一起
- c# - 是否可以仅使用 REST API 为一个站点获取仅限 SharePoint 应用程序的主体?
- python - 仅打印以 .jpg 扩展名结尾的链接?
- microsoft-dynamics - D365FO 使用 API 导入 AAD 用户
- c# - Linq Orderby 与自身进行比较。为什么?
- excel - VBA将递增值添加到组合框中