Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пользовательская функция в Пользовательской функции

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Santehnick
Отправлено: 05 Сентября, 2010 - 11:29:00
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Написал две функции Улыбка

Функция проверки логина
PHP:
скопировать код в буфер обмена
  1.  
  2.         function check_add_to_mysql($login)
  3.         {
  4.                 global $db ;
  5.                
  6.                 $sql = "SELECT login FROM users WHERE login='" . $login . "'" ;
  7.                 $result = $db->sql_query($sql) ;
  8.                 $row = $db->sql_fetchrow($result) ;
  9.                
  10.                 if($login == '') {
  11.                         $error .= "Вы забыли указать логин персонажа.<br />" ;
  12.                 }
  13.                 if(strlen($login) < 2 or strlen($login) > 15){
  14.                         $error .= "Логин не может быть короче 2-х символов и длиннее 15-ти.<br />" ;
  15.                 }
  16.                 if(preg_match("![A-Za-z]!i",$login) and preg_match("![А-Яа-я]!i",$login)) {
  17.                         $error .= "В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.<br />" ;
  18.                 }
  19.                 if(preg_match("!^\d[A-Za-zА-Яа-я]!i",$login)) {
  20.                         $error .= "Логин не может начинаться с цифры.<br />" ;
  21.                 }
  22.                 if(preg_match("![^a-zA-ZА-Яа-я-_\s]!i",$login,$matches)) {
  23.                         $error .= "Вы использовали в логине запрещенный символ: " .$matches[0]. ".<br />" ;
  24.                 }
  25.                 if(preg_match("!(.)\\1\\1!", $login)) {
  26.                         $error .= "Запрещено использование трех и более одинаковых символов подряд.<br />" ;
  27.                 }
  28.                 if(preg_match("!([-_\s])\\1!", $login)) {
  29.                         $error .= "Запрещено использовать два разделительных символа подряд.<br />" ;
  30.                 }
  31.                 if(substr_count($login,"-") > 2 or
  32.                    substr_count($login," ") > 2 or
  33.                    substr_count($login,"_") > 2) {
  34.                         $error .= "Не более двух пробелов, тире или символов подчеркивания.<br />" ;
  35.                 }
  36.                 if(!preg_match("!^[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я_ -\s]+[a-zA-Zа-яА-Я]$!",$login)) {
  37.                         $error .= "Логин не может начинаться или заканчиваться пробелом, тире или символом подчеркивания.<br />" ;
  38.                 }
  39.                 if($row['login'] == $login) {
  40.                         $error .= "Логин $login уже занят, выберите другой.<br />" ;
  41.                 }
  42.                                                                        
  43.                 return $error ;
  44.         }
  45.  


И функция добавления в базу данных

PHP:
скопировать код в буфер обмена
  1.  
  2.         function add_to_mysql($login)
  3.         {
  4.                 global $db ;
  5.                
  6.                 $sql = "INSERT INTO `users` (`borncity`,`login`,`pass`,`email`,`realname`,`borndate`,`sex`,`ip`,`shadow`,`refer`) VALUES('Авалон','$login','".md5($_POST['password'])."','{$_POST['email']}','{$_POST['name']}','1','{$_POST['sex']}','127.0.0.1','1','1')" ;
  7.                 $result = $db->sql_query($sql) ;
  8.                
  9.                 $good = "Все прошло успешно!" ;
  10.                
  11.                 return $good ;
  12.         }
  13.  


Мне нужно использовать первую функцию во второй функции, т.е. когда я вызываю в нужно месте функцию add_to_mysql(параметр) мне нужно чтобы внутри неё выполнялась функция check_add_to_mysql(параметр), возращала $error и эта переменная отображалась бы на экране.

Пробовал делать так

PHP:
скопировать код в буфер обмена
  1.  
  2.         function add_to_mysql($login)
  3.         {
  4.                 global $db ;
  5.                 if($this->check_add_to_mysql($login)) return $error ;
  6.                
  7.                 $sql = "INSERT INTO `users` (`borncity`,`login`,`pass`,`email`,`realname`,`borndate`,`sex`,`ip`,`shadow`,`refer`) VALUES('Авалон','$login','".md5($_POST['password'])."','{$_POST['email']}','{$_POST['name']}','1','{$_POST['sex']}','127.0.0.1','1','1')" ;
  8.                 $result = $db->sql_query($sql) ;
  9.                
  10.                 $good = "Все прошло успешно!" ;
  11.                
  12.                 return $good ;
  13.         }
  14. }
  15.  


