如何从循环函数的select查询中消除重复?

时间:2017-10-27 13:12:50

标签: php codeigniter sugarcrm suitecrm

我是初学者php开发者。我从数据创建循环get select查询函数,我得到多个select查询显示相同的id。如何消除重复查询?

代码:

for ($i = 0; $i < count($_REQUEST['bulk_invoice_group_id']); $i++) {
       $bulk_invoice_id = create_guid();
       $sql = "INSERT INTO ggs_bulk_invoice(id, group_id, service_date, city, service, duration, notes,rate,rate_with_vat, vendor_id,service_meeting_id)"
               . " VALUES('$bulk_invoice_id','{$_REQUEST['bulk_invoice_group_id'][$i]}','{$_REQUEST['bulk_invoice_date'][$i]}','{$_REQUEST['bulk_invoice_city'][$i]}','{$_REQUEST['bulk_invoice_service'][$i]}','{$_REQUEST['bulk_invoice_duration'][$i]}','{$_REQUEST['bulk_invoice_notes'][$i]}' ,'{$_REQUEST['bulk_invoice_rate'][$i]}','{$_REQUEST['bulk_invoice_rate_vat'][$i]}','{$_REQUEST['bulk_invoice_vendor_id'][$i]}','{$_REQUEST['bulk_invoice_meeting_id'][$i]}')";
       $db->query($sql);
       $sql = "INSERT INTO ginvo_client_invoice_ggs_bulk_invoice_1_c(id, ginvo_client_invoice_ggs_bulk_invoice_1ginvo_client_invoice_ida, ginvo_client_invoice_ggs_bulk_invoice_1ggs_bulk_invoice_idb)"
               . " VALUES('" . create_guid() . "','$bean->id','$bulk_invoice_id')";
       $db->query($sql);

       $query = "SELECT DISTINCT ON (id_c) ids_c, service_type_c FROM meetings_cstm WHERE id_c='".$_REQUEST['bulk_invoice_meeting_id'][$i]."'";

       echo "<pre>";
       print_r($query);
       echo "</pre>";

   }

2 个答案:

答案 0 :(得分:0)

id_cmax

上按min + ids_c(或service_type_c)分组

(如果您有重复,则需要一个规则才能选择一个值)

$query = "SELECT id_c,max(ids_c) as ids_c, max(service_type_c) as service_type_c FROM meetings_cstm WHERE id_c='".$_REQUEST['bulk_invoice_meeting_id'][$i]."' group by id_c";

答案 1 :(得分:0)

好的,所以你要找的答案就是在循环遍历数组时简单地存储你的ID缓存。如果弹出一个副本,只需跳过它:

$num_entries = count($_REQUEST['bulk_invoice_group_id']);
$cache = array();
for ($i = 0; $i < $num_entries; $i++) {
    if(in_array($_REQUEST['bulk_invoice_group_id'][$i], $cache)) {
        continue;
    }

    $cache[] = $_REQUEST['bulk_invoice_group_id'][$i];

    // More stuff

但是。编写此代码时,您犯了很多错误。我将在下面详述它们:

  1. 使用$_REQUEST
  2. $_REQUEST包含$_POST$_GET$_COOKIE。在旧版本的PHP中,它还包含$_FILES。这很糟糕,因为它会在代码中引入歧义,并可能导致“陷阱”。确定如何将数据导入脚本,并使用适当的超全局变量。

    1. for ($i = 0; $i < count($_REQUEST['bulk_invoice_group_id']); $i++) {
    2. 此行的问题在于for声明本身包含count()函数。对于循环的每次迭代,都会重新评估$i < count($_REQUEST['bulk_invoice_group_id'])条件 - 很多无意义的计数!

      1. VALUES('$bulk_invoice_id','{$_REQUEST['bulk_invoice_group_id'][$i]}'
      2. 这可能是最糟糕的罪犯。通过直接在查询中插入用户输入,您将自己暴露给injection attacks。查看prepared queries或(不太安全,但总比没有好)escape functions

        1. 一个衬里SQL
        2. 这更像是一种宠儿的烦恼,但出于某种原因,我看到有这么多人在做这件事。 没有理由将所有SQL查询放在一行。您所做的只是让您的查询更难以阅读和维护。

          此:

          $sql = "insert into tablename (col1, col2, col3) values ('val1', 'val2', 'val3')";

          可以写成

          $sql = "
              insert into tablename (
                  col1,
                  col2,
                  col3
              ) values (
                  'val1',
                  'val2',
                  'val3'
              )
          ";
          

          对性能没有任何影响。它更容易阅读。