我正在使用一个表格,供用户通过我的网站预订假期住宿,预订详细信息包括公寓,入住,退房日期和使用日期区分功能计算的总天数。我还使用for循环在签入日期和签出日期之间进行迭代,然后在其中生成一系列日期。问题是,当我对mysql执行插入查询时,只有范围内的结束日期才插入数据库表中。我的目标是将整个范围插入mysql,以便我禁用已在日期选择器上预订的日期。有人可以告诉我我在做什么错,请参阅下面的代码。
我已经尝试使用日期期限对象,并在phpmyadmin中探索了日期范围字段的所有数据类型。
我还尝试过使用单独的表格作为日期范围
if(isset($_POST['apmt'])){
$value = $_POST['apmt'];
$ds = $_POST['ds'];
$de = $_POST['de'];
$d = $_POST['d'];
try{
$dateb = $de;
$datea = $ds;
for ($i = $datea; $i <= $dateb; $i++)
{
$dr = date("Y-m-d", strtotime($i));
}
$query = "INSERT INTO bookings SET apmt = :apmt, dateStart = :dateStart, dateEnd = :dateEnd, dateRange = :dateRange, totalDays = :totalDays, date = NOW(), clientID = '".$_SESSION['ID']."' ";
$s = $pdo->prepare($query);
$s->bindvalue(":apmt", $value);
$s->bindvalue(":dateStart", $ds);
$s->bindvalue(":dateEnd", $de);
$s->bindvalue(":dateRange", $dr);
$s->bindvalue(":totalDays", $d);
$s->execute();
$id = $pdo->lastInsertId();
if($id > 0 ){
$table = "";
$table .= '<table style="text-align:center;width:100%;margin:auto"><tr><th>APARTMENT</th><th>DATE START</th><th>DATE END</th><th>DAYS</th></tr>';
$table .= '<tr><td>' .$value. '</td>';
$table .= '<td>' .$ds. '</td>';
$table .= '<td>' .$de. '</td>';
$table .= '<td>' .$d. '</td>';
$table .= '</tr></table>';
echo $table ."</br>";
}
}
catch (PDOException $e) {
$output = "Unable to connect to database server" . $e->getMessage();
echo "$output";
exit();
}
}
答案 0 :(得分:1)
因此,您定义的问题来自for
循环,产生了意外结果,您需要在每次迭代后重新分配$br
的值,这就是循环完成时,将最后的日期存储在$br
中。
我建议以下解决方案,因为这将是以后最容易操作并为您提供最干净的代码。通过用 Array 替换$br
,您可以在每次迭代后向其追加一个项目。插入数据库时,使用 implode 函数可让您以所需的方式对其进行字符串化,而无需使用hacky字符串操作。
$dr = [];
for ($i = $datea; $i <= $dateb; $i++)
{
array_push($dr, date("Y-m-d", strtotime($i)));
}
现在,当您要插入表中时,请按以下方式引用数组:
$drString = implode(',', $dr) # (String) "date,date,date,date"
在问题中稍有提示的情况下,如果使用的是SQL Date模式,则存储范围不是默认值。因此,存储为文本或 Varchar 可能是您的最佳选择,然后遍历范围字符串(“日期,日期,日期”)并创建一个新的<每个爆炸字符串的strong> Date PHP对象。