то в базу уже не записывает, видимо все-таки что-то возращается, но и на экран тоже ничего не выводится при вызове функции Недовольство, огорчение
 
 Top
JustUserR
Отправлено: 05 Сентября, 2010 - 13:09:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Santehnick пишет:
Мне нужно использовать первую функцию во второй функции
В языке PHP все пользовательские функции не являются объектами первого рода и всегда сохраняются в глобальной области видимости и являются независимыми от местоположения их определения - тем не менее функции в общем виде могут находиться в некотором пространстве имен определяемым именем класса и операцией расширения области видимости При этом несмотря на то что пользовательские функции являются инвариантными относительно расположения их описания - тем не менее добавление очередной функции в общую таблицу присходит только после явного выполнения кода в которой находится ее определение - таким образрм одна функция может быть определена внутри другой но это означает лишь ее отложенное добавление к общей таблице функций
Для вызова одной пользовательской функции внутри другой необходимо только удостовериться что в указанный момент запрашиваемая функция уже инициализирована - и ее жальшейший выхов происходит только по имени


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Santehnick
Отправлено: 05 Сентября, 2010 - 13:28:50
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




JustUserR пишет:
Santehnick пишет:
Мне нужно использовать первую функцию во второй функции
В языке PHP все пользовательские функции не являются объектами первого рода и всегда сохраняются в глобальной области видимости и являются независимыми от местоположения их определения - тем не менее функции в общем виде могут находиться в некотором пространстве имен определяемым именем класса и операцией расширения области видимости При этом несмотря на то что пользовательские функции являются инвариантными относительно расположения их описания - тем не менее добавление очередной функции в общую таблицу присходит только после явного выполнения кода в которой находится ее определение - таким образрм одна функция может быть определена внутри другой но это означает лишь ее отложенное добавление к общей таблице функций
Для вызова одной пользовательской функции внутри другой необходимо только удостовериться что в указанный момент запрашиваемая функция уже инициализирована - и ее жальшейший выхов происходит только по имени

такое чувство что какой-то абзац из книги, мне не это вовсе нужно, а решение проблемы, почему не работает. Мои функции находятся в классе, я прежде чем записать новую строку в Базу Данных, хочу проверить её своей функцией, которая проверяет корректно ли заполнено поле.
 
 Top
JustUserR
Отправлено: 05 Сентября, 2010 - 13:33:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Santehnick пишет:
Мои функции находятся в классе, я прежде чем записать новую строку в Базу Данных, хочу проверить её своей функцией, которая проверяет корректно ли заполнено поле.
Если вы используете класс для инкапсуляции собственного соединения с БД то желательно сохранять все переменные внутни него - в вашем случае получается что вы испоьзуете внешнюю переменную к которой обращаетесь в оператором global в то время как для каждого экземпляра класса доступ должен быть через $this-объект


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Santehnick
Отправлено: 05 Сентября, 2010 - 13:50:43
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




JustUserR пишет:
Santehnick пишет:
Мои функции находятся в классе, я прежде чем записать новую строку в Базу Данных, хочу проверить её своей функцией, которая проверяет корректно ли заполнено поле.
Если вы используете класс для инкапсуляции собственного соединения с БД то желательно сохранять все переменные внутни него - в вашем случае получается что вы испоьзуете внешнюю переменную к которой обращаетесь в оператором global в то время как для каждого экземпляра класса доступ должен быть через $this-объект

