首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除循环函数的选择查询中的重复?

如何消除循环函数的选择查询中的重复?
EN

Stack Overflow用户
提问于 2017-10-27 13:12:49
回答 2查看 228关注 0票数 1

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

代码:

代码语言:javascript
复制
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>";

   }
EN

回答 2

Stack Overflow用户

发布于 2017-10-27 13:37:57

id_c + max (或min)在ids_cservice_type_c上的分组

(如果有重复,则只需选择一个值就需要一个规则)

代码语言:javascript
复制
$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";
票数 0
EN

Stack Overflow用户

发布于 2017-10-27 13:45:16

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

代码语言:javascript
复制
$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

$_REQUEST包含$_POST$_GET$_COOKIE。在较早版本的PHP中,它还包含$_FILES。这是不好的,因为它会在您的代码中引入歧义,并可能导致“棘手”以后。确定如何将数据输入到脚本中,并使用适当的超全局变量。

  1. for ($i = 0; $i < count($_REQUEST['bulk_invoice_group_id']); $i++) {

这里这一行的问题是在for声明本身中包含count()函数。对于循环的每一次迭代,$i < count($_REQUEST['bulk_invoice_group_id'])条件都会得到重新评估--很多没有意义的计数!

  1. VALUES('$bulk_invoice_id','{$_REQUEST['bulk_invoice_group_id'][$i]}'

这可能是最坏的罪犯。通过将用户输入直接插入到查询中,您将暴露在注入攻击中。查看准备好的查询,或者(不太安全但比不安全) 逸出函数

  1. 一个衬里你的SQL

这比任何事情都更让人恼火,但出于某种原因,我看到这么多人在做这件事。没有理由将所有的SQL查询放在一行上。您所做的只是使您的查询更难阅读和维护。

这是:

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

可以写成

代码语言:javascript
复制
$sql = "
    insert into tablename (
        col1,
        col2,
        col3
    ) values (
        'val1',
        'val2',
        'val3'
    )
";

对性能没有任何影响。只是读起来容易多了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46975907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档