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 :: Вызов функции, в которой есть SQL из другого файла

 PHP.SU

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


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

> Без описания
lexdevel
Отправлено: 14 Августа, 2013 - 22:30:31
Post Id


Новичок


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


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




Всем привет!

Я сразу прошу прощения за, наверное, идиотский вопрос, однако тема всплыла, надо порешать, гугл не помог.

Ситуация: я сам c++ разработчик, но так получилось, что надо на PHP сделать регистрацию. Ну и пошел по сишному)
Дабы не углубляться в процесс изучения ООП на PHP, решил сделать эту тривиальную задачу функционально.

Сделал файл functional.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.     $mysql_host = ""; // Host
  4.     $mysql_user = ""; // User
  5.     $mysql_pass = ""; // Password
  6.     $mysql_base = ""; // Database Name
  7.  
  8.     function registerUser($login, $password) {
  9.         $link = mysqli_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_base);
  10.         // ... etc
  11.         // if some error -> return false;
  12.         mysqli_close($link);
  13.         return true;
  14.     }
  15. ?>
  16.  


Ну и register.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP include "functional.php"; ?> // Also I tried requere, requere_once...
  3. // ...
  4. <?PHP
  5.     $login = $_POST["login"];
  6.     $pass = $_POST["password"];
  7.  
  8.     if(registerUser($login, $password) == false) {
  9.         // Here error message and return
  10.     }
  11.     // Here page redirecting to index.php with current $_SESSION filled with Id, etc...
  12. ?>
  13. // ...
  14.  


Странно то, что зависает на соединении, и ничего не выдает((
Страница грузится прямо до момента вызова функции mysqli_connect

НО: Если ЭТО ЖЕ САМОЕ сделать в одном файле - все работает нормально)

Подскажите, пожалуйста, что не так?

Спасибо!

(Отредактировано автором: 15 Августа, 2013 - 12:37:56)

 
 Top
imya
Отправлено: 14 Августа, 2013 - 22:50:15
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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




Как-то вы странно коннектитесь к базе через mysqli
Почитайте http://www.php.net/manual/ru/mys....connections.php


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
lexdevel
Отправлено: 14 Августа, 2013 - 22:58:48
Post Id


Новичок


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


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




imya пишет:
Как-то вы странно коннектитесь к базе через mysqli
Почитайте http://www.php.net/manual/ru/mysqli.quickstart.connections.php

Да, я видел, но мне непривычен в PHP ООП интерфейс, как я уже говорил, к тому же разрабы специально для таких как я оставили функциональный интерфейс. Но суть вопроса не в этом
 
 Top
imya
Отправлено: 14 Августа, 2013 - 23:09:21
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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




Допишите
взято из мануала:
PHP:
скопировать код в буфер обмена
  1. if (mysqli_connect_errno($link)) {
  2.     echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
  3. }

И посмотрите, что за ошибку выдаст

(Отредактировано автором: 14 Августа, 2013 - 23:11:17)



-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
lexdevel
Отправлено: 14 Августа, 2013 - 23:14:48
Post Id


Новичок


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


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




imya пишет:
Допишите
взято из мануала:
PHP:
скопировать код в буфер обмена
  1. if (mysqli_connect_errno($link)) {
  2.     echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
  3. }

И посмотрите, что за ошибку выдаст

Эм... я просто не написал этого в сообщении, но мануалы читать умею, поэтому поставил коммент, что возвращаю false. Проверяю я ошибки)
Суть в том, что функция "зависает" и дальше обработка не происходит.
Тут вся суть в том, что 2 файла, я хз почему, т.к. ситуация нелогичная абсолютно. Если вкинуть в один файл, то все работает.

(Отредактировано автором: 14 Августа, 2013 - 23:16:41)

 
 Top
imya
Отправлено: 14 Августа, 2013 - 23:22:49
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


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





Да уж...жаль пошаговой отладки нет


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
lexdevel
Отправлено: 14 Августа, 2013 - 23:24:45
Post Id


Новичок


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


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




imya пишет:

Да уж...жаль пошаговой отладки нет

Ладно, и на этом спасибо)
 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2013 - 23:39:02
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




lexdevel:

1) Все переменные нет нужды объявлять в начале. Их можно объявлять на лету динамически прямо по ходу выполнения. Понадобилась переменная - декларируй.

2) Существует область видимости, и переменная объявленная внутри ф-ции не видна извне. А те кто объявлен вне ф-ции не видны внутри неё.

3) Вместо пошаговой отладки используй конструкцию вида: exit("Check message! Value = " . $var);

4) Примеры использования у нас не очень, сейчас найду что-то ближе к теме с нормальным перехватом ошибок.
 
 Top
lexdevel
Отправлено: 14 Августа, 2013 - 23:49:17
Post Id


Новичок


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


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




DeepVarvar пишет:
lexdevel:

1) Все переменные нет нужды объявлять в начале. Их можно объявлять на лету динамически прямо по ходу выполнения. Понадобилась переменная - декларируй.

2) Существует область видимости, и переменная объявленная внутри ф-ции не видна извне. А те кто объявлен вне ф-ции не видны внутри неё.

