На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Firebird + D4php , Подключение, выполнение запросов, ХП, вывод данных Firebird в D4php
    Здравствуйте, уважаемые.

    Расскажите/подскажите, пожалуйста, как соединить Firebird 2.1 с D4php 2.1.

    Я делал следующее:
    1. Установил D4php 2.1
    2. Установил FB 2.1 (GDS32.dll в папке system32 поменялось, но от D4php я сохранил на всякий случай)
    3. Положил на форму компонент TDatabase, выбрал имя драйвера Firebird, прописал хост 127.0.0.1, путь к базе c:\hostel.fdb, пользователя, пароль, словарь (диалект как я понял) 3.
    4. установил connected в true, сохранил проект в c:\sys\ и запустил.

    в результате получил следующее:
    ExpandedWrap disabled
      Warning: ibase_connect() [function.ibase-connect]: Unable to complete network request to host "localhost". Failed to locate host machine. Undefined service gds_db/tcp. in C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\adodb\drivers\adodb-ibase.inc.php on line 74


    Пробовал GDS32.dll от D4php положить в system32 - результат такой же.
    Пробовал GDS32.dll от FB положить в system32, а так же во все места, где нашел одноименную библиотеку в каталоге C:\Program Files\CodeGear\Delphi for PHP\2.0\ - результат такой же.

    Предложение: давайте "разжуем" этот случай и перенесем в FAQ. (такого в FAQ я не нашел).
      Цитата Gluckodrom @
      2. Установил FB 2.1 (GDS32.dll в папке system32 поменялось, но от D4php я сохранил на всякий случай)
      одно пользовательская (embedded) или обычный сервер?

      попробуй путь указать \\localhost\c:\hostel.fdb
        Цитата ViktorXP @
        одно пользовательская (embedded) или обычный сервер?

        Обычный.

        Цитата ViktorXP @
        попробуй путь указать \\localhost\c:\hostel.fdb


        та же самая ошибка...
        Сообщение отредактировано: Gluckodrom -
          возьми одно пользовательскую и проверь подключен ли модуль firebord-а в php
            почитай здесь
            http://forums.delphi-php.net/tutorials/3656-how-connect-firebird-db-server-delphi-php.html
            я не проверял, но по опыту использования firebird и interbase в Delphi
            думаю, что там описано решение

            Добавлено
            http://www.qadram.com/vcl4php/docwiki/index.php/Database_Developer%27s_Guide:Firebird
              Была эта проблема, но благополучно решил:
              1.Снести все старые FireBird, InterBase2007, если были установлены.
              2.Проверь диски на наличие fbclient.dll , gds32.dll
              Обрати внимание на 4 экземпляра gds32.dll, размером 416к, находящиеся в подкаталогах в каталога DelphiForPHP -
              это gds32.dll от InterBase2007. Удали их или спрячь подальше - дело вкуса.
              3. Устанавливай FB2.1, отметь при установке "Создать GDS32.dll", FB2.1 создаст gds32.dll, размером 440к, найди этот файл
              и помести туда, где ранее были dll'ки на 416к.
              4. Запускай DelphiForPHP, выбирай компоненты IBX, далее думаю, сам знаешь, что делать.

              P.S. Будут траблы с кодировкой - пиши ;)
                zeon, спасибо огромное за верную подсказку. Теперь даже самому как-то стыдно, что не додумался так с бубном поплясать (заюзать IB компоненты).

                С кодировкой проблем не возникло. База на win1251. На форуме нашел где поставить юникод в свойствах, а также саму форму указал в юникод и все нормально.

                Теперь встал вопрос о том, как юзать ХП. К примеру кидаю на форму (не создаю в рантайме для того чтобы освоиться легче) компонент IBStoredProc. В нем указываю подключение и наименование ХП. Дальше приведите, пожалуйста кусок кода заполнения параметров и выполнения ХП с подтверждением и откатом транзакции.
                  работа с хранимой процедурой здесь
                  C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\IBX\storedproc
                  работа с транзакциями здесь
                  C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\Data Aware\Transactions
                    Цитата vicis @
                    работа с хранимой процедурой здесь
                    C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\IBX\storedproc

                    там смотрел. к сожалению, там без параметров.

                    Цитата vicis @
                    работа с транзакциями здесь
                    C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\Data Aware\Transactions

                    тоже смотрел. к сожалению, там описана прямая вставка (это на мой взгляд недопустимо!) в таблицу с транзакцией.
                    Хотелось бы увидеть работу с транзакцией с ХП.
                      Цитата Gluckodrom @
                      там описана прямая вставка (это на мой взгляд недопустимо!) в таблицу с транзакцией

                      почему это недопустимо ?
                      по какой причине ?

                      работа с параметрами здесь
                      хранимая должна работать также
                      http://www.qadram.com/vcl4php/docwiki/index.php/Database_Developer%27s_Guide:Parametrized_Queries
                        Цитата vicis @
                        почему это недопустимо ?
                        по какой причине ?

                        Считаю, то пользователю нельзя такое разрешать. Это мое ИМХО. Спорить не буду.

                        Цитата vicis @
                        работа с параметрами здесь

                        Спасибо. Разобрался.

                        Но теперь встал вопрос следующий:
                        Что за непонятная ошибка "non-existant property BitBtn->DataSet". Какой еще Датасет у кнопки??? Кто нить может пояснить?

                        ExpandedWrap disabled
                          class Unit1 extends Page
                          {
                                 public $BitBtn2        = null;
                                 public $LabeledEdit1   = null;
                                 public $BitBtn1        = null;
                                 public $DBGrid1        = null;
                                 public $IBDatabase1    = null;
                                 public $IBStoredProc1  = null;
                                 public $IBQuery1       = null;
                                 public $Datasource1    = null;
                           
                                 public $host_name = '127.0.0.1';
                                 public $db_name   = 'C:\sys\HOSTEL.FDB';
                                 public $user_name = 'sysdba';
                                 public $user_pwd  = 'masterkey';
                           
                                 function BitBtn1Click($sender, $params)
                                 {
                                  if ($this->LabeledEdit1->Text != '')
                                  {
                                    $this->IBStoredProc1 = new IBStoredProc($this);
                                    $this->IBStoredProc1->Database = $this->IBDatabase1;
                                    //$IBStoredProc1->StoredProcName = 'INS_FACULTET';
                                  }
                                  else
                                  {
                                    ?><script>alert('Не заполнено поле!');</script><?php
                                  }
                                 }
                           
                                 function BitBtn2Click($sender, $params)
                                 {
                                  // БД
                                  $this->IBDatabase1 = new IBDatabase($this);
                                  $this->IBDatabase1->Charset       = 'utf-8';
                                  $this->IBDatabase1->Host          = $this->host_name;
                                  $this->IBDatabase1->DatabaseName  = $this->db_name;
                                  $this->IBDatabase1->UserName      = $this->user_name;
                                  $this->IBDatabase1->UserPassword  = $this->user_pwd;
                                  try
                                  {
                                    $this->$IBDatabase1->Open();
                                    echo 'Есть контакт!';
                                  }
                                  catch (Exception $e)
                                  {
                                    echo $e->getMessage();
                                  }
                           
                                  // Запрос
                                  $this->IBQuery1 = new IBQuery($this);
                                  $this->IBQuery1->Database = $this->IBDatabase1;
                                  $SQL = 'select * from facultet';
                                  $this->IBQuery1->setSQL($SQL);
                                  $this->IBQuery1->LimitCount = 40;
                                  try
                                  {
                                    $this->IBQuery1->Open();
                                    echo 'Есть запрос!';
                                  }
                                  catch (Exception $e)
                                  {
                                    echo $e->getMessage();
                                  }
                           
                                  // соединение и вывод
                                  $this->Datasource1 = new Datasource($this);
                                  $this->Datasource1->DataSet = $this->IBQuery1;
                                  $this->DBGrid1->DataSource = $this->Datasource1;
                                 }
                          }
                           
                           
                          Application raised an exception class EPropertyNotFound with message 'Trying to access non-existant property BitBtn->DataSet in dbgrids.inc.php, line 363.'
                        Сообщение отредактировано: Gluckodrom -
                          что этим ты хотел сказать?
                          ExpandedWrap disabled
                            $this->$IBDatabase1->Open();


                          Добавлено
                          Цитата Gluckodrom @
                          Application raised an exception class EPropertyNotFound with message 'Trying to access non-existant property BitBtn->DataSet in dbgrids.inc.php, line 363.'
                          Ну так написано что свойства DataSet у кнопки не нашло.
                            Цитата ViktorXP @
                            что этим ты хотел сказать?

                            Открытие подключения.

                            Цитата ViktorXP @
                            Ну так написано что свойства DataSet у кнопки не нашло.

                            Ну а откуда у кнопки это свойство? Почему вообще подобная ошибка возникает? В коде я нигде не указываю такого.

                            Забыл упомянуть, что сперва нажимаю кнопку 2, потом 1.
                            Сообщение отредактировано: Gluckodrom -
                              Цитата Gluckodrom @
                              Открытие подключения.
                              ок. тогда обрати внимания на второй знак доллара. ты уверен что он там должен быть? я сомневаюсь. )))
                              Цитата Gluckodrom @
                              Ну а откуда у кнопки это свойство? Почему вообще подобная ошибка возникает? В коде я нигде не указываю такого.
                              Посмотри в *.xml.php файле. возможно оно там прописано.

                              Добавлено
                              а зачем ты создаешь динамически компоненты. не проще их бросить визуально?
                                Цитата ViktorXP @
                                ок. тогда обрати внимания на второй знак доллара. ты уверен что он там должен быть? я сомневаюсь. )))

                                Это провокация! :D Я этого не делал! Это все подстава :lol:
                                Поправил, ничего не изменилось. Подключение так же открывается, запрос отрабатывает.

                                Цитата ViktorXP @
                                Посмотри в *.xml.php файле. возможно оно там прописано.

                                Глянул. Нет такого там.
                                ExpandedWrap disabled
                                    <object class="BitBtn" name="BitBtn2" >
                                      <property name="Caption"><![CDATA[Проверка связи]]></property>
                                      <property name="Height">25</property>
                                      <property name="Left">368</property>
                                      <property name="Name">BitBtn2</property>
                                      <property name="Top">265</property>
                                      <property name="Width">107</property>
                                      <property name="OnClick">BitBtn2Click</property>
                                    </object>

                                Ошибка осталась. :wall:

                                Цитата ViktorXP @
                                а зачем ты создаешь динамически компоненты. не проще их бросить визуально?

                                Визуально всегда успеется. Сперва нужно опробовать динамическое создание, чтобы почувствовать все грабли.
                                З.Ы.: DBGrid не создавал динамически ;)
                                Сообщение отредактировано: Gluckodrom -
                                  тогда поставь птичку на отладку vcl и потрасируй. (можно попробовать начинать с того места (или выше) где говорит ошибка)
                                    Цитата Gluckodrom @
                                    Поправил, ничего не изменилось.

                                    не важно изменилось или нет
                                    код был неправильный
                                    т.е. на одни грабли меньше стало 8-)

                                    Цитата Gluckodrom @
                                    Визуально всегда успеется. Сперва нужно опробовать динамическое создание, чтобы почувствовать все грабли.

                                    ну, почуствовал грабли
                                    теперь сделай по нормальному

                                    столько лишнего кода
                                    это же визуальное программирование
                                    зачем опять руки мучать

                                    попробуй заглянуть в модуль dbgrids.inc.php, на строку 363
                                    и скорее всего проблема из за этой строки
                                    $this->DBGrid1->DataSource = $this->Datasource1;
                                    ничего здесь не присваивается
                                    смотри в отладчике
                                      Цитата vicis @
                                      ну, почуствовал грабли
                                      теперь сделай по нормальному

                                      столько лишнего кода
                                      это же визуальное программирование
                                      зачем опять руки мучать


                                      Верно говоришь! Зачем нужна D4php, если там ручками писать все =)
                                      Переделаю. Думаю ошибки не будет.

                                      Если все пройдет нормально, сделаю небольшой хелп в один пост, чтобы закинули в FAQ.
                                        Создал Datamodule, на него кинул IBDatabase1.
                                        На Unit1 кинул LabeleleEdit1. В Unit1 сделал команду File -> Use unit и указал Datamodule.
                                        Попытался обратиться к IBDatabase командой
                                        ExpandedWrap disabled
                                          DM_form->IBDatabase1->Username = $this->LabeleleEdit1->Text

                                        или
                                        ExpandedWrap disabled
                                          $DM_form->IBDatabase1->Username = $this->LabeleleEdit1->Text

                                        оказалось неверным.
                                        Встал вопрос: как закинуть имя пользователя в базу?
                                        Сообщение отредактировано: Gluckodrom -
                                          Цитата Gluckodrom @
                                          Встал вопрос: как закинуть имя пользователя в базу?

                                          вопрос сформулирован не верно
                                          правильный вопрос: почему не присваивается свойство компонента из другого модуля

                                          думаю проблема где то здесь:
                                          1. есть ли ссылка на модуль Datamodule в заголовке этого модуля

                                          2. перед присваиванием есть ли код
                                          global $DM_form

                                          Вообще то все эти вопросы потому, что не посмотрел примеры
                                          там всё это решено
                                          загляни в C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\ECommerceExample
                                          запусти пример, посмотри как работает
                                          а то что тебе нужно здесь:
                                          index.php
                                          DbModule.php
                                          configure.php
                                            Извините, но ничего не понял в этом примере.
                                            Не могли бы вы на пальцах объяснить, пожалуйста.
                                              Цитата Gluckodrom @
                                              Извините, но ничего не понял в этом примере.

                                              а что сделано что бы понять ?
                                              пример запустился ?


                                              вот так он должен работать
                                              Сообщение отредактировано: vicis -
                                                Пример не запустился, потому что D4php не смог определить компоненты.
                                                Откуда взялась функция GetDBModule(), в подсказках ее не нашел, в коде тоже.
                                                  Цитата Gluckodrom @
                                                  Пример не запустился, потому что D4php не смог определить компоненты

                                                  а readme.txt кто читать будет...

                                                  Там написано следующее
                                                  Цитата
                                                  ---------------------------------------------------------------------
                                                  | E-Commerce Example for Delphi For PHP |
                                                  | |
                                                  | Author: Jonathan Benedicto |
                                                  ---------------------------------------------------------------------

                                                  -- Installation --
                                                  This e-commerce example is based around a MySQL database, containing 6 tables.
                                                  The database structure can be created using the included ecom.sql file.

                                                  Database connection information is stored in the configure.php file. Customize
                                                  this file to your particular database setup.

                                                  You need to install the components located in jbsamplecomponents.zip into the
                                                  IDE before using this demo. Follow the instructions in the Readme.txt file in
                                                  that zip for installation instructions.


                                                  -- Administration --
                                                  The default username and password for the administration panel is test/test. The
                                                  actual values are stored in the admins table.


                                                  -- Misc --
                                                  The "ads" displayed on the store home page are set via the ads table.


                                                  -- How To Run --
                                                  Open index.php and hit the Run button.



                                                  Товарищ Гугл переводит:
                                                  Цитата
                                                  Пример электронной торговля использует базу данных MySQL, содержащую 6 таблиц.
                                                  Структура базы данных может быть создана с помощью входящего в ecom.sql файла.

                                                  Информация для одключения к базе данных хранится в файле configure.php. Настройте
                                                  этот файл для вашей индивидуальной установки базы данных.

                                                  Вам необходимо установить компоненты находятся в jbsamplecomponents.zip в
                                                  IDE, прежде чем использовать эту демонстрацию. Следуйте инструкциям в файле Readme.txt в
                                                  Zip, чтобы осуществить установку.



                                                  - Администрирование --
                                                  Имя пользователя и пароль по умолчанию на панели администрирования test/test.
                                                  Фактические значения хранятся в таблице admins.


                                                  - Разное --
                                                  "Рекламные объявления" отображаются на главной странице магазина устанавливаются с помощью таблицы объявлений.


                                                  - Как запускать --
                                                  Открыть index.php и нажмите кнопку "Выполнить".



                                                  Цитата Gluckodrom @
                                                  Откуда взялась функция GetDBModule(), в подсказках ее не нашел, в коде тоже.

                                                  а поиском по содержимому файлов в директории, я так понимаю, пользоватся влом 8-)

                                                  функция GetDBModule() находится в модуле DbModule.php
                                                  и содержит следующее
                                                  ExpandedWrap disabled
                                                    function GetDBModule()
                                                    {
                                                       global $DBModule;
                                                     
                                                       return $DBModule;
                                                    }

                                                  по сути глобальная функциия для ссылки на этот модуль
                                                  достаточно удобно чем каждый раз прописывать перед доступом к модулю
                                                  global $DBModule;
                                                    не серчайте! на работе сидел в запарке!

                                                    а по идее, спасибо огромное! помог! только спокойнее бы!
                                                      да куда уж спокойнее
                                                      спокойнее это когда тебе не отвечают 8-)
                                                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                      0 пользователей:


                                                      Рейтинг@Mail.ru
                                                      [ Script execution time: 0,0594 ]   [ 14 queries used ]   [ Generated: 18.05.24, 07:21 GMT ]