繁体   English   中英

Cakephp、SQL 准备好的语句未返回正确的结果

[英]Cakephp, SQL prepared statement not returning proper results

好的,所以我是 cakephp 的新手,我有一个包含多个字段的搜索表单,并且我有一些在搜索表单中是可选的字段。 我要做的是在提交表单时检查这些字段是否不是 NULL 并将它们应用于我的 find('all') 查询。

这是我的ctp视图

<h2>IDX Listings</h2>
<?php echo $this->Form->create('Listing', array('action'=>'results')); ?>
<fieldset><legend>Location Criteria</legend>
    <?php echo $this->Form->input('listing_countyid', array('type'=>'select', 'options'=>$counties, 'default'=>'Richmond')); ?>
    <?php echo $this->Form->input('listing_area', array('type'=>'select', 'options'=>$areas)); ?>
    <?php echo $this->Form->input('listing_neighborhood', array('type'=>'select', 'options'=>$hoods)); ?>
    <?php echo $this->Form->input('listing_subdivision', array('type'=>'select')); ?>
</fieldset>
<fieldset><legend>Market</legend>
    <?php echo $this->Form->input('min_price', array('type'=>'select', 'options'=>$minPrices)); ?>
    <?php echo $this->Form->input('max_price', array('type'=>'select', 'options'=>$maxPrices)); ?>
    <?php echo $this->Form->input('listing_yearbuilt', array('type'=>'select', 'options'=>$years, 'label'=>'Built After')); ?>  
</fieldset>
<fieldset><legend>Size</legend>
    <?php echo $this->Form->input('min_rooms', array('type'=>'select', 'options'=>$minRooms)); ?>
    <?php echo $this->Form->input('max_rooms', array('type'=>'select', 'options'=>$maxRooms)); ?>
    <?php echo $this->Form->input('min_stories', array('type'=>'select', 'options'=>$stories, 'label'=>'Min Stories')); ?>
    <?php echo $this->Form->input('min_listing_sqfttotal', array('type'=>'select', 'options'=>$minSqft, 'label'=> 'Min Sq Ft'));
    <?php echo $this->Form->input('max_listing_sqfttotal', array('type'=>'select', 'options'=>$maxSqft, 'label'=> 'Max Sq Ft'));
?>
    <?php echo $this->Form->input('min_bathrooms', array('type'=>'select', 'options'=>$minBath, 'label'=>'Min Bathrooms')); ?>
    <?php echo $this->Form->input('max_bathrooms', array('type'=>'select', 'options'=>$maxBath, 'label'=>'Max Bathrooms')); ?>
    <?php echo $this->Form->input('min_bedrooms', array('type'=>'select', 'options'=>$minBed, 'label'=>'Min Bedrooms')); ?>
    <?php echo $this->Form->input('max_bedrooms', array('type'=>'select', 'options'=>$maxBed, 'label'=>'Max Bedrooms')); ?>
</fieldset>
<fieldset><legend>Options</legend>
    <?php echo $this->Form->input('heat_type', array('type'=>'select', 'options'=>$heat_type, 'label'=>'Heating System')); ?>
    <?php echo $this->Form->input('cool_type', array('type'=>'select', 'options'=>$cool_type, 'label'=>'Cooling System')); ?>
    <?php echo $this->Form->input('irrigation_system', array('type'=>'select', 'options'=>$irrigation_system, 'label'=>'Irrigation System')); ?>
    <?php echo $this->Form->input('handicap', array('type'=>'select', 'options'=>$handicap, 'label'=>'Handicap Equipped')); ?>
    <?php echo $this->Form->input('fireplace', array('type'=>'select', 'options'=>$fireplace, 'label'=>'Fireplace')); ?>
    <?php echo $this->Form->input('fence', array('type'=>'select', 'options'=>$fence, 'label'=>'Fenced')); ?>
    <?php echo $this->Form->input('level1_mstr', array('type'=>'select', 'options'=>$level1_mstr, 'default'=>'No', 'label'=>'1st Floor Master Bedroom')); ?>
    <?php echo $this->Form->input('level1_laundry', array('type'=>'select', 'options'=>$level1_laundry, 'default'=>'No', 'label'=>'1st Floor Laundry Room')); ?>
</fieldset>
    <?php echo $this->Form->submit('Search', array('target'=>"SearchResults", 'id'=>'submit')); ?>

标题为 Options 的字段集是可选字段 Optional 字段值设置为一个数组,其初始值为 NULL

这是我在 controller 中的搜索 function

function results() {
    if (!empty($this->data)) {

        $listings = $this->Idx->find('all', array(
            'conditions'=>array(
                'listing_countyid' => $this->data['Listing']['listing_countyid'],
                'listing_area' => $this->data['Listing']['listing_area'],
                'listing_neighborhood' => $this->data['Listing']['listing_neighborhood'],
                'listing_listprice >=' => $this->data['Listing']['min_price'],
                'listing_listprice <=' => $this->data['Listing']['max_price'],
                'listing_rooms >=' => $this->data['Listing']['min_rooms'],
                'listing_rooms <=' => $this->data['Listing']['max_rooms'],
                'listing_sqfttotal >=' => $this->data['Listing']['min_listing_sqfttotal'],
                'listing_sqfttotal <=' => $this->data['Listing']['max_listing_sqfttotal'],
                'listing_stories >=' => $this->data['Listing']['min_stories'],
                'listing_yearbuilt >=' => $this->data['Listing']['listing_yearbuilt'],
                'listing_bathstotal >=' => $this->data['Listing']['min_bathrooms'],
                'listing_bathstotal <=' => $this->data['Listing']['max_bathrooms'],
                'listing_bedrooms >=' => $this->data['Listing']['min_bedrooms'],
                'listing_bedrooms <=' => $this->data['Listing']['max_bedrooms'],
                'listing_roommasterbrlevel' => $this->data['Listing']['level1_mstr'],
                'listing_roomlaundrylevel' => $this->data['Listing']['level1_laundry'],
                'listing_heatsystem' => $this->data['Listing']['heat_type'],
                'listing_coolsystem' => $this->data['Listing']['cool_type'],
                'listing_irrigationsrc' => $this->data['Listing']['irrigation_system'],
                'listing_fireplaces' => $this->data['Listing']['fireplace'],
                'listing_handicap' => $this->data['Listing']['handicap'],
                'listing_fence' => $this->data['Listing']['fence']
            )
        ));
        $this->set('listings', $listings);
    }
}

如果我从我的 find() 查询中删除选项,我返回的结果是正确的,但是一旦我在视图中设置了一个值,我就不会返回正确的结果。 我知道 find() 准备语句后面的 SQL 语法是 SELECT * FROM table WHERE column_name AND column_name 等。但是传递 NULL 的值不会返回结果(返回错误的值或返回结果)。 我在 controller 中尝试了许多不同的方法,使用 OR 语句,但 OR 是为了概括并返回许多结果。

Is there a way to modify the SQL statement either in the Controller or in the my Model via the beforeFind() function (beforeFind is beyond my knowledge and its hard to find a solid example of it in use), or would I be better off检查值并修改 Model __construct() function 中的 SQL 语句

$conditions = array();
// it's a postback, so the key should exist
if($this->data['Listing']['listing_countyid'] !== '')
{
    $conditions['listing_countryid'] = $this->data['Listing']['listing_countyid'];
}
if($this->data['Listing']['listing_area'] !== '')
{
    $conditions['listing_area'] = $this->data['Listing']['listing_area'];
}
if($this->data['Listing']['listing_neighborhood'] !== '')
{
    $conditions['listing_neighborhood'] = $this->data['Listing']['listing_neighborhood'];
}
if($this->data['Listing']['min_price'] !== '')
{
    $conditions['listing_listprice >='] = $this->data['Listing']['min_price'];
}
if($this->data['Listing']['max_price'] !== '')
{
    $conditions['listing_listprice <='] = $this->data['Listing']['max_price'];
}

我相信您可以看到我在做什么,并且您应该能够为其他参数完成此操作。 然后,您可以将$conditions分配给 find function 调用中的条件键。

$listings = $this->Idx->find('all', array(
    'conditions' => $conditions
));

我考虑过在循环中分配$condtions ,但是对于最小值和最大值可能有点复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM