Проблема в пихании в код разных умных слов без понимания их смысла.
Если убрать из кода слово MYSQLI_USE_RESULT, то волшебным образом ошибка исчезнет.
Впрочем, я должен признать, что сермяжная правда в двух других ответах есть. Если последовать моему же совету, и использовать prepare/execute вместо query (поскольку эта парочка используе USE_RESULT без вариантов), то как раз и придется либо выбирать все данные, которые вернул запрос, либо освобождать ресурс через free(), либо перед выборкой дергать store_result().
Но - повторюсь - в текущем коде этот параметр не имеет смысла и в то же время является причиной всех бед.
Но проблемы этого кода на этом только начнутся.
Во-первых, НИКОГДА больше пиши так: die(mysqli_error($mysqli)); а то станешь козленочком и тебя заберут в армию.
Вместо die надо писать trigger_error()
Во-вторых, НИКОГДА не подставляй переменные напрямую в строку запроса. Передавать данные надо
только через плейсхолдеры. Если родной механизм слешком сложный, то можешь воспользоваться библиотекой
phpfaq.ru/safemysql и код получится таким.
$exists = $db->getOne("SELECT 1 FROM users WHERE social_id=?s",$social_id);
if($exists){
//тут устанавливаются куки
}else{
$db->query("INSERT INTO users (social_id) VALUES (?s)", $social_id);
}
(выводить бессмысленные okay или oops не нужно)