php - 在codeigniter php的电子商务购物车系统中通过复选框搜索产品

标签 php mysql sql ajax codeigniter

我正在使用 CodeIgniter 构建电子商务项目,在该项目中我正在通过带有复选框的多个过滤器参数从数据库中搜索产品。

但是我没有得到正确的结果。首先,我检查了品牌 -> 戴尔,它获得了两种产品,之后我检查了内存 -> 5 GB,因此它没有改变,但我希望它仅显示 1 个具有戴尔品牌的 5 GB 内存产品。

enter image description here

型号

    <?php
    class ProductsM extends CI_Model {
    
    public function getRowsByCheck($keyword){
    if($keyword=="")
    {
      $search_keuword = '';
    }
    else
    {
     $search_keuword = "and brand IN ('".$keyword."') OR ram IN ('".$keyword."') OR price IN ('".$keyword."')"; 
    }

$query = $this->db->query("SELECT * FROM products WHERE products_id!='' " . $search_keyword . "");
    
          if($query->num_rows() > 0){                       
        $product   = $query->result_array(); 
        return $product;               
        }       
        else{
            
            echo "<div class='btn-success btn-block' align='center'><strong>NO Related Product Found!!!</strong></div>";
        }
     }
    }?>

Controller

class ProductsC extends CI_Controller {
public function fetchByCheck(){
   $output='';
    $keyword='';
    if($this->input->post('tmp')){
      $array = $this->input->post('tmp');
      $keyword = implode("','",$array);
    }
    $data = $this->productsM->getRowsByCheck($keyword);
       foreach ($data as $p) {
  $output.='<div class="col-md-4">
      <div class="panel panel-info">
          <div class="panel-heading">'.$p["name"].'</div>
          <div class="panel-body" align=center>
          <img src="'.base_url("assets/images/".$p['image']).'" style="height:100px;">
          </div>
          <div class="panel-heading">Rs.'.$p["price"].'
      <a href="'.base_url()."ProductsC/addToCart/".$p['id'].'" class="btn btn-success">Add To Cart</a>
          Ram '.$p["ram"].'GB</div>
        </div>
        </div>';
       }
    echo   $output;
  }
}?>

查看

div class="list-group">
                <h3>BRAND</h3>
                <?php
                foreach($brand_data as $row){?> 
                  <div class="list-group-item checkbox">
                    <label><input type="checkbox" class="common-selector brand searchType"
                      value="<?php echo $row['brand'];?>"><?php echo $row['brand'];?></label>  
                  </div>
              <?php } ?>
            </div>    

            <div class="list-group">
                <h3>RAM</h3>
                  <?php
                foreach($ram_data as $row){?> 
                  <div class="list-group-item checkbox">
                    <label><input type="checkbox" class="common-selector ram searchType" 
                      value="<?php echo $row['ram'];?>"><?php echo $row['ram'];?></label>  
                     </div>
               <?php } ?>
            </div>  

Script.js

<script type="text/javascript">
  $(document).ready(function(){
$('.searchType').on('click', function () {
  var tmp = [];
      $("input").each(function() {
          if ($(this).is(':checked')) {
          var checked = ($(this).val());
          tmp.push(checked);
        }
      });
  //alert(tmp);

$.ajax({
              url:"<?php echo base_url();?>ProductsC/fetchByCheck",
              method:"POST",
              data:{tmp:tmp},
              success:function(data){
                //alert(data);
                $('#result').html(data);
              }
        });
});
});
</script>

最佳答案

您在查询中使用 OR 条件,如果提供了可选关键字之一,则结果始终为 true。为了设置所有条件,您可以拆分每个关键字并使用 AND 条件:

HTML

<div class="list-group">
    <h3>BRAND</h3>
    <?php
    foreach ($brand_data as $row) { ?>
        <div class="list-group-item checkbox">
            <label><input type="checkbox" name="brand" class="common-selector brand searchType" value="<?php echo $row['brand']; ?>"><?php echo $row['brand']; ?></label>
        </div>
    <?php } ?>
</div>

<div class="list-group">
    <h3>RAM</h3>
    <?php
    foreach ($ram_data as $row) { ?>
        <div class="list-group-item checkbox">
            <label><input type="checkbox" name="ram" class="common-selector ram searchType" value="<?php echo $row['ram']; ?>"><?php echo $row['ram']; ?></label>
        </div>
    <?php } ?>
</div>

Javascript

<script type="text/javascript">
    $(document).ready(function() {
        $('.searchType').on('click', function() {
            var tmp_brand = [];
            $("input[name='brand']").each(function() {
                if ($(this).is(':checked')) {
                    var checked = ($(this).val());
                    tmp_brand.push(checked);
                }
            });
            var tmp_ram = [];
            $("input[name='ram']").each(function() {
                if ($(this).is(':checked')) {
                    var checked = ($(this).val());
                    tmp_ram.push(checked);
                }
            });
            //alert(tmp);

            $.ajax({
                url: "<?php echo base_url(); ?>ProductsC/fetchByCheck",
                method: "POST",
                data: {
                    tmp_brand: tmp_brand,
                    tmp_ram: tmp_ram,
                    tmp_price: tmp_price
                },
                success: function(data) {
                    //alert(data);
                    $('#result').html(data);
                }
            });
        });
    });
</script>

Controller

<?php

class ProductsC extends CI_Controller
{
    public function fetchByCheck()
    {
        $output = '';
        $keyword = [];
        if ($this->input->post('tmp_ram')) {
            $array = $this->input->post('tmp_ram');
            $keyword['ram'] = implode("','", $array);
        }
        if ($this->input->post('tmp_brand')) {
            $array = $this->input->post('tmp_brand');
            $keyword['brand'] = implode("','", $array);
        }
        if ($this->input->post('tmp_price')) {
            $array = $this->input->post('tmp_price');
            $keyword['price'] = implode("','", $array);
        }
        $data = $this->productsM->getRowsByCheck($keyword);
        foreach ($data as $p) {
            $output .= '<div class="col-md-4">
      <div class="panel panel-info">
          <div class="panel-heading">' . $p["name"] . '</div>
          <div class="panel-body" align=center>
          <img src="' . base_url("assets/images/" . $p['image']) . '" style="height:100px;">
          </div>
          <div class="panel-heading">Rs.' . $p["price"] . '
      <a href="' . base_url() . "ProductsC/addToCart/" . $p['id'] . '" class="btn btn-success">Add To Cart</a>
          Ram ' . $p["ram"] . 'GB</div>
        </div>
        </div>';
        }
        echo   $output;
    }
} ?>

型号

<?php
class ProductsM extends CI_Model
{

    public function getRowsByCheck($keyword)
    {
        $search_keuword = '';
        if (count($keyword) > 0) {
            foreach ($keyword as $key => $value) {
                if ($key == 'ram') {
                    $search_keuword .= "and ram IN ('" . $value . "')";
                }
                if ($key == 'brand') {
                    $search_keuword .= "and brand IN ('" . $value . "')";
                }
                if ($key == 'price') {
                    $search_keuword .= "and price IN ('" . $value . "')";
                }
        }
        $res = $this->db->query("SELECT * FROM products WHERE id!='' " . $search_keuword . "")->result_array();
        return $res;
    }
} ?>

关于php - 在codeigniter php的电子商务购物车系统中通过复选框搜索产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58569810/

相关文章:

php - 将照片从 iOS 上传到服务器时出错

使用 "WITH"子句的 PHP PDO SQLite3 问题

php - Stripe api 抛出异常时的 Symfony 内部服务器错误

php - 为什么 laravel 不返回特定 id 的标识

php - 更新查询以对抗谷歌机器人黑客攻击

php - 捕获不同的异常类型

C# LINQ 查询外键循环

php - 如何在同一个sql查询中检查多个sql查询

mysql - MYSQL数据库迁移不丢失记录

mysql - 从 MySQL 和 Codeigniter 中的同一 JOIN 获取多个值