Вернуться на страницу трюков

Инициализация переменных или register_globals

Очень часто эта ошибка встречается, человек на своём компютере запустил - работает, залил на сервер - не идёт обращение к бд. Обычно страница выглядит так:
<?php
mysql_query("SELECT * FROM `table` WHERE `id`='".$id."'");

При этом кажется, что если передача была через $_GET, то должно работать, а это совсем не так.

Что значит инициализация переменной - это полученные данные из формы или адресной строки перевести в обычную переменную с которой в дальнейшем будем работать, из глобальной в обычную:
<?php
$id = $_GET['id']; // вот мы и инициализировали её

Теперь верхний скрипт будет работать. В чём же была беда? На старых серверах или денвере register_globals включена, сейчас же из практики автоматически эту настройку выключают.
Итак, при включенном register_globals $id и $_GET['id'] и $_POST['id'] и $_SESSION['id'] - равны, то есть инициализация проходит без ведома пользователя. Ранее это было удобно, сейчас же стал вопрос хакерства ребром, и достаточно пользователю ввести в адресной строке index.php?description='lalala', то сам скрипт получит $description, а это делать нельзя. Поэтому эту директиву отключают, а инициализируют вручную, то есть мы создаём область скрипта и переменных, в которых работаем, и не позволяем из-вне попасть к ним.

Так же стоит заметить, не всегда нужно инициализировать переменную, особенно когда лишняя переменная - это одна ячейка памяти на сервере, поэтому если мы не собираемся внутри скрипта проводить какие-то дополнительные операции помимо одно простого действия как "вставить", то нам достаточно сделать вид обращения к БД такой:
<?php
mysql_query("SELECT * FROM `table` WHERE `id`='".$_GET['id']."'");
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы