【问题标题】:Default load of all data then filter table with form所有数据的默认加载,然后使用表单过滤表
【发布时间】:2020-02-14 16:32:58
【问题描述】:

我有一个为客户加载发票的页面。我添加了一个日期选择器来按日期搜索,但是当页面加载时它不会提供任何数据,直到从表单应用过滤器。我希望页面首先加载所有数据,然后如果用户想按日期过滤,他们可以选择它。

 <form method='post' action='invoices.php' class='sdate'>



    <div class="sdate">

      <input type="text" name="sdate" placeholder="Start Date" >
    </div>


        <div class="sdate">
      <button type="submit" class="sdatebtn">Submit</button>
    </div>


    </form>

数据库查询

                FROM imw_locations l
                INNER JOIN vzw_invoice i
                ON l.AddressCode=i.ItemCustomerFullName
                WHERE l.owner='" . $owner . " ' AND Txndate='".$sdate."'

查询的完整数据

<head>


</head>

<?php

session_start();
if (!isset($_SESSION['loggedin'])) {
    header('Location: /index.php');
    exit();
}



?>
<?php 

include "config.php";
$owner = $_SESSION['role'];


$sdate = $_POST['sdate'];
$edate = $_POST['edate'];


?>
<?php include "../../assets/navbar.php" ?>
<div>
<?php echo $sdate;?>
<!----    Date Selections    ---->
 <form method='post' action='invoices.php' class='sdate'>



    <div class="sdate">

    <input type="text" name="sdate" placeholder="Start Date">
    </div>
    <div class="sdate">

    <input type="text" name="edate" placeholder="End Date" >
    </div>


        <div class="sdate">
      <button type="submit" class="sdatebtn">Submit</button>
    </div>


    </form>







<!---- This is the download form ---->
 <form method='post' action='../finance/export/download.php'>
  <input type='submit' value='Export' name='Export'>

  <table class="invoice">
  <thead>
    <tr>

<th>Reference Number</th>
<th>Memo</th>
<th>Trans. Date</th>
<th>Location</th>
<th>Item Amount</th>
<th>Quantity</th>
<th>Vendor</th>

    </tr>
    </thead>
<?php 

     $owner = $_SESSION['role'];
     $query = "SELECT l.AddressCode, 
                l.owner,
                l.City, 
                l.State, 
                l.Zip, 
                i.RefNumber,
                i.memo,
                i.Txndate,
                i.DueDate,
                i.ItemCustomerFullName,
                i.PO_number ,
                i.ItemAmount, 
                i.PO_number,
                i.preorder_,
                i.Quantity,
                i.Vendor,
                i.balance
                FROM imw_locations l
                INNER JOIN vzw_invoice i
                ON l.AddressCode=i.ItemCustomerFullName
                WHERE l.owner='" . $owner . " ' 
                AND Txndate='".$sdate."'


                ";
     $result = mysqli_query($con,$query);
     $user_arr = array();
     while($row = mysqli_fetch_array($result)){
      $ref = $row['RefNumber'];
      $memo = $row['memo'];
      $Txndate = $row['Txndate'];
      $duedate = $row['DueDate'];
      $ItemCustomerFullName = $row['City'];
      $PO_number = $row['PO_number'];
      $ItemAmount = $row['ItemAmount'];
      $preorder_ = $row['preorder_'];
      $Quantity = $row['Quantity'];
      $Vendor = $row['Vendor'];
      $balance = $row['balance'];

   ?>
      <tr>

       <td><?php echo $ref; ?></td>
       <td><?php echo $memo; ?></td>
       <td><?php echo $Txndate; ?></td>
       <td><?php echo $ItemCustomerFullName; ?></td>
       <td><?php echo $ItemAmount; ?></td>
       <td><?php echo $Quantity; ?></td>
       <td><?php echo $Vendor; ?></td>


      </tr>
   <?php
    }
   ?>
   </table>
   <?php 
    $serialize_user_arr = serialize($user_arr);
   ?>
  <textarea name='export_data' style='display: none;'><?php echo $serialize_user_arr; ?></textarea>
 </form>


</div>

【问题讨论】:

  • 你能显示查询数据库的代码吗?基本上,您需要查看是否设置了日期,然后将其包含在 DB 查询的WHERE 子句中。可能发生的情况是您查询日期为 NULL 的位置,它返回空
  • @Ice76 我已经用查询更新了我的帖子
  • 附注。 array($ref,$memo,$Txndate,$duedate,$ItemCustomerFullName,$PO_number,$ItemAmount,$preorder_,$Quantity,$Vendor,$balance); 本质上等于$row。你可以摆脱一大堆无用的代码
  • between 可能不起作用,因为 $_POST['edate'] 似乎没有对应的表单字段。我也很疑惑为什么 echo $email;在 sdate 字段中。该代码看起来像是由几个随机代码部分组成的科学怪人版本。是吗?
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: php html forms mysqli


【解决方案1】:

这很难回答,因为您发布的代码与您上面提到的查询不一致。

最简单的解决方案是使用字符串设置一个变量,如果设置了日期,则将其附加到该变量上。这是一个简单的解决方案,当您获得更多条件时,您可以创建一个数组,然后对其执行implode,但可以稍后添加。一个例子:

$whereClause = "WHERE l.owner = '{$owner}'";
if ( ! empty( $sdate) && $sdate ) {
    $whereClause .= " AND Txndate = '{$sdate}'";
}

就您的BETWEEN 子句而言,请尝试切换日期。我假设$edate 是结束日期,$sdate 是开始日期,并且 between 子句首先取开始日期。

另外,请阅读this。您有明显的安全漏洞示例,大的。您正在接受用户输入并将其直接注入数据库查询中。这是一个巨大的安全漏洞,需要验证和清理输入。

【讨论】:

  • 您会接受编写安全版本的挑战吗?
  • 我已经更新了我的 OP 以包含所有 invoice.php 文件。希望这可以帮助。我尝试了上述方法,但这对我不起作用。这给了我一个空白页。
  • @DavidMorin 你必须意识到答案不应该是一个故意的工作示例,你只是盲目地复制并粘贴到你的代码中。您应该了解它的工作方式并在您的环境中实施
  • @YourCommonSense 我愿意!
  • @DavidMorin 嘿,看看这个。我对其进行了调整以符合您的 between 子句,但它的作用是确定 WHERE 应该是什么,然后将其粘贴到查询中。 pastebin.com/NxznBuEL
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 2016-11-16
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多