strpos код не срабатывает PHP

205
08 февраля 2020, 12:10

Есть такой код для фильтрации URL. Но при каждом вводе данных срабатывает последный вариант.Подскажите ошибку. Заранне спасибо.

trait CheckEngine
{
    public function checkUrl($data)
    {
        $string = array(
            "home" , "about" , "freetemplate" , "contact" , "?" ,
            "auto" , "beauty" , "cleaning" , "education" , "auto",
            "cat", "=" , "$");
        foreach ($string as $key) 
        {
            if ($data = strpos($key, $data)) 
            {
                if ($data === false) 
                {
                    unset($data);
                }
                 else 
                {
                    return $data;
                }
            }
        }
    }
}

class TemplateController
{   
    use CheckEngine;
    public function actionIndex()
    {
        require_once("view/free-template.php");
        return true;
    }
    public function actionCategory()
    { 
        if (isset($_GET["cat"])) 
        {

            $cat = $this->checkUrl($_GET["cat"]);

            switch ($cat) 
            {
                case 'auto':
                print("auto");
                break;
                case 'beauty':
                print("beauty");
                break;  
                case 'cleaning':
                print("cleaning");
                break;
                case 'education':
                print("education");
                break;
                case 'other':
                print("other");
                break;      
                default:
                print("something");
                break;
            }
        }   
        require_once("view/free-template.php");
        return true;
    }
}
$template = new TemplateController();
$template->actionIndex();
$template->actionCategory();

Срабатывает только

                    default:
                    print("something");
                    break;
Answer 1

В документации по функции strpos сказано:

обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1

Исходя из этого можно сделать вывод, что в блок if ($data = strpos($key, $data)) метод никогда не входит, даже если соответствие было найдено strpos возвращает 0, который в операторе if приводится к false.

Вследствие этого checkUrl ничего не возвращает и $cat = $this->checkUrl($_GET["cat"]); равно null. Поэтому switch и попадает в блок default.

Answer 2
public function checkUrl($data)
    {
        $data = trim($data);
        $data = strip_tags($data);
        $data = stripcslashes($data);
        $data = htmlspecialchars($data);
        $stri = array(0,1,2,3,4,5,6,7,8,9,"+","-","(",")","[","]","|","^",";",".","@");
        $repl = array("","","","","","","","","","","","","","","","","","","","","");
        $data = str_replace($stri, $repl, $data);
        return $data;
    }

strpos поменял на str_replace думаю что не взломают

READ ALSO
Как из исходного имени файла выводить только название без расширения?

Как из исходного имени файла выводить только название без расширения?

Название моего файла indexphp, мне надо сделать index

173
Вывод во view пустой результат ActiveRecord.YII2

Вывод во view пустой результат ActiveRecord.YII2

Я только что начал изучать Yii2 и сразу столкнулся с недопониманием того, как выводить результат запроса к базе во viewСоздал таблицу post и пытаюсь...

185
php структура иерархии классов Exceptions

php структура иерархии классов Exceptions

У нас в проекте установлен композер и подключен autoload по psr-4

158
Отключить алерты с исключениями opencart

Отключить алерты с исключениями opencart

Имеется уже готовый магазин на opencart 3

136