Что конкретно делает эта функция mysqli_real_escape_string()?
Это хороший вопрос, в первую очередь потому что найти человека, который знает правильный ответ, практически нереально. Опроси 10 похапешников, 10 из них тебе наплетут ереси, которая не имеет с реальностью ничего общего. Любой, кто заикнется про SQL инъекции, уже облажался.

При том что функция эта совершенно примитивная - экранировать кавычки в строках SQL. Для соблюдения корректного синтаксиса. Это единственная функция этой функции, и больше ни для чего она не нужна.

Как ты, наверное, уже знаешь, строки в SQL берутся в кавычки:
SELECT * FROM table WHERE name='vasya'
Вот чтобы vasya не приняли за имя таблицы или ключевое слово, его берут в кавычки. Очень просто. Но иногда у человека имя не просто вася. Что будет вот с таким запросом?
SELECT * FROM table WHERE name='Я Д'Артаньян, а все вокруг ...'
Мясорубка будет. БД решит, что имя - это 'Я Д', а дальше какая-то фигня, которую она не понимает. И выдаст ошибку.
Поэтому кавычки надо экранировать.
SELECT * FROM table WHERE name='Я Д\'Артаньян, а все ...'
никаких ошибок не выдаст.
Вот mysqli_real_escape_string() как раз этим и занимается - экранирует кавычку слешем, а заодно и сам слеш, потому что если слеш окажется в конце строки, 
SELECT * FROM table WHERE text='Мну сегодня в любви вкладкой ошиблись :\'
то БД решит, что последняя кавычка экранирована, и строка не заканчивается. Снова мясорубка.
Также mysqli_real_escape_string() экранирует еще несколько символов, но уже из чисто эстетических соображений. 

Еще одна функция этой функции - принимать в расчет кодировку текста. Есть кодировки, в которых слеш - это не слеш, а часть другого символа. И когда БД будет парсить запрос, она не поймет, что это слеш, а решит что это просто буква. И снова мясорубка.
Поэтому перед использованием mysqli_real_escape_string() надо сказать БД, в какой кодировке у нас данные, с помощью функции mysqli_set_charset().

Но читатель уж сучит ножками в нетерпении - а что же SQL инъекции, о которых так долго говорили большевики? Не может же быть, чтобы они были совсем не при чем. Окей, в качестве побочного эффекта, строка, в которой экранированы спецсимволы (слеш и кавычка), не пропустит инъекцию. Но здесь следует понимать две вещи:

1. Строки надо форматировать в любом случае, независимо от того, ждем мы инъекцию, или нет. Мясорубка нам точно так же не нужна. 
2. Строками синтаксис SQL запросов не исчерпывается. Есть числовые литералы, есть имена полей. Для всех них mysqli_real_escape_string() бесполезна чуть более чем полностью. 

То есть, отсюда можно сделать вывод, что нельзя использовать mysqli_real_escape_string() для защиты от инъекций. Она предназначена для другого. Вот для этого другого, для форматирования строк, ее использовать можно. Но не нужно.

Нашлись умные люди, которые придумали, что колупаться вручную с форматированием переменных для SQL запроса - это долго, неудобно, и можно что-то забыть или перепутать. И пусть лучше БД сама этим занимается. И придумали вместо переменных подставлять в запрос специальные маркеры, а сами переменные передавать отдельно. А БД уже потом сама разберется, что и как форматировать. 

В принципе, mysqli умеет так делать, но не так удобно как PDO.  Поэтому при возможности вместо нее лучше использовать PDO:
$stmt = $pdo->prepare("SELECT * FROM table WHERE name=? or name=?")
$stmt->execute(["Vasya", "Д'Артаньян"]);
$rows = $stmt->fetchAll(); - и получить, в итоге, готовый массив с данными, которые вернула БД. 
Если же возможности нет, то кода придется написать чуть побольше
$stmt = $mysqli->prepare("SELECT * FROM table WHERE name=? or name=?")
$stmt->bind_param("ss", ...["Vasya", "Д'Артаньян"]);
$stmt->execute();
$rows = $stmt->fetch_all(MYSQLI_ASSOC);

Но при этом всё равно никакой тебе возни с кавычками, слешами, real, escape, и прочей ерундой. Просто, быстро, лаконично и безопасно.
Эта функция для тех, кто не освоил подготовленные выражения и продолжает конструировать SQL-запросы конкатенацией строк. Добавляет бэкслэши перед символами вроде кавычек и переносов, чтобы доброумышленник смог невозбранно сохранять в ней кавычки (одиночные и двойные), переходы на новую строку (как CR, так и LF), \Z, бэкслэши, символы с нулевым кодом, и не смог "нечаянно" совершить SQL-укольчик с галоперидолом, при условии, что автор кода умеет правильно пользоваться этой функцией, всегда вручную обрамляет полученный результат в одинарные кавычки, а также не использует расово неверных кодировок, способных трактовать бэкслэш как часть предыдущего многобайтного символа на радость доброумышленнику.
Дисклеймер для зануд:
Функция mysqli_real_escape_string принимает на вход строковой тип данных. Крайне не рекомендуется передавать туда числа, булевы переменные, массивы, объекты, совать туда пальцы, другие части тела, животных, детей, беременных женщин, веганов, инвалидов, ветеранов войны, пассажиров с детьми, оружие, взрывчатые вещества, радиоактивные вещества, химические вещества, наркотики, лекарственные препараты, продукты питания, отходы жизнедеятельности, детскую порнографию, суицид, биткойны, экстремистские материалы, фашистскую символику, религиозную символику, политическую символику, чиновников, депутатов госдумы, президента, иллюминатов, лидера всемирного заговора лично, а также собственную самооценку. Несоблюдение этих правил может стоить вам здоровья (как физического, так и психического), жизни, счастья, хорошего настроения, пенсии, душевного равновесия, целостности скреп, баланса во вселенной. С целью надзора за соблюдением правил к вам был приставлен персональный товарищ майор, отслеживающий каждое ваше действие, а также каждое ваше бездействие. Запрещено передавать товарища майора в функцию, так как это может привести к коллапсу солнечной системы и к гибели человечества. Мы предупредили. Не стоит вскрывать эту тему.