【问题标题】:Search with CakePHP and MySQL使用 CakePHP 和 MySQL 进行搜索
【发布时间】:2014-01-22 17:52:50
【问题描述】:

我是新来的,正在使用 CakePHP,我想在我的网站上创建一个搜索器,但我有这个错误和警告:

注意(8):未定义变量:negocios [APP\View\Negocios\buscar.ctp, line 3] 警告 (2):为 foreach() [APP\View\Negocios\buscar.ctp,第 3 行] 提供的参数无效

这是我的控制器代码:

<?php

class NegociosController extends AppController {

public $components = array('Paginator');
public $helpers = array('Html', 'Form');

public function index(){
    $this->paginate = array('limit' => 1);
    $negocios = $this->paginate('Negocio');
    $this->set(compact('negocios'));
}


public function ver($id = null, $nombre){
    $this->Negocio->id = $id;
    $this->set('negocio', $this->Negocio->read());
}

public function buscar(){
    if(!empty($this->data)){
        $query = $this->data['Negocio']['buscador'];
        $this->set($query, $this->data['Negocio']['buscador']);
        $conditions = array(
            'conditions' => array(
                'or' => array(
                    'Negocio.titulo LIKE %$query%',
                    'Negocio.direccion LIKE %$query%',
                    'Negocio.lugar LIKE %$query%',
                    'Negocio.descripcion LIKE %$query%',
                    'Negocio.direccion LIKE %$query%',
                    'Negocio.email LIKE %$query%',
                    'Negocio.web LIKE %$query%',
                    'Negocio.facebook LIKE %$query%',
                    'Negocio.twitter LIKE %$query%',
                    'Negocio.categoria LIKE %$query%'
                    )
                )
            );
        $this->set('negocios', $this->Negocio->find('all', $conditions));
    }
}

}

?>

我的观点:

<?php

foreach ($negocios as $key => $negocio) {
    echo $negocio['Negocio']['titulo'].'<br />';
    echo $negocio['Negocio']['descripcion'].'<br />';
    echo $negocio['Negocio']['categoria'].'<br />';

}

?>

@cornelb 我有这个:

<?php 

echo $this->Form->create(array('controller' => 'negocios', 'action' => 'buscar'));
echo $this->Form->input('buscador', array('placeholder' => 'Buscar negocios...', 'label' => false));
echo $this->Form->submit('search.png', array('type' => 'button', 'id' => 'buscar', 'div' => false));
echo $this->Form->end();

?>

当我搜索某些东西时,我得到了这个错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '%$query%) OR (Negocio.direccion LIKE %$query%) OR (Negocio.lugar LIKE %$ 附近使用的正确语法' 在第 1 行

但如果我使用“get”方法,我什么也得不到。

【问题讨论】:

  • 你的视图代码搞砸了。
  • 还有...那是哪个视图?
  • 您只是将 $negocios 发送到“if(!empty($this->data)){”条件内的视图。即使用户没有搜索任何内容,您也应该发送一个空的。搜索是否返回任何内容?
  • @user221931 我的视图显然没有完成,只是看看它是否有效并查看显示的信息,我搜索的东西只能在我的视图中看到“buscar.ctp”通知(8) :未定义变量:negocios [APP\View\Negocios\buscar.ctp,第 3 行] 警告 (2):为 foreach() [APP\View\Negocios\buscar.ctp,第 3 行] 提供的参数无效

标签: php mysql cakephp search


【解决方案1】:

试试这个。

'Negocio.titulo LIKE' => "%" . $query. "%",

【讨论】:

    【解决方案2】:

    你也可以使用 Match Against Query

    $search = 'Search String';
    
    $conditions = array( 
     "MATCH(Post.title) 
      AGAINST('$search' IN BOOLEAN MODE)" 
      );
     $matches = $this->Post->find('all', array('conditions' => $conditions));
    

    对于 Match Against,您需要将表“存储引擎”更改为“MYISAM”,并在字段上建立全文索引。

    【讨论】:

      【解决方案3】:

      这会将表单添加到视图中。

      echo $this->Form->create('Negocio');
      echo $this->Form->input('buscador');
      echo $this->Form->submit('Search');
      echo $this->Form->end();
      

      在控制器中:

      public function buscar(){
          $negocios = array();
          if (!empty($this->request->data)) {
              $query = $this->request->data['Negocio']['buscador'];
              $conditions = array(
                  'conditions' => array(
                      'or' => array(
                          'Negocio.titulo LIKE' => "%$query%",
                          'Negocio.direccion LIKE' => "%$query%",
                          'Negocio.lugar LIKE' => "%$query%",
                          'Negocio.descripcion LIKE' => "%$query%",
                          'Negocio.direccion LIKE' => "%$query%",
                          'Negocio.email LIKE' => "%$query%",
                          'Negocio.web LIKE' => "%$query%",
                          'Negocio.facebook' => "%$query%",
                          'Negocio.twitter' => "%$query%",
                          'Negocio.categoria LIKE' => "%$query%",                    )
                  )
              );
              $negocios = $this->Negocio->find('all', $conditions);
          }
      
          $this->set('negocios', $negocios);
      }
      

      【讨论】:

      • 感谢您的回答,但我有一些问题,您可以再次查看我的帖子吗?我添加了信息。
      • 我已经更新了答案。 %LIKE% 的语法不同(例如:'Negocio.titulo LIKE' => "%$query%"
      • 谢谢,问题解决了 :),但我还有一个问题,它现在可以使用 post 方法,但使用 get 时,我在搜索中一无所获,为什么?
      • 用get,搜索词不会在$this->request->data中。它应该在$this-&gt;params 你可以使用debug($this-&gt;params) 看看是否有效
      • 好的,非常感谢您的帮助,也许我问的是简单的事情,但我是新手,有些事情我有点迷茫。
      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多