2016-10-18 10 views
0

私はレポートを生成するフォームを持っています。私のフォームでは、from_dateフィールドとto_dateフィールドだけが必須です。ユーザーがfrom_dateto_dateだけを選択した場合、その日付の間にすべての売上を生成する必要があります。彼または彼女は現金またはパーティーの賢明なまたはエージェントの賢明なレポート(これらのフィールドはフォームの右側にある)&現金を生成したい場合、私はそのようにカスタマイズされたレポートを生成することができるはずです。私はSQLクエリを作成するロジックを書くことができません。ありがとうございました!PHPのユーザ入力に基づいてレポートを生成

HTML:

<form class="row" id="reports" style="width: 100%; margin-bottom: 1%"> 
    <div class="pull-left clearfix"> 
     <label for="from" class="lab-sm">From:</label> 
     <input type="date" id="from" name="from" value="<?php echo date("2016-09-20"); ?>"> 
     <label for="to" class="lab-sm">To:</label> 
     <input type="date" id="to" name="to" value="<?php echo date("Y-m-d"); ?>"> 
     <div> 
     <label for="to" class="lab-sm">Inv:</label> 
      <select name="purchase" id="purchase" class="inp-sm"> 
       <option value="INV">All</option> 
      </select> 
     </div> 
    </div> 
    <div class="pull-right clear-left" style="position: relative;"> 
     <div> 
      <select name="payment" id="payment" class="inp-lg"> 
       <option value="">Cash & Credit Sales</option> 
       <option value="Cash">Cash</option> 
       <option value="Credit">Credit</option> 
      </select> 
     </div> 
     <div> 
      <select name="party" id="party" class="inp-lg"> 
       <option value="">-- All Parties --</option> 
       <? $query = $con->query("SELECT la_head FROM ledger_accounts"); ?> 
       <? while($row = mysqli_fetch_array($query)) { ?> 
       <option value="<?php echo $row['la_head']; ?>"><? echo $row['la_head']; ?></option> 
       <? } ?> 
      </select> 
     </div> 
     <div> 
      <select name="agent" id="agent" class="inp-lg"> 
       <option value="">-- All Agents --</option> 
       <? $query = $con->query("SELECT la_agent FROM ledger_accounts"); ?> 
       <? while($row = mysqli_fetch_array($query)) { ?> 
       <option value="<?php echo $row['la_agent']; ?>"><? echo $row['la_agent']; ?></option> 
       <? } ?> 
      </select> 
     </div> 
     <!-- submission --> 
     <div style="position: relative; left: 44px"> 
      <input type="submit" value="Generate"> 
      <input type="hidden" name="reports" value="sales_reports"> 
     </div> 
    </div> 
</form> 

はPHP:

if (ISSET($_POST['reports']) && $_POST['reports'] === 'sales_reports') { 

$from_date = $con->real_escape_string($_POST['from']); 
$to_date = $con->real_escape_string($_POST['to']); 
$payment_type = $con->real_escape_string($_POST['payment']); 
$party = $con->real_escape_string($_POST['party']); 
$agent = $con->real_escape_string($_POST['agent']); 

$query = "SELECT * 
     FROM sales 
     INNER JOIN ledger_accounts ON sales.la_id = ledger_accounts.la_id 
     INNER JOIN inventory_items ON sales.item_no = inventory_items.item_no 
     WHERE inv_date >= ? AND inv_date <= ? 
       AND sales.payment_type = COALESCE(?, sales.payment_type) 
       AND ledger_accounts.la_head = COALESCE(?, ledger_accounts.la_head) 
       AND ledger_accounts.la_agent = COALESCE(?, ledger_accounts.la_agent)"; 
    $stmt = $con->prepare($query); 
    $stmt->bind_param('sssss', $from_date, $to_date, $payment_type, $party, $agent); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    while ($row = $result->fetch_assoc()) { 
     echo '<tr>'; 
     echo '<td>'.$row['inv_date'].'</td>'; 
     echo '<td>'.$row['inv_no'].'</td>'; 
     echo '<td>'.$row['la_head'].'</td>'; 
     echo '<td>'.$row['la_address'].'</td>'; 
     echo '</tr>'; 
} 

enter image description here

+0

待機 - あなたはすぐ後に、私はquery.'の書き方を知らない '型付けと:'ここに私のQuery'があります...あなたはクエリー、あるいは何か他のもの(例えばロジック)を探していますか? –

+0

@SamOnela申し訳ありませんが、質問を編集しました。質問を探しています – Naresh

+1

あなたの問題を明確に述べていません。何が間違っている/あなたの現在のコード(SQLインジェクション攻撃の影響を受けやすい可能性が高い以外)で動作していない? – Nicarus

答えて

1

あなたはすべてのパラメータの値を取得できない場合がありますことを期待している場合は、COALESCE()を使用して、次の操作を行うことができます。

$query = "SELECT * 
    FROM sales 
    INNER JOIN party ON sales.party_id = party.party_id 
    INNER JOIN items ON sales.item_no = items.item_no 
    WHERE inv_date >= ? AND inv_date <= ? 
      AND payment_type = COALESCE(?,payment_type) 
      AND party = COALESCE(?,party) 
      AND agent = COALESCE(?,agent);"; 

$statement = $dbConn->prepare($query); 
$statement->bind_param('sssss',$from_date,$to_date,$payment_type,$party,$agent); 

COALESCE()は、最初のNULL以外の値を指定することで動作します。したがって、渡されたパラメータがNULLの場合、フィルタリングしているフィールドにあるもの(party = party)は上記と一致します。

潜在的なSQLインジェクション攻撃を避けるために、クエリもパラメータ化したいとします。私はそれを上のコードにも適用しました。

良いリソース:紛らわしいです - つまり
http://php.net/manual/en/mysqli-stmt.bind-param.php

How can I prevent SQL injection in PHP?

+0

私はあなたの提案で質問を更新したことを確認してください。私はどんな結果も得ていません – Naresh

+0

コードをステップ実行する方法を知っていますか?上記のクエリは正しいので、渡されるパラメータがnullではなく、おそらく空の文字列か、クエリに一致するレコードがテーブルにないことが考えられます。残念ながら、あなたのウェブサイトをデバッグすることはできません。 – Nicarus

+0

私は自分のHTMLコードで質問を更新しました – Naresh

関連する問題