да блин причем тут глобал вообще. я пишу о том, что мне нужно вызвать как-то функцию проверки(#1) в функции добавления в базу данных новой строки(#2) и все! больше ничего, все остальное у меня работает нормально. И я писал что функции находятся в одном классе, так же говорил что в функции add_to_mysql я пробовал вызывать функцию check_add_to_mysql, вот таким образом $this->check_add_to_mysql($login) ; именно при помощи ключевого слова $this, потому что еще раз говорю обе функции находятся в одном классе.

Чтобы потом когда я создам объект и обращусь к функции вот так
PHP:
скопировать код в буфер обмена
  1. echo $reg->add_to_mysql($login) ;
у меня в этой функции чтобы сработала функция проверки (check_add_to_mysql) и вывела мне переменную $error на экран, точнее её содержимое, а если все условия пройдутся нормально, то запись добавлялось в базу данных. А сейчас у меня не хочет работать функция проверки в функции добавления, когда я вызываю её $this->check_add_to_mysql($login) ; вот так, она не срабатывает и данные сразу добавляются в базу, не знаю уже как объяснить.

global $db это сделано для того, чтобы я мог обратиться к объекту $db и работать с его функциями, например с sql_query. это у меня все работает прекрасно.
(Добавление)
все сам догнал, всего-то надо было в функции добавления написать вот так:

$err = $this->check_add_to_mysql($login) ;
if($err) return ($err) ;

тогда все работает как нужно. А написано что портал для новичков, а скидывают какие-то абзацы из книг мне Огорчение

(Отредактировано автором: 05 Сентября, 2010 - 14:01:42)

 
 Top
Мелкий Супермодератор
Отправлено: 05 Сентября, 2010 - 14:40:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




PHP:
скопировать код в буфер обмена
  1.  if($this->check_add_to_mysql($login)) return $error ;

А сохранять то, что вернула функция кто будет?
PHP:
скопировать код в буфер обмена
  1.  if($tmp = $this->check_add_to_mysql($login)) return $tmp ;


Santehnick пишет:
да блин причем тут глобал вообще

К тому, что так вообще не делают. Что оно работает - это понятно, но так не делают.
Кстати, у вас спокойно пройдёт SQL инъекция. Всё, что идёт из внешних источников (в первую очередь $_GET, $_POST, куки) в базу экранируйте через mysqli_real_escape_string / mysql_real_escape_string (в зависимости от того, какую используете библиотеку)

(Отредактировано автором: 05 Сентября, 2010 - 14:44:50)



-----
PostgreSQL DBA
 
 Top
Santehnick
Отправлено: 05 Сентября, 2010 - 14:56:25
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Мелкий пишет:
PHP:
скопировать код в буфер обмена
  1.  if($this->check_add_to_mysql($login)) return $error ;

А сохранять то, что вернула функция кто будет?
PHP:
скопировать код в буфер обмена
  1.  if($tmp = $this->check_add_to_mysql($login)) return $tmp ;


Santehnick пишет:
да блин причем тут глобал вообще

К тому, что так вообще не делают. Что оно работает - это понятно, но так не делают.
Кстати, у вас спокойно пройдёт SQL инъекция. Всё, что идёт из внешних источников (в первую очередь $_GET, $_POST, куки) в базу экранируйте через mysqli_real_escape_string / mysql_real_escape_string (в зависимости от того, какую используете библиотеку)


спасибо. На счет sql-injection в курсе, как защититься тоже, написал пользовательскую функцию простенькую от защиты sql-injection, просто буду перед запросом все переменные ей обрабатывать, пока не успел просто сделать этого.
 
 Top
JustUserR
Отправлено: 06 Сентября, 2010 - 16:43:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Santehnick пишет:
Нужно вызвать как-то функцию проверки(#1) в функции добавления в базу данных новой строки(#2) и все!
В языке PHP до интерпретатора версии 5.3 все создаваемые пользовательские функци записанные в уровне исходного кода не являются объектами первого рода - тем не менее возможности ООП позволяют сохранять функции не в общей глобальной области - а распределять их по пространствам имен определяемых именем класса
Соответственно функции в PHP не хранят контекст по определению - и для вызова некоторого метода в классе обязательно указать конкретный экземпляр к которому идет применение - иначе в качестве идентификатора вызываемой функции будет использовать элемент из глобальной области видисти То есть доступной формой вызова метода является $this->method или class::method - при этом в отсутствие оператора static объект текущего экзампляра передается автоматически
Santehnick пишет:
А написано что портал для новичков, а скидывают какие-то абзацы из книг мне
В предыдущем сообщении я не передавал вам цитату из книги или общедоступной статьи - приведенный текст описывает общий механизм работы функций в классах


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB