Правильно ли написан код экранирования(?) строки и как он вообще должен работать?
Это называется "карго-культ код".
После второй мировой войны ученые вдруг заметили, что папуасы начали строить целые аэродромы из травы и палок. С самолётами, заправщиками и диспетчерскими службами. И заинтересовались этим феноменом.
Оказалось, что во время войны на острове папуасов был аэродром. И с неба прилетали такие штуки, которые привозили кучу ништяков, в основном пожрать. Потом война кончилась, военные ушли, и ништяков не стало. 
Огорченные местные решили все взять в свои руки.  И настроили самолётов из помета и палок. И сидят, ждут с тех пор ништяков.
Это называется "карго культ".
Приведенный тобой код - это такой же самолёт из сена, написан папуасом.
Он видел где-то несколько функций, но не понимает их смысла. И лепит из них травяной самолёт. Который не летает.
К примеру, любой человек, который понимает пхп хотя бы на базовом уровне (я знаю, таких мало, но они есть), легко приведет пример кода, который все равно пропустит sql-injection даже после всех этих шаманских заклинаний.
Потому что к защите они не имеют никакого отношения.какие функции в нем на самом деле должны быть?Никакие.
Любое "экранирование" должно применяться в зависимости от контекста.
Для защиты от sql-injection вообще никак не надо экранировать, а применять подготовленные выражения.
При выводе в HTML надо применять htmlspecialchars. Но только при выводе. А не перед записью в базу данных.
При выводе в каком-либо другом контексте, например в тело кода яваскрипт, правила будут другие.
Я обычно использую встроенную "защиту" PDO, обработка всяких GET и POST выглядит так:$sql = 'INSERT INTO items SET
	        name = :name,
	        description = :description,
	        price = :price,
	        date = NOW(),
	        category_id = :category_id,
	        address = :address,
	        image = :image,
	        user_id = :user_id';
	    $s = $pdo->prepare($sql);
	    $s->bindValue(':name', $_POST['name']);
	    $s->bindValue(':description', $_POST['description']);
	    $s->bindValue(':price', $_POST['price']);
	    $s->bindValue(':address', $_POST['address']);
	    $s->bindValue(':category_id', $_POST['category_id']);
	    $s->bindValue(':image', $_FILES['image']['name']);
	    $s->bindValue(':user_id', $_SESSION['id']);
	    $s->execute();