Forum Webscript.Ru
Программирование => PHP => Тема начата: vladimir2004 от 08 Апреля 2004, 12:27:18
-
У меня стоит php4 и IIS 5. Есть к примеру файл index.php, а в нем к примеру такой текст:
echo "$param
";
?>
Из адресной строки бровзера я вызываю скрипт таким образом: index.php?param=1 или index.php?param=4 или index.php?param=test
и в ответ выводится ВСЕГДА пустая строка, параметры не передаются, в чем грабли? Настройки php или IIS или еще где? Помогите плизззззз.
-
vladimir2004
register_globals=Off
-
так в php.ini и стоит:
; You should do your best to write your scripts so that they do not require
; register_globals to be on; Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = Off
какие будут еще предложения?
-
vladimir2004, теоретик именно это и имел в виду
http://faq.phpclub.ru/register_globals
-
AliMamed , ты, кстати, согласен с куском про причины и безопасность?
-
Этим?
Разработчики PHP настоятельно рекомендуют выключать register_globals (такой режим даже введен по умолчанию во всех новых версиях) и пользоваться данными, полученными от пользователя, только обращаясь к соответствуюим массивам.
Это сделано потому, что при register_globals = on легко взломать небрежно написаный скрипт.
К примеру, функция авторизации выставляет переменную $admin=1, а если авторизации не было, то не делает ничего. В таком скрипте при register_globals=on очень легко стать админом, просто обратившись к нему script.php?admin=1
Огоромное количество сайтов было взломано таким образом.
конечно
-
Спасибо, все заработало, а теперь еще такой вопрос:
Есто index.htm и index.php, в index.htm есть форма
как передать в index.php в переменную param2 значение поля text (с именем n) по нажатию кнопки? если action="index.php?param2=n", то передается n, а не значения этогого бокса.
-
не, ниже.
про то, что это нужно не само по себе, что сам регистер глобалс - пофигу, он или офф.
а нужен он исключительно, как побудительный мотив к тому, что надо обязательно объявлять каждую переменную перед использованием.
Довольно непривычное утверждение, но я пришел именно к этому выводу
-
vladimir2004
И НИКАКИХ извращений.
Проще надо быть.
-
я согласен с тем что в подавляющем большинстве случаев переменные надо заявлять. да более того, я после того разговора специально полазил по своим файликам и обнаружил, что у меня это видимо автоматически происходит на подсознательном уровне=) но с тем что в РНР нужно заявлять все переменные я не готов согласиться, ибо разные ситуации бывают.
естественно ничего плохого не будет от заявления переменных, которые из вне подставить невозможно. но это ж не влияет на безопасность.
вот если ты имеешь в виду Именно объявление ВСЕХ переменных, используемых в скрипте и являетс гарантией от взлома.
вот этот кусок. то если честно меня такие обобщения мягко говоря смущают. не люблю я глобальные обобщения. =)
-
AliMamed:
видимо автоматически происходит на подсознательном уровне
Это у тебя из ИБМовской разновидности Васика +)
-
ThE0ReTiC:
Это у тебя из ИБМовской разновидности Васика +)
может быть=)
-
Все заработало, спасибо.
Есть теперь такой вопрос:
есть переменная $num, она получает знаение поля из MySQL таблицы, но там идет текст, а потом пробелы (поле типа char). Вопрос: как удалить из значения переменной пробелы в конце после текста???
-
$num=rtrim($num);
-
$name - передается из формы на html странице
кусок скрипта на php:
echo "name to search -$name-
";
$all=mysql_query("select count(*) from phones");
$i=0;
do
{
$result = mysql_query("SELECT name FROM phones");
$num = mysql_result($result, $i);
echo "Pro4tenaya-$num-, Peredanaya-$name-
";
$num=trim($num);
$name=trim($name);
if (ereg($name,$num));
{
идет вывод записи
}
$i=$i+1;
}
while ($i<$all);
выводит прочтенную и переданную одинаковые (хотя это не факт, т.к. в html не видно пробелов), и все равно ни раза не заходит в цикл, ели переменные равны, хотя вводится на 100% существующее имя в базе. В чем грабли?
-
матерь божья
быстро читать доки
сделать
"SELECT name FROM phones WHERE name LIKE \'%".$name."%\'"
и выбрать все что нужно одним запросом никак совсем?
-
привел скрипт с ошибкой:
if (ereg($name,$num)) НЕТ ДВОЕТОЧИЯ
{
идет вывод записи
}
и в цикл не заходит
-
vladimir2004:
ereg
eregi
-
vladimir2004:
$all=mysql_query("select count(*) from phones");
ты вообще в курсе что возвращает mysql_query ?
а если я напишу
$all = mysql_query("SELECT 1+1");
она мне по-твоему 2 вернет?
-
$all=mysql_query("select count(*) from phones");
Вохзвращает количество ВСЕХ записей в таблице
-
vladimir2004:
Вохзвращает количество ВСЕХ записей в таблице
да ну
[p]mysql_query[/p]
разработчики PHP конечно не правы
-
vladimir2004
запрос
select count(*) from phones
возвращает кол-во записей в таблице, НО не функция mysql_query().
Функция возвращает "ресурс" (resource - не знаю как корректно перевести его на русский) на результат запроса. С помощью этого resource можно узнать, что вернул запрос.
Для этого нужно использовать функции, типа mysql_fetch_*()
-
Макс
там вообще не нужен этот запрос!
там вообще все выбирается ОДНИМ запросом а не этим диковато-придурковатым дерганьем базы в цикле с последующим использования строковых функций.
написан полный бред
-
ThE0ReTiC
я ему пытался объяснить разницу между тем, что возврщает запрос и что возвращает функция, выполняющая этот запрос. Так как он эту разницу не понимает.
А насчет его кода - ничего страшного, я видел и хуже :)
-
хороше, ЗНАТОКИ, привидите пожалуйста тогда пример кода, который ищет в базе (поля phone(int), name(varchar), surname(varchar), wplase(varchar)) все записи, где поле name (имя) равно переменной $name и вывоид их на экра, буду очень признателен, я ведь не асс п ПХП еще:(
-
"SELECT * FROM phones WHERE name= \'".$name."\'"
с просьбами по изготовлению скриптов - в отдельный форум
-
vladimir2004
[p]mysql_fetch_array[/p]
[p]mysql_fetch_assoc[/p]
[p]while[/p]
[p]print[/p]
-
A print зачем сюда? :)
-
hanslinger
vladimir2004:
вывоид их на экра
тока не надо говорить что использовать лучше - есть 150 способов вывести инфу. Это как раз не принципиальный момент
-
Господа, тут ГРАБЛИ в чем-то другом. Вот код:
$result = mysql_query("SELECT phone, surname FROM phones WHERE name=$name");
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
echo "YES
";
printf ("Phone: %s Surname: %s", $row[0], $row[1]);
}
mysql_free_result($result);
};
Он не работает, в смысле не делает выборку WHERE name=$name, если просто пишу:
$result = mysql_query("SELECT phone, surname FROM phones");
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
echo "YES
";
printf ("Phone: %s Surname: %s", $row[0], $row[1]);
}
mysql_free_result($result);
};
все пашет, но как только добавляю WHERE name=$name, все, стоп машина, хотя имя, вводимое в html странице в базе существует. Что вы скажите на это?
-
Вы развели полемику по поводу ОПТИМИЗАЦИИ кода, хотя проблемма как была в сравнении пременных так и осталась:(
-
$result = mysql_query("SELECT phone, surname FROM phones WHERE name=$name") or die(mysql_error());
-
vladimir2004
а ты уверен, что $name <> "" ?
а ты в курсе, что name=$name ищет точное соответствие?
-
Уверен:
echo "name to search -$name-
";
result = mysql_query("SELECT phone, surname FROM phones WHERE name LIKE \'%".$name."%\'") or die(mysql_error());
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
printf ("Phone: %s Surname: %s", $row[0], $row[1]);
}
mysql_free_result($result);
};
Выводит:
name to search -Игорь-
И ВСЕЕЕЕ.
А это код в INDEX.HTML:
-
Неужели НИКТО не в состоянии определить ГДЕ ГРАБЛИ?????
-
а если написать так:
$result = mysql_query("SELECT phone, surname FROM phones WHERE name=$name") or die(mysql_error());
то выдает:
name to search -Игорь-
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near \'Игорь\' at line 1
Это что такое?
-
vladimir2004:
name=$name
name=\'$name\'
-
Да пробовал, в этом случае выводи просто:
name to search -Игорь-
-
vladimir2004
1. причин может быть много (нужно сидеть и отлаживать)
2. правильно писать name=\'$name\';
3. Проверь, работает ли поиск, если искать по английским словам.
Если работает, то читай здесь (http://tony2001.phpclub.net/faq/mysql.charset.html)
-
Читай МАН по MySQL и РНР. Читай сообщения об ошибках. Внимательно и вдумчиво. Это все лечит.
-
АГА, по английски ищет, будем читать http://tony2001.phpclub.net/faq/mysql.charset.html
-
Нк вроди поменяк кодировку MySQL на cp1251, по английски ищет, но по русски все еще нет. Такой момент, в php скрипте перед поиском вывожу значение переданной переменно:
echo "name to search -$name-
";
$name=trim($name);
$result = mysql_query("SELECT phone, surname FROM phones WHERE name=\'$name\'") or die(mysql_error());
дык оно теперь когра пишу по русски, выводит знаки вопросов, хотя и в html и в php прописанно:
-
Как сделать при register_globals off переход по ссылке с присваеваниваем значения переменной?
Напрмер: у меня есть SQL запрос "SELECT ... FROM ... LIMIT $begin, $limit."
и при помощи ссылки "back" мне надо присвоить переменной $begin значение 10.
( -- не работает.)
-
раота при register_globals off описана в факе http://phpfaq.ru/globals
вместо переменной $begin тебе надо обращаться к соответствующему элементу массива.