php - 从会话数组 php 中获取单个元素以通过 MySQL SELECT 语句
问题描述
我正在尝试获取我的数组的单个元素(产品 ID),然后使用 MYSQLi SELECT 语句来获取有关产品的其他信息。我已将 print_r 用于测试目的,并且所有内容都正确存储在数组中。我只是不知道如何从 Session 变量中的嵌套数组中选择单个项目,然后使用它将其放入 SQL 语句中,然后循环显示这些项目,因为这是用于购物车的。
我也尝试使用 mysqli_fetch_array 和 mysqli_fetch_assoc 两种方式都出现错误这是我的代码:
if (isset($_GET['add'])) {
echo "true";
$pid = $_GET['add'];
$wasFound = false;
$i = 0;
// If the cart session variable is not set or cart array is empty
if (!isset($_SESSION['cart_array']) || count($_SESSION['cart_array']) < 1) {
// RUN IF THE CART IS EMPTY OR NOT SET
$_SESSION['cart_array'] = array(0 => array('item_id' => $pid, 'quantity' => 1));
} else {
// RUN IF THE CART HAS AT LEAST ONE ITEM IN IT
foreach ($_SESSION['cart_array'] as $each_item) {
$i++;
while (list($key, $value) = each($each_item)) {
if ($key == 'item_id' && $value == $pid) {
// That item is in cart already so let’s adjust its quantity using array_splice()
array_splice($_SESSION['cart_array'], $i-1, 1, array(array('item_id' => $pid, 'quantity' => $each_item['quantity'] + 1)));
$wasFound = true;
} // close if condition
} // close while loop
} // close foreach loop
if ($wasFound == false) {
array_push($_SESSION["cart_array"], array("item_id" => $pid, "quantity" => 1));
}
//print_r ($_SESSION["cart_array"]);
$sql = "SELECT * FROM `products` WHERE `productID` = '$pid'";
$result = mysqli_query(Database::dbConnect(),$sql);
while($row = mysqli_fetch_array($result)) {
$str = <<<EOD
<tbody>
<tr>
<td>{$row['productName']}</td>
<td>{$row['productID']}</td>
<td>'quantity'</td>
<td>{$row['price']}</td>
</tr>
</tbody>
EOD;
echo $str;
}
}
}
解决方案
尝试替换$was_found
为
$cart_product = null;
并替换你的for
循环和if
(相同的第一行):
foreach ($_SESSION['cart_array'] as $each_item) {
if ($each_item['item_id'] != $pid) {
continue;
}
$cart_product = $each_item;
}
if (isset($cart_product)) {
$cart_product['quantity']++;
} else {
$cart_product = array('item_id' => $pid, 'quantity' => 1);
array_push($_SESSION['cart_array'], $cart_product);
}
您不必遍历$each_item
. 如果您的格式是外部第一部分中显示的格式,则项目 ID 应该直接可用if
。
顺便说一句,如果您定义一个产品类而不是数组,这会容易得多。您可以拥有一个可以查询对象的购物车cart_product
对象。
然后更换
<td>'quantity'</td>
和
<td>{$cart_product['quantity']}</td>
我完全不清楚您的 SQL 查询与此有何关系。
与您的问题无关,但是
$pid = $_GET['add'];
其次是
$sql = "SELECT * FROM `products` WHERE `productID` = '$pid'";
非常不安全。请参阅如何防止 PHP 中的 SQL 注入?
推荐阅读
- javascript - 我可以在 React 中修改 CSS 伪元素吗?
- c++ - 我需要一些帮助来删除向量中的一些元素。或者也许交换 c++
- sql - PostGreSql 使用拥有 Max 子句获取两列的唯一组合
- regex - 如何评估由 Julia 中的正则表达式替换的函数?
- apache-kafka - 在可以确定分区位置之前,Kafka Connect Timeout 60000ms 已过期
- sql - 我可以在 PostgreSQL-12 中为范围分区添加相同的值吗?
- css - viserjs 图表即将出现不需要的计数 01
- snowflake-cloud-data-platform - SnowFlake - 表中是否有最大字段数?
- acumatica - PXException - 未完整显示电子邮件
- javascript - 当我按下我的模态类并单击我的平面列表中的一个新项目时,数据与我按下的第一个项目保持相同