как перебрать каждое значение поля ipaddress базы данных, сопоставить его с помощью like и извлечь все данные в php - PullRequest
0 голосов
/ 27 сентября 2018

Я разработал код, который будет извлекать данные из базы данных и отображать их на экране на основе различных критериев.Однако моя клиентская база - это массив.В приведенном ниже коде я хочу определить свою клиентскую подсказку как массив.

И затем я хочу использовать запрос "LIKE" в своем выражении sql, как показано ниже в моем коде:

( X_FORWARDED_FOR  LIKE '%IP1%   OR  X_FORWARDED_FOR  LIKE '%IP2% )

code:

class PagesviewlogEvent {        
    const HOST_DEBUG_OFFICE = 'debug.office.xyz.com';
    const HOST_DEBUG_ASSETS = 'debug.assets.xyz.com';

    private $_db;
    private $_config;
    private $_connStringInfo;

    private $_hostnames;

    private $_userid;
    private $_fromdate;
    private $_todate;
    private $_clientip;
    private $_hostname;

    private $_limit;


    public function __construct(PagesviewlogEventRequest $request) {    
        $this->_config = new Config(include dirname(__FILE__) . '/../../../../config/autoload/global.php');
        $this->_db = Utils::connectDB($this->_config->db->adapters->weblogs);
        $this->_connStringInfo = $this->_config->db->adapters->weblogs->connection_string;

        $this->_setFilters();

        $this->_userid = ($request->userid == '') ? NULL : $request->userid;
        $this->_fromdate = $request->fromdate;
        $this->_todate = $request->todate;

        $this->_clientip = array();
        foreach ($this->_clientip as $value) {
            $this->_clientip = ($request->value == '') ? NULL : $request->value;
        }

        $this->_hostname = ($request->hostname == '') ? NULL : constant('self::' . $request->hostname);
        $this->_limit = ($request->limit == '') ? NULL : $request->limit;
    }

    private function _setFilters() {
        $reflect = new \ReflectionClass(self::class);
        $this->_hostnames = array();

        foreach ($reflect->getConstants() as $key => $value) {
            if (strpos($key, 'HOST_') === 0) {
                $this->_hostnames[$key] = $value;
            }
        }        
    }

    public static function getHostNamesRegexp() {
        $reflect = new \ReflectionClass(self::class);
        $hostnames = array();

        foreach ($reflect->getConstants() as $key => $value) {
            if (strpos($key, 'HOST_') === 0) {
                $hostnames[$key] = $value;           
            }
        } 

        $hostnames = implode('|', array_keys($hostnames));        
        return '/^$|^(' . $hostnames . ')$/';
    }

    public function getHostNames() {
        return $this->_hostnames;
    }
    public function getConnStringInfo() {
        return $this->_connStringInfo;
    }


    public function getPagesviewLogs() {        
        return $this->_getPagesviewLogs($this->_userid, 
            $this->_fromdate, 
            $this->_todate, 
            $this->_clientip,
            $this->_hostname,  
            ($this->_limit === NULL) ? $this->_config->weblogs->recordslimit:$this->_limit
        );
    }


    private function _getPagesviewLogs($userid, \DateTime $fromdate, \DateTime $todate, $clientip, $hostname, $recordslimit = NULL) {
        $sql = "SELECT * 
            FROM (
                SELECT TO_CHAR(audit_logs.REQUEST_TIME, 'dd/mm/yyyy HH24:mm:ss') AS event_time,
                audit_logs.USERID as user_id,
                audit_logs.HOSTNAME as hostname,
                audit_logs.X_FORWARDED_FOR as x_forwarded_for,
                FROM audit_logs
                WHERE REQUEST_TIME >= to_date(:fromdate,'dd/mm/yyyy')
                    AND REQUEST_TIME <= to_date(:todate,'dd/mm/yyyy     HH24:MI:SS'
            )";

        $sql .= ($userid !== NULL) ? 'and USERID=:userid ' : '';
        $sql .= ($clientip !== NULL) ? 'and X_FORWARDED_FOR=:clientip ' : '';       

        // ( X_FORWARDED_FOR  LIKE '%IP1%   OR  X_FORWARDED_FOR  LIKE '%IP2% )
        $sql .= ($hostname !== NULL) ? 'and HOSTNAME=:hostname ' : ''; 
        $sql .= "ORDER BY REQUEST_TIME DESC) ";
        $sql .= ($recordslimit !== NULL) ? 'where ROWNUM<=:recordslimit ' : ''; 
        $sql .= "ORDER BY event_time DESC";

        $fromdate = $fromdate->format('d/m/Y');
        $todate = $todate->format('d/m/Y' . ' 23:59:59');

        $statement = oci_parse($this->_db, $sql);
        if ($userid !== NULL) {
            oci_bind_by_name($statement, ':userid', $userid);
        }
        foreach($clientip as $value) {
            if ($value !== NULL) {
                oci_bind_by_name($statement, ':clientip', $value);
            }
        }
        if ($hostname !== NULL) {
            oci_bind_by_name($statement, ':hostname', $hostname);
        }

        oci_bind_by_name($statement, ':fromdate', $fromdate);
        oci_bind_by_name($statement, ':todate', $todate);

        $success = oci_execute($statement);
        $nrows = oci_fetch_all($statement, $result, NULL, NULL, OCI_FETCHSTATEMENT_BY_ROW);

        switch (count($result)) {
            case 0:
            return array();                
            default:                
            return $result;
        }
    }
}

Мое поле clientip выглядит следующим образом в базе данных

"10.74.10.1", "10.75.10.132","10.78.10.1"

Я получаю ниже ошибку после выполнения моего кода:

oci_execute(): ORA-01008: не все переменные, связанные в D: \ PagesviewlogEvent.php в строке ..

Общая цель: взять пользовательский ввод и извлечь все данные на основе этого пользовательского ввода.В этом коде, например, X_FORWARDED_FOR (clientip) содержит «10.74.10.1, 10.75.10.132,10.78.10.1».Если пользователь вводит какой-либо из этих IP-адресов, он должен иметь возможность извлечь все IP-адреса из этого поля базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...