【问题标题】:Cakephp 2.5 search box not workingCakephp 2.5 搜索框不工作
【发布时间】:2015-06-22 11:43:45
【问题描述】:

我是 CakePHP 的初学者。我想做一个简单的搜索框,但它不起作用,下面是我控制器中的代码:-

public function index() {         
    if ($this->request->is('post')) {
        $this->loadModel('Job');
        $this->request->data = $keyword; 
        $result = $this->Job->find('all', array(
            'condition'=>array('Job.title'=>'% $keyword %')
        ));
        $this->set('rslt',$result); 
        //$this->set('kc',$keyword);
    } 
}

在我看来,我的代码如下:-

<?php echo $this->Form->create('search', array('type'=>'get'));?>
<?php echo $this->Form->input('search');?>
<?php echo $this->Form->end('Submit');?>    

<pre><?php print_r($rslt) ; ?></pre>

但是搜索结果显示一个空白页。

【问题讨论】:

  • $this-&gt;request-&gt;data = $keyword; 是干什么用的?你不应该像这样改变$this-&gt;request-&gt;data。你从哪里得到$keyword
  • $keyword 是来自搜索表单的变量

标签: cakephp cakephp-2.5


【解决方案1】:

您的代码似乎存在一些问题。

首先,您应该从请求数据中获取关键字,例如 $this-&gt;request-&gt;data['search']['keyword']。不要像示例代码中那样覆盖$this-&gt;request-&gt;data;它应该是提交到页面的数据数组,您将其替换为字符串!

其次,您的情况需要类似于'Job.title LIKE' =&gt; '%' . $this-&gt;request-&gt;data['search']['keyword'] . '%'。在 PHP 变量周围使用单引号会将其视为字符串,因此不会将其替换为变量的值。相反,我们只引用%s。

您还缺少用于条件索引中搜索的 LIKE 关键字。

控制器中的代码应该类似于:-

public function index() {         
    if (!empty($this->request->data)) {
        $this->loadModel('Job');
        $result = $this->Job->find('all', array(
            'conditions' => array('Job.title LIKE' => '%' . $this->request->data['search']['keyword'] . '%')
        ));
        $this->set('rslt',$result); 
    } 
}

【讨论】:

  • 谢谢,我需要对我的视图文件进行任何编辑吗?我的意思是我有表格的地方
  • 您最好使用搜索插件github.com/CakeDC/search 和适当的PRG 方法,而不是这种容易出错的方法。这将一次干净地解决所有问题。
  • 我想我现在正在取得进展,它显示了一些结果,但结果与搜索的关键字无关,它显示了数据库中的所有内容
  • @user2090999 稍微修改了我的答案,使其不再依赖于表单提交类型。生成的 SQL 是什么样的?
  • @drmonkeyninja 我非常怀疑他能否让插件正常工作...
【解决方案2】:

您的表单方法设置为"GET" 未发布,因为您尝试在控制器中访问它。

//你的视图代码

<?php echo $this->Form->create('search', array('type'=>'get'));?>
<?php echo $this->Form->input('search');?>
<?php echo $this->Form->end('Submit');?>  

您应该在控制器中执行此操作。

if($this->request->is('get')){
  $keyword = $this->request->data['search'];
// OR $keyword = $_GET['search'];

$this->Job->find('all', array('conditions' => 
  'Job.colunmName LIKE' => '%'.$keyword.'%'
))
}

【讨论】:

  • 执行您的建议后,页面开始显示空白
  • 试试 if(isset($_GET['search']) && !empty($_GET['search'])){ $this->Job->find('all', array( 'conditions' => 'Job.counmName LIKE' => '%'.$keyword.'%' )) } 记得用 $this->set() 将值传回你的视图,同时用你的表 colunm 替换 colunmName和你的模型名称的工作
  • 我累了,现在我视图中的文本框显示为一个选择框
  • 为了让事情变得更简单,您可以创建普通的 HTML 表单。不是 CakePHP 助手生成的。并先看看是否可以正常工作。
    并使用之前的控制器方法运行它。
【解决方案3】:

改变这个:

'% $keyword %'

到这里:

'%$keyword%'

即去掉空格,否则生成的SQL会尝试查找被空格包围的关键字。

【讨论】:

  • 谢谢,我已经完成了,但仍然显示空白页
  • 另外,在您看来,将array('type'=&gt;'get') 更改为array('type'=&gt;'post'),否则您的数据将通过'get' 方法发送,而您的代码只接受来自的数据; 'post' 方法。
  • 我想我现在正在取得进展,它显示了一些结果,但结果与搜索的关键字无关,它显示了数据库中的所有内容
  • 只是想知道,你修复了变量赋值吗?它应该是 = $keyword = $this-&gt;request-&gt;data; 而不是 $this-&gt;request-&gt;data = $keyword;
  • 我刚刚这样做了,但它仍然显示数据库中的所有记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多