Я разработал код, который будет извлекать данные из базы данных и отображать их на экране на основе различных критериев.Однако моя клиентская база - это массив.В приведенном ниже коде я хочу определить свою клиентскую подсказку как массив.
И затем я хочу использовать запрос "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-адреса из этого поля базы данных.