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
Форумы портала PHP.SU :: Версия для печати :: Вызов функции, в которой есть SQL из другого файла
Форумы портала PHP.SU » » Вопросы новичков » Вызов функции, в которой есть SQL из другого файла

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

1. lexdevel - 14 Августа, 2013 - 22:30:31 - перейти к сообщению
Всем привет!

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

Ситуация: я сам 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

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

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

Спасибо!
2. imya - 14 Августа, 2013 - 22:50:15 - перейти к сообщению
Как-то вы странно коннектитесь к базе через mysqli
Почитайте http://www.php.net/manual/ru/mys....connections.php
3. lexdevel - 14 Августа, 2013 - 22:58:48 - перейти к сообщению
imya пишет:
Как-то вы странно коннектитесь к базе через mysqli
Почитайте http://www.php.net/manual/ru/mysqli.quickstart.connections.php

Да, я видел, но мне непривычен в PHP ООП интерфейс, как я уже говорил, к тому же разрабы специально для таких как я оставили функциональный интерфейс. Но суть вопроса не в этом
4. imya - 14 Августа, 2013 - 23:09:21 - перейти к сообщению
Допишите
взято из мануала:
PHP:
скопировать код в буфер обмена
  1. if (mysqli_connect_errno($link)) {
  2.     echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
  3. }

И посмотрите, что за ошибку выдаст
5. lexdevel - 14 Августа, 2013 - 23:14:48 - перейти к сообщению
imya пишет:
Допишите
взято из мануала:
PHP:
скопировать код в буфер обмена
  1. if (mysqli_connect_errno($link)) {
  2.     echo "Не удалось подключиться к MySQL: " . mysqli_connect_error();
  3. }

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

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

Да уж...жаль пошаговой отладки нет
7. lexdevel - 14 Августа, 2013 - 23:24:45 - перейти к сообщению
imya пишет:

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

Ладно, и на этом спасибо)
8. DeepVarvar - 14 Августа, 2013 - 23:39:02 - перейти к сообщению
lexdevel:

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

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

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

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

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

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

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

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


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

А вообще, спасибо за ответ. И за поиски примера) Может реально поможет)
10. DeepVarvar - 14 Августа, 2013 - 23:58:09 - перейти к сообщению
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...
11. Okula - 14 Августа, 2013 - 23:59:48 - перейти к сообщению
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 крайне не рекомендуется, это деает код жёстко привязанным и не удобным. В дальнейшем такой код будет сложно модифицировать.
12. DeepVarvar - 15 Августа, 2013 - 00:02:00 - перейти к сообщению
lexdevel пишет:
2) Я тоже читал про это, даже на сайте здесь урок по зонам видимости, но опять же, в моем случае - все должно быть видно
Так посмотри внимательнее, ты не передал в ф-цию данные для коннекта, и говоришь что все должно быть видно.
13. Okula - 15 Августа, 2013 - 00:02:41 - перейти к сообщению
Ну а вообще я не вижу необходимости в создании этой функции. Если уж взялся писать всё в структурном стили то и пиши так. У тебя же получается что ты пытаешься создать функцию ради функции.
14. lexdevel - 15 Августа, 2013 - 00:02:59 - перейти к сообщению
DeepVarvar пишет:
5) Нет нужды ставить закрывающий тег в конце файла. Это даже помогает. Но не будем углубляться.

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


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

В общем, спасибо огромное) Буду пытаться)
15. DeepVarvar - 15 Августа, 2013 - 00:03:10 - перейти к сообщению
Okula, если говоришь что глобал = зло, то и советовать человеку не надо.
Кроме того ему ближе по сути показать передать в аргументах, что я и сделал.

 

Powered by ExBB FM 1.0 RC1