Невозможно получить PHP имя скрипта, используя REGEX - PullRequest
1 голос
/ 20 февраля 2020

У меня довольно сложная задача. У меня есть функция where(), которая отслеживает, куда пользователи заходят на сайт, берет имя файла сценария, предоставляет описание и вставляет его в базу данных.

Сценарий до недавнего времени работал отлично и не знал о сбой этой функции после недавнего незначительного обновления с MySQL 5.6.40 до 5.6.47

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

Наша функция:

function where($scriptname = "index", $userid, $update=1){
    if (!is_valid_id($userid))
        die;

    if (preg_match("/details.php/i", $scriptname))
        $where = "Browsing File Details (ID $_GET[id])";
    elseif (preg_match("/files.php/i", $scriptname))
        $where = "Browsing Files";
    elseif (preg_match("/account-info.php/i", $scriptname))
        $where = "Browsing Account Info (ID $_GET[id])";
    elseif (preg_match("/upload.php/i", $scriptname))
        $where = "Uploading File";
    elseif (preg_match("/account.php/i", $scriptname))
        $where = "Browsing User Control Panel";
    elseif (preg_match("/search.php/i", $scriptname))
        $where = "Searching For Files";
    elseif (preg_match("/forums.php/i", $scriptname))
        $where = "Viewing Forums";
    elseif (preg_match("/index.php/i", $scriptname))
        $where = "Browsing Homepage";
    elseif (preg_match("/mailbox.php/i", $scriptname))
        $where = "Viewing Messages";
    elseif (preg_match("/comments.php/i", $scriptname))
        $where = "Viewing Comments";
    elseif (preg_match("/recover.php/i", $scriptname))
        $where = "Recovering Account";
    elseif (preg_match("/bookmarks.php/i", $scriptname))
        $where = "Viewing Bookmarks";
    elseif (preg_match("/getfile.php/i", $scriptname))
        $where = "Downloaded File (ID $_GET[id])";
    elseif (preg_match("/faq.php/i", $scriptname))
        $where = "Reading FAQ Page";
    elseif (preg_match("/friends.php/i", $scriptname))
        $where = "Viewing Friends";
    elseif (preg_match("/admin.php/i", $scriptname))
        $where = "Managing Admin Panel";
    else
        $where = "Unknown Location";

    if ($update) {
        // Worked until a few days ago. No site changes were made prior for quite some time. 
        //$query = sprintf("UPDATE users SET page=".sqlesc($where)." WHERE id ='%s'", mysql_real_escape_string($userid)); 
        // Now using line below, which does insert into row if I use my own variable. 
        $query = "UPDATE users SET last_access='" . get_date_time() . "', page=" . sqlesc($where) . " WHERE id=" . $userid;
        $result = SQL_Query_exec($query);
    }
        return $where;
}

Теперь я попробовал следующий код, чтобы сузить его до того, что его вызывает. В настоящее время вышеуказанная функция вставляет в базу данных только

Неизвестное местоположение

, независимо от того, какая страница просматривается.

Я объяснил это следующим образом:

$stringtest = "This inserts into database!";
$query = "UPDATE users SET last_access='" . get_date_time() . "', page=" . sqlesc($stringtest) . " WHERE id=" . $userid;

Это прекрасно работает, однако оно не соответствует ни одному из условий $where.

Я пробовал разные регулярные выражения для совпадения имен файлов безрезультатны.

Есть идеи, что я делаю не так?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Для части SQL используйте подготовленные операторы, как отмечено выше.

Предполагая, что $scriptname содержит имя файла без расширения, а не абсолютный путь и основано на предоставленном коде не вижу большой потребности в preg_match() там. Можно было бы просто switch ... case.

Еще лучше, если вы хотите иметь какой-то управляемый список местоположений с описаниями (вы все равно используете их каждый раз), вы можете иметь ассоциативный массив (может быть возвращен отдельная функция), как показано ниже, и выполните следующее:

$locations = array(
  'index' => 'Browsing Homepage', 
  'forums' => 'Browsing Homepage,
  //  and so on for all of your files
);

// And to get the description - assuming case matters, otherwise use strtolower()
$desc = isset($locations[$scriptname]) ? $locations[$scriptname] : 'Unknown Location';
0 голосов
/ 20 февраля 2020

Я заметил, что вашим значением по умолчанию для $ scriptname является "index". Я полагаю, это ссылки "индекс. php"? В то время как ваш шаблон сопоставления также ищет расширение файла. (Кстати, не экранированный . не означает буквальный «.». Это правило RegEx для «любого персонажа». Так что да, это будет работать, но отчасти случайно.)

Какие значения вы передаете? Попробуйте выполнить команду die / dumping значения $ scriptname внутри этой функции перед выполнением сравнений в качестве проверки работоспособности, чтобы убедиться в получении ожидаемого вида ввода. Возможно, вы видите le git, хотя бы неожиданные, неудачи.

...