我希望我忽略了一些简单的事情,并且我没有以如此疯狂和复杂的方式写出这些内容,以至于我无法实现我想要的目标。
我为PHP混入的巨大混乱道歉。我的计划是在我能够开展工作之后将我能做的事情分开。这是我写的第三个应用程序,所以我仍在学习基础知识,可能是写意大利面条代码。 这是我正在使用的查询,它将根据另一个查询的结果进一步改变代码而改变。
我想查看选择并发送到$_POST
此页面的日期是否已经在用户的购物车即行程中。
<?php foreach($unique as $ukey => $uval) : ?>
<?php
// regular query to search for all room bookings
try {
$sqlSlctAll = "SELECT * FROM dates_booked
INNER JOIN rooms
WHERE rooms.id = dates_booked.room_num
AND rooms.name = '$uval'
GROUP BY rooms.id
";
// using group by here will not return all booked days
$slctStmtAll = $dsn->prepare($sqlSlctAll);
$slctStmtAll->execute();
$allResults = $slctStmtAll->fetchAll(PDO::FETCH_ASSOC);
foreach ($allResults as $allrow) {
$uValArray[] = [
'id' => $allrow['id'],
'name' => $allrow['name'],
'price' => $allrow['price'],
'dateStart' => $allrow['dateStart'],
'dateEnd' => $allrow['dateEnd']
];
}
// header('Content-type: application/json');
} catch (PDOException $e) {
echo 'Error selecting dates: ' . $e->getMessage();
}
?>
这就是我开始迷惑的地方。发生的事情是如果$_SESSION['shopping_cart']
中只有一个项目,我试图创建的表格就好了。对于之后的每个项目,我添加到购物车,它首先比较首先查看日期范围是否已经在会话数组中,然后购物车'id'是否与数据库中房间的id匹配。因此,对于第一次迭代,它可能返回true或false,然后在下一次迭代中返回相反的内容,并在我的表中添加额外的<td>
。
<table class="table table-bordered">
<thead>
<tr>
<th>Room Name</th>
<th>Price Per Night</th>
<th>Room ID</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php foreach ($uValArray as $aRoom) : ?>
<form action="cart.php?id=<?php echo $aRoom['id']; ?>" method="post">
<tr>
<td><?php echo $aRoom['name']; ?></td>
<td>$<?php echo $aRoom['price']; ?></td>
<td><?php echo $aRoom['id']; ?></td>
<?php
if(isset($_SESSION['shopping_cart'])) {
foreach ($_SESSION['shopping_cart'] as $cart) {
if(
$chooseStart < $cart['dateEnd'] &&
$cart['dateStart'] < $chooseEnd &&
$aRoom['id'] == $cart['id']
) {
echo '<td><a href="cart.php">in your itinerary</a></td>';
} else {
echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
}
}
} else {
echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
}
?>
<input type="hidden" name="dateStart" value="<?php echo $chooseStart; ?>">
<input type="hidden" name="dateEnd" value="<?php echo $chooseEnd; ?>">
<input type="hidden" name="name" value="<?php echo $aRoom['name']; ?>">
<input type="hidden" name="price" value="<?php echo $aRoom['price']; ?>">
<input type="hidden" name="room_quantity" value="1">
</form>
<?php endforeach; ?>
</tbody>
</table>
<?php } ?>
如果我的购物车中有两件物品,我可以在我的'可用性搜索页面中找到它:
我感到非常难过,因为我想将$aRoom['id']
项目与$cart['id']
进行比较,但我无法弄清楚如何在不通过购物车的情况下进行操作。我不确定这是否有意义。
如果我在比较后取出else语句中的echo '<td>'
,它最终会给我我想要的表结构,减去我需要的实际'book_now'输入。
<table class="table table-bordered">
<thead>
<tr>
<th>Room Name</th>
<th>Price Per Night</th>
<th>Room ID</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php foreach ($uValArray as $aRoom) : ?>
<form action="cart.php?id=<?php echo $aRoom['id']; ?>" method="post">
<tr>
<td><?php echo $aRoom['name']; ?></td>
<td>$<?php echo $aRoom['price']; ?></td>
<td><?php echo $aRoom['id']; ?></td>
<?php
if(isset($_SESSION['shopping_cart'])) {
foreach ($_SESSION['shopping_cart'] as $cart) {
if(
$chooseStart < $cart['dateEnd'] &&
$cart['dateStart'] < $chooseEnd &&
$aRoom['id'] == $cart['id']
) {
echo '<td><a href="cart.php">in your itinerary</a></td>';
} else {
echo '';
}
}
} else {
echo '<td><input class="btn btn-success" type="submit" name="book_now" value="Book Now"></td>';
}
?>
<input type="hidden" name="dateStart" value="<?php echo $chooseStart; ?>">
<input type="hidden" name="dateEnd" value="<?php echo $chooseEnd; ?>">
<input type="hidden" name="name" value="<?php echo $aRoom['name']; ?>">
<input type="hidden" name="price" value="<?php echo $aRoom['price']; ?>">
<input type="hidden" name="room_quantity" value="1">
</form>
<?php endforeach; ?>
</tbody>
</table>
最终看起来像这样,这是我想要的,但使用输入按钮:
如果我需要澄清任何事情,请告诉我,我会尽力而为。我的一个问题是,我很难真正知道我的问题是什么,因为我还是初学者。我希望有人遇到类似的问题,并且知道我想问的是什么。
我尝试在MySQL查询中使用不同的GROUP BY
,但无济于事。但我很确定这与我的问题无关。我很确定我的问题是$aRoom
正在与购物车中的每个项目进行比较,我只想比较一次,但我无法弄清楚如何在不使用foreach循环的情况下进行比较{ {1}}。
修改
我试图在链接帖子中使用Barmar的建议,他提到“简单修改是使用一个跟踪你是否找到某个东西的变量,然后在循环结束时检查这个变量” 我目前正在尝试将变量设置为1或0,具体取决于if语句的计算方式。
这就是我所做的:
$_SESSION['shopping_cart']
我已经尝试将if(isset($_SESSION['shopping_cart'])) {;
foreach ($_SESSION['shopping_cart'] as $cart) {
if(
$chooseStart < $cart['dateEnd'] &&
$cart['dateStart'] < $chooseEnd &&
$aRoom['id'] == $cart['id']
) {
$info = 1;
} else {
$info = 0;
}
}
} else {
$info = 0;
}
if($info == 1) {
echo "<td><a href='cart.php'>in your itinerary</a></td>";
} else {
echo "<td><input class='btn btn-success' type='submit' name='book_now' value='Book Now'></td>";
}
逻辑放在if ($info == 1)
循环中的不同位置 - 循环结束后,就在它完成之前。在循环之后,它不返回每个值,因为它没有过滤循环的每次迭代。因此,只评估数组中的第一项。我想再次遍历会话数组。我试过了,在那时它没有用$ aRoom变量对另一个foreach循环进行评估。
我不希望任何人告诉我该怎么做,就像给我一些提示或其他东西一样。我想了解它,并且不想复制粘贴某人的代码。
任何人都可以给我一个提示,比如内置的PHP函数会有所帮助吗? PHP有许多数组函数。我尝试过array_diff,我试过获取array_column并使用它,尝试合并数组并从中获取唯一值。我目前正在研究foreach($_SESSION['shopping_cart']
。