3) Вместо пошаговой отладки используй конструкцию вида: exit("Check message! Value = " . $var);

4) Примеры использования у нас не очень, сейчас найду что-то ближе к теме с нормальным перехватом ошибок.


1) Нет нужны - это не значит, что это есть ошибка, просто привычка такая уже выработалась
2) Я тоже читал про это, даже на сайте здесь урок по зонам видимости, но опять же, в моем случае - все должно быть видно
3) Я пока что сделал функцию эха пошагово на экран, заполняел по типу "<li>$message</li>", так и отловил, что функция "зависает"
4) Пример придумал вообще самый простой, чтобы просто потестить и не заморачиваться. БД, Таблица юзеров 3 поля (Id, Login, Password), никакого шифрования/хэширования и т.д. В общем, чисто для теста чтобы минимум времени потратить и разобраться в проблеме...

А вообще, спасибо за ответ. И за поиски примера) Может реально поможет)

(Отредактировано автором: 14 Августа, 2013 - 23:52:04)

 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2013 - 23:58:09
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




5) Нет нужды ставить закрывающий тег в конце файла. Это даже помогает. Но не будем углубляться.

6) Накидал пример с пояснениями:


functional.php:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function registerUser($my, $login, $password) {
  4.  
  5.   // магия
  6.   if ( !$link = mysqli_connect($my['host'], $my['user'], $my['pass'], $my['base']) ) {
  7.     exit("Connect failed: " . mysqli_connect_error());
  8.   }
  9.  
  10.   // ... etc
  11.   // ф-ция всегда сама возвращает NULL,
  12.   // а это при проверке посчитается за false,
  13.   // return используем только тогда когда он явно нужен,
  14.   // чтобы досрочно прекратить выполнение функции
  15.   mysqli_close($link);
  16.   return true;
  17. }


register.php:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. require "functional.php"; // Именно require чтобы ругнулся если файло не найдет
  4. // ...
  5.  
  6. $my = array(
  7.  
  8.   "host" => "", // Host
  9.   "user" => "", // User
  10.   "pass" => "", // Password
  11.   "base" => "" // Database Name
  12.  
  13. );
  14.  
  15. $login = $_POST["login"];
  16. $pass = $_POST["password"];
  17.      
  18. if( !registerUser($my, $login, $password) ) {
  19.   // тут только сообщение об ошибке,
  20.   // пыху плевать что ты там вернешь минус один или еще что-то
  21.   // мы всеравно уже в глобальном scope
  22. }
  23. // Here page redirecting to index.php with current $_SESSION filled with Id, etc...
 
 Top
Okula
Отправлено: 14 Августа, 2013 - 23:59:48
Post Id



Участник


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


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




lexdevel, ничего у тебя не будет видно.
Переменные $mysql_host, $mysql_user, $mysql_pass и $mysql_base не видны внутри функции registerUser() потому что у них разные области видимости.
Как заставить их быть видными внутри функции: использовать ключевое слово global
Выглядеть будет так:
PHP:
скопировать код в буфер обмена
  1. $mysql_host = ""; // Host
  2. $mysql_user = ""; // User
  3. $mysql_pass = ""; // Password
  4. $mysql_base = ""; // Database Name
  5.  
  6.  
  7. function registerUser($login, $password) {
  8.     global $mysql_host, $mysql_user, $mysql_pass, $mysql_base;
  9.     $link = mysqli_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_base);
  10.     // ... etc
  11.     // if some error -> return false;
  12.     mysqli_close($link);
  13.     return true;
  14. }

Вот теперь всё будет работать. Но использовать ключевое слово global крайне не рекомендуется, это деает код жёстко привязанным и не удобным. В дальнейшем такой код будет сложно модифицировать.
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Августа, 2013 - 00:02:00
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




lexdevel пишет:
2) Я тоже читал про это, даже на сайте здесь урок по зонам видимости, но опять же, в моем случае - все должно быть видно
Так посмотри внимательнее, ты не передал в ф-цию данные для коннекта, и говоришь что все должно быть видно.
 
 Top
Okula
Отправлено: 15 Августа, 2013 - 00:02:41
Post Id



Участник


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


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




Ну а вообще я не вижу необходимости в создании этой функции. Если уж взялся писать всё в структурном стили то и пиши так. У тебя же получается что ты пытаешься создать функцию ради функции.
 
 Top
lexdevel
Отправлено: 15 Августа, 2013 - 00:02:59
Post Id


Новичок


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


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




DeepVarvar пишет:
5) Нет нужды ставить закрывающий тег в конце файла. Это даже помогает. Но не будем углубляться.

6) Накидал пример с пояснениями:


5. Эм... Не понял ... Ладно, не будем углубляться, все равно я скоро вернусь к своему любимому с++ и... нет, этого я уже не забуду)
6. "Магия" - это круто)

В общем, спасибо огромное) Буду пытаться)
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Августа, 2013 - 00:03:10
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Okula, если говоришь что глобал = зло, то и советовать человеку не надо.
Кроме того ему ближе по сути показать передать в аргументах, что я и сделал.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB