简体   繁体   English

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

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

Ok so I'm I'm fairly new to cakephp, and I have a search form with multiple fields and I have some fields that are optional in the search form.好的,所以我是 cakephp 的新手,我有一个包含多个字段的搜索表单,并且我有一些在搜索表单中是可选的字段。 What I am trying to do is when the form is submitted, is check to see if those fields are not NULL and apply those to my find('all') query.我要做的是在提交表单时检查这些字段是否不是 NULL 并将它们应用于我的 find('all') 查询。

Here is my ctp view这是我的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')); ?>

The fieldset that is titled Options is the optional field The Optional field values set to an array whose initial value is NULL标题为 Options 的字段集是可选字段 Optional 字段值设置为一个数组,其初始值为 NULL

Here is my search function inside my controller这是我在 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);
    }
}

My returned results are correct if I remove the options from my find() query, but once I set a value in the view I don't return the correct results.如果我从我的 find() 查询中删除选项,我返回的结果是正确的,但是一旦我在视图中设置了一个值,我就不会返回正确的结果。 I know the SQL syntax behind the find() prepared statement is SELECT * FROM table WHERE column_name AND column_name etc. But passing a NULL value to the Database will either (1) not return the results or (2) return the wrong results.我知道 find() 准备语句后面的 SQL 语法是 SELECT * FROM table WHERE column_name AND column_name 等。但是传递 NULL 的值不会返回结果(返回错误的值或返回结果)。 I have tried many different methods in the controller, with an OR statement, but OR is to generalized and returns to many results.我在 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 checking the values and modifying the SQL statement in the Model __construct() function? 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'];
}

I'm sure you can see what I'm doing and you should be able to complete this for the other params.我相信您可以看到我在做什么,并且您应该能够为其他参数完成此操作。 Then you can assign $conditions to the conditions key in your find function call.然后,您可以将$conditions分配给 find function 调用中的条件键。

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

I considered assigning the $condtions in a loop, but that could be a bit complicated with min and max values.我考虑过在循环中分配$condtions ,但是对于最小值和最大值可能有点复杂。

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

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