【问题标题】:How to Loop through query result and compare results with input field如何循环查询结果并将结果与​​输入字段进行比较
【发布时间】:2018-07-24 14:45:22
【问题描述】:

我想遍历查询的结果,然后将每个结果与输入字段进行比较,如果值重复,则必须返回 false,否则结果为 true,我知道我可以使用数据库中的唯一索引来避免重复值,然后捕获错误,但在这种情况下,重复值是可能的,但它们不能都是“活动的”,有一个名为“状态”的列,有两个值 A 或 I(活动和非活动)所以“clabe”值只能在一个处于活动状态而另一个处于非活动状态时重复。 控制器:

function agregar()
{
    $this->load->helper('date');
    date_default_timezone_set('America/Mexico_City'); 
    $now = date('Y-m-d H:i:s');        
    $Interno = $this->input->post('intern');
    $clabe = $this->input->post('clabe2') . $this->input->post('control2'); 
    $cve_banco = $this->input->post('cve_banco');
    $Banco = $this->input->post('Banco2');
    $Observaciones = $this->input->post('Observaciones');

    $data = array(
        'Interno' => $Interno,
        'clabe' => $clabe,
        'cve_banco' => $cve_banco, 
        'Banco' => $Banco,
        'Observaciones' => $Observaciones,
        'Fecha_alta' => $now, 
    );

    if($this->consultas_M->insert($data) == true){
        //redirect('Inicio/busqueda', 'refresh');
    } else{
        echo "Hubo un problema al insertar";
    }
}

型号:

function insert($data)
{
    $clabe = $this->input->post('clabe2') . $this->input->post('control2'); 
    $this->db->select('Clabe');
    $this->db->where('Status =', 'A');
    $query= $this->db ->get('cuentas');
    return $query->row();
    foreach ($query as $row) {
        $i = $row;
        if ($clabe = $i) {
          return false;
        } else {
            $this-> db -> insert('cuentas', $data);
            if ($this->db->affected_rows() > 0) {
                return true;
            } 
        }
    }
}

【问题讨论】:

  • 哪些列组合可以是唯一的?
  • 移除 return $query->row(); 以便在您的模型中进行进一步处理
  • 唯一唯一的列是“Interno”,即员工编号或 ID。
  • "但在这种情况下,重复值是可能的,但它们不能都是“活动的”,有一个名为“状态”的列,有两个值 A 或 I(活动和非活动)所以“clabe”值只能在一个处于活动状态而另一个处于非活动状态时重复。”这听起来像是复合键的情况
  • 在 2 列上添加唯一键

标签: php mysql codeigniter


【解决方案1】:

为什么你想要有可能的重复索引?如果您出于某种原因想要具有具有共同“索引”的不同行,您可以创建一个称为索引或其他内容的列,并在 WHERE 子句中添加该索引。 PS:在你的模型中,在 foreach 循环的 if 条件下使用:

if ($clabe == $row){...

而不是

$i = $row
if ($clabe = $i){...

【讨论】:

  • 好吧,“clabe”是银行间号码,这个想法是每个员工只有一个活跃的“clabe”,但如果出于任何原因,用户保存了其他员工的“clabe”,它可以被删除(他们不想删除它们)所以他们所做的就是将状态更改为“非活动”,这就是为什么可能有两个重复值但它们永远不会都是“活动”的原因
  • 好的,所以假设 clabe 不是数据库中表的主键,只需执行 SELECT Clabe FROM [yourTable] WHERE Clabe = '$clabe' AND status = 'A'。如果它返回任何行,则返回 false 否则插入
【解决方案2】:

我自己解决了这个问题,我发帖以防它对任何人有帮助,这比我想象的要容易。

function insert($data, $clabe)
  {
       $Status = 'A';
       $clabe = $this->input->post('clabe2') . $this->input->post('control2');
      $this->db->select('Clabe');
      $this->db->where('Status =', $Status);
      $this->db->where('Clabe =', $clabe);
    $q= $this->db ->get('cuentas');
  if($q -> num_rows() > 0){
    return false;
                      }else{
                        $this-> db -> insert('cuentas', $data);
                        return true;
                      }

这是控制器:

if($this->consultas_M->insert($data, $clabe) == true){
            redirect('Inicio/busqueda', 'refresh');
          } else{
            echo "There was a problem";
            $this->load->view('errors/error');

          }

我唯一需要和没有做的就是选择我想要的“clabe”,然后将其与用户编写此“clabe”的输入进行比较。然后只是一个简单的 if-else 语句。

【讨论】:

    【解决方案3】:
    function insert($data)
    {
      $Status = 'A';
       $clabe = $this->input->post('clabe2') . $this->input->post('control2'); 
       $this->db->select('Clabe');
       $this->db->where('Status', $Status);
       $query= $this->db ->get('cuentas');
       $flag=true;
    
       foreach ($query as $row) {
            $i = $row;
            if ($clabe = $i){
              $flag=false;
            }
        }
      if($flag){
        $this-> db -> insert('cuentas', $data);
        if ($this->db->affected_rows() > 0) {
            $flag= true;
        } 
      }
      return $flag;
    }
    

    您的代码将在第一个 else 块广告返回时添加它。相反,它应该首先检查所有行来决定。

    【讨论】:

    • 这可能是部分解决方案,但问题是关于 php 而不是 sql
    • @zedling 问题与 php 代码有关,但 OP 需要解决方案来通过问题中提到的代码或 db 取出重复项。有效的方法是数据库级别的约束而不是代码。 OP 不知道使用列组合的唯一约束
    • 我明白这一点,但只有当 Status = 'A' 当 Status = 'I' 值可以重复时,它们才应该是唯一的。
    • @AdrianJimenez checkout if current is expected solution
    • 如果您不想插入,请删除 db 调用
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多