0

送信時にmysqlクエリのwhereステートメントとなる値が含まれる場合と含まれない場合がある4つのドロップダウンメニューがあります。$_POST['dropdownitem'] が空でない場合に where ステートメントを挿入する方法を見つけたいと思います。以下のブロックでは、基本的に $_POST を含むものはすべて存在する場合と存在しない場合があります。

$select = dbz( )
->select( )
->from( array( 'l' => 'logs' ) )
->joinLeft( array( 'd' => 'dealers' ), 'l.dealerID = d.id' )
->joinLeft( array( 'p' => 'prospects' ), 'l.dealerID = p.id', array( 'id', 'name AS pname' ) )
->where( 'l.id = ?', $currentUser[ 'id' ] )
->where( 'l.dealerId = ?', $_POST[ 'dealerid' ] )
->where( 'logData LIKE ?', '%' . $_POST[ 'activitytype' ] . '%' );
->where( 'logTime >= ?', $today )
->where( 'logTime < ?', strtotime( $tomorrow ) );

$userLogs = dbz( )->fetchAll( $select );
4

1 に答える 1

2

投稿された各値を異なる方法で検証する必要性を回避することはできないため、クエリが正しく構築されていることを確認するために、少なくともいくつかの条件付きチェックが必要になります。

以下のように関数内にカプセル化すると、値が変更された場合の柔軟性が向上する可能性があります。個人的には、switch ステートメントを使用すると読みやすくなり、将来また変更されると思います。

$select = dbz()
  ->select()
  ->from( array( 'l' => 'logs' ) )
  ->joinLeft( array( 'd' => 'dealers' ), 'l.dealerID = d.id' )
  ->joinLeft( array( 'p' => 'prospects' ), 'l.dealerID = p.id', array( 'id', 'name AS pname' ) )

public function addConditionals($query, $userId, array $data = array())
{
  $select->where('l.id = ?', $userId);
  foreach($data as $column => $value) {
    switch(strtolower($column)) {
      case 'dealerid':
        $select->where('l.dealerId = ?', intval($value));        
      break;
      case 'activitytype':
        $select->where('logData = ?', $value));        
      break;
      // etc...
    }
  }
}
addConditionals($select, $currentUser['id'], $_POST);
于 2013-07-26T17:58:56.943 に答える