【问题标题】:PHP: PDO select query does not return record that is in databasePHP:PDO 选择查询不返回数据库中的记录
【发布时间】: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 命令行客户端或其他任何方式直接在数据库上运行该查询。这完全是关于数据库、它包含的数据和您的具体查询。代码太多,具体值太少。

标签: php mysql arrays pdo


【解决方案1】:

您的帖子存在一些问题。

首先:您的问题是什么并不明显。特别是什么没有按预期工作?是否有没有返回您想要的函数调用?

另外,这让我觉得有点奇怪:

if(!$stmt->fetchAll()){
    //Insert a record
}else{
    //log that the record already exist and move onto the next rate period
}

不清楚你在这些条件句中做了什么。一旦你运行$stmt->fetchAll(),数据集已经被获取,你不能再次获取它。一般来说,除非您真的要使用fetchAll() 的结果,否则您应该选择不同的方式来查看是否存在任何结果。

【讨论】:

  • 嗨伊恩。谢谢回答。这是我的第一篇文章,我可以看到我需要努力提高自己的清晰度。我的问题是,当我检查我的数据库以获取我知道在那里的记录时,我一直得到一个查询日期跨度的空结果。我修好了它。我在 foreach($rate['agent_rate_array']) 之前运行了一个查询(应该把它放在我的帖子中),它正在删除未标记为由 feed 更新的未来费率,而我的 where 子句错误地删除了费率。我没有使用 fetchall() 结果:您能提出替代方案吗?
  • 好吧,如果您只想检查一行是否存在,您应该更改 SQL 查询以反映这一点。做一些类似$pdo->query('SELECT COUNT(*) FROM x')->fetchColumn(); 的事情,这样可以最大限度地减少获取/处理的数据量。
  • 至于您上面的问题,下次您应该尽量具体地说明您的要求或需要帮助的内容。不要用大量的随机花絮来混淆你的问题,也不要害怕回头纠正错误。您可以在帖子的任何位置添加/删除,因此不必总是附加新信息,而是返回并纠正错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多