【发布时间】:2015-10-28 12:57:56
【问题描述】:
我正在运行这个 PDO 查询:
$sql['check_for_existing_rates'] = 'SELECT * FROM rates_table where '
. 'listing_id = :listing_id AND '
. 'start_date = :start_date AND '
. 'end_date = :end_date';
[编辑] 因此,例如,我检查夏季数组中的日期是否存在于特定 Listing_id 的 rates_table 中:
SELECT * FROM rates_table where start_date = '2015-04-15' AND end_date= '2014-12-14' AND listing_id = 1;
[编辑] 我通过 start_date、end_date 和 listing_id 查询 rate_table,因为一个列表可以并且确实有多个费率,其中 rate_id 是主键。如果为特定的 start_date/end_date 跨度定义了费率,那么我不希望更新该费率。
[编辑]
foreach($rates as rate){
//use the agent_listing_id to get my listing_id
foreach($rates['agent_rate_data'] as $rate_array){
$stmt = $db->query($sql['check_for_existing_rates'],array('listing_id'=>$listing_id,
'start_date'=>$rate_array['start_date'],
'end_date'=>$rate_array['end_date']));
if(!$stmt->fetchAll()){
//Insert a record
}else{
//log that the record already exist and move onto the next rate period
}
} //end foreach rate_array
}//end foreach $rates
我检查选择查询中的日期是否返回结果,然后根据该结果不执行任何操作或插入数据库记录。
这是查询函数:
function query($sql,$input_parameters = null, &$insert_id = null){
$pdo = $this->getPDO();
$insert_id = null;
if(is_null($input_parameters)){
$stmt = $pdo->query($sql);
//echo $sql;
}else{
$stmt = $pdo->prepare($sql);
//echo $sql;
//var_dump($input_parameters);
$stmt->execute($input_parameters);
}
if(stripos($sql,'insert')=== 0){
$insert_id = $pdo->lastInsertId();
}
return $stmt;
}
Rates 是一个速率数组的数组,如下所示:
Array
(
[agent_villa_title] => Lovely Villa
[agent_villa_id] => 1234
[agent_villa_currency] => USD
[agent_rate_data] => Array
(
[summer] => Array
(
[title_1] => Summer 2015
[start_date] => 2015-04-15
[end_date] => 2015-12-14
[nightly_rate] => 400
[nightly_rate_weekend] => 400
[weekly_rate] => 2800
[ctime] => 2015-10-28 14:18:28
[mtime] => 0000-00-00 00:00:00
[active] => 1
[min_stay] => 5
[updated_by_feed] => 1
)
[winter_0] => Array
(
[title_1] => Winter 2016
[start_date] => 2015-12-15
[end_date] => 2015-12-19
[nightly_rate] => 600
[nightly_rate_weekend] => 600
[weekly_rate] => 4200
[ctime] => 2015-10-28 14:18:28
[mtime] => 0000-00-00 00:00:00
[active] => 1
[min_stay] => 7
[updated_by_feed] => 1
)
[christmas] => Array
(
[title_1] => Christmas and New Year 2016
[start_date] => 2015-12-20
[end_date] => 2016-01-10
[nightly_rate] => 0
[nightly_rate_weekend] => 0
[weekly_rate] => 0
[ctime] => 2015-10-28 14:18:28
[mtime] => 0000-00-00 00:00:00
[active] => 1
[min_stay] => 14
[updated_by_feed] => 1
)
[winter_1] => Array
(
[title_1] => Winter 2016
[start_date] => 2016-01-11
[end_date] => 2016-04-14
[nightly_rate] => 600
[nightly_rate_weekend] => 600
[weekly_rate] => 4200
[ctime] => 2015-10-28 14:18:28
[mtime] => 0000-00-00 00:00:00
[active] => 1
[min_stay] => 7
[updated_by_feed] => 1
)
)
)
上面的 db 查询总是为 [summer] 元素返回一个空的结果数组。
- 每个元素的开始日期和结束日期始终相同。
- 当我在数据库中手动运行夏季日期时,查询会找到夏季记录。
- 如果我重新排序 $rates 数组,使 [summer] 不是第一个元素;查询仍然返回 [summer] 的空数组。
这让我头疼。 有什么建议么? 干杯
【问题讨论】:
-
请向我们提供示例数据和您尝试运行的确切查询。请注意,日期不是您拥有的唯一选择标准,您还有一个 listing_id。
-
和 $listing_id 来自 .... ?
-
^ 这令人困惑。如果您要传递 ID,为什么要将日期添加到查询中?正如你所说,它们的日期都一样?
-
只是猜测,您的意思可能是:
foreach($rates as $listing_id=>$rate_array){ -
首先将其缩小到一个具体的 SQL 查询,您可以使用 phpmyadmin 或 mysql 命令行客户端或其他任何方式直接在数据库上运行该查询。这完全是关于数据库、它包含的数据和您的具体查询。代码太多,具体值太少。