Почему биндить в PDO надо обязательно переменную?
Ну вообще-то в сообщении об ошибке всё сказано. C bindParam можно использовать только переменные. Потому что биндинг идёт по ссылке (by reference). А на строку, вписанную прямо в коде, ссылку не поставишь. В этом случае надо использовать другой метод
$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindValue(":tel", '79998887766');
или вообще передавать данные сразу в execute():
$pdo->prepare(" INSERT INTO `main` SET tel=:tel")->execute(["tel" => '79998887766']);
и всё будет работать
Потому что при таком подходе можно переиспользовать подготовленное выражение - один раз prepare + bind'ы и потом множество раз execute()
$tel = '79998887766';

$b=$pdo->prepare(" INSERT INTO `main` SET tel=:tel");
$b->bindParam(":tel", $tel);

$b->execute();

$tel = '5454545454';
$b->execute();

$tel = '1231231233';
$b->execute();