За последние 24 часа нас посетили 21048 программистов и 1682 робота. Сейчас ищут 1117 программистов ...

UNIX PHP SQL Server 2008

Тема в разделе "MSSQL", создана пользователем alexey_baranov, 3 июн 2010.

  1. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    какой драйвер лучше всего выбрать для работы с sql sqrv 2008 на юниксах? я знаю как минимум два с половиной способа приканектиться. это через юникс одбц и через ФриДТС и бывает вроде еще тот же ФриДТС только через ПДО.

    Мож кто пробовал, поделитесь опытом.
     
  2. нет, не правда. через freetds работают и обычные mssql_* функции. Алсо, FreeTDS работает просто прекрасно.
     
  3. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    флоппик
    Получается на юниксах freedts можно юзать через mssql_* и через pdo, так что-ли? Если так, то хорошо, потому что в pdo объектный привычный интерфейс и ошибки на исключениях.

    А правда, что через freedts можно выполнить только один запрос и даже открытие второго подключения не поможет обойти это ограничение?
    http://freetds.org/faq.html#pending(Why does each connection support only one query at a time?)
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    работаю через freeTDS. проблем нет.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    за 1 раз, впрочем как и везде.

    connect();
    query();
    query();
    query();
    query();
    query();
    query();
    close();
     
  6. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    круто! а работаешь через mssql_* или pdo?
     
  7. Я через пдо.
     
  8. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    а транзации и вложенные транзакции, хранимые процедуры с out параметрами не приходилось пробовать? а то у меня будет вызов чужих хранимок и причем очень сложных.
     
  9. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    о супер! если что буду обращаться ;)
     
  10. там нужно неможно magic, но ничего сверхординарного. Правда, насчет сложности - хз
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Код (Text):
    1.  
    2. hosting(root):/home/440hz#>cat /usr/local/etc/freetds.conf
    3. #
    4. #
    5. #
    6.  
    7. [global]
    8.         # TDS protocol version
    9.         tds version = 8.0
    10.  
    11.         try server login = yes   у меня используется аутентификация на сервере
    12.         try domain login = no   а не на домене
    13.         cross domain login = no
    14.         text size = 64512
    15.  
    16.         initial block size = 512
    17.  
    18.         swap broken dates = no
    19.         swap broken money = no
    20.  
    21. #       dump file = /tmp/freetds.log
    22. #       debug flags = 0xffff
    23. #       dump file append = yes
    24.  
    25.         text size = 64512
    26. #
    27. #
    28. #
    29.  
    30. [*****]
    31.        host = *****
    32.        port = 14666
    33.        tds version = 8.0
    34.        client charset=CP1251
    35.  
    36. ;
    37. ;
    38. ;
    $this->mssql = @mssql_connect('*****,'login','password');
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    да все там пашет. не вопрос.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    причем у меня MSSQL стоит удаленно, причем за шлюзом и в другой подсетке. там на самом деле учет работает и я на сайт дергаю данные из учета/бух, в реальном времени. задержек нет.
     
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    не. вернее не так.

    есть фирма по продаже автозапчастей. у нее внутри фирмы стоит учет и бух. а их сайт лежит удаленно у меня на сервере совсем в другом месте. так вот я с сайта дергаю учет в реальном времени. вот.
     
  15. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    440Hz
    У меня, кстати, 5.3.1 Это ничего, как думаешь?
     
  16. это ничего. у меня тоже 5.3.2 =)
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я даже не парюсь.
     
  18. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    А кодировка в SQL Server 2008 есть как в других базах? нашел только, что сравнение выставлено Cyrillic_General_CI_AS а кодировку где можно посмотреть, не подскажете?

    Я хотел начать писать скрипты в utf-8, получится без переконвертирований iconv-ами, если база окажется в win-1251?
     
  19. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Други, помогите разобрать вот такой код

    PHP:
    1. <?php
    2. $conn = mssql_connect ('ipsoft', '*', '*')
    3.         or die ("Can't connect to Microsoft SQL Server");
    4. mssql_select_db('bill35', $conn)
    5.         or die ("Can't select databes");
    6. $query= mssql_query("SELECT TOP 100 * FROM dbo.Subscriber;", $conn); //300 000 длинных строк
    7. if ($query===FALSE)
    8.     throw new Exceptio(mssql_get_last_message());
    9. elseif($query===TRUE)
    10.     throw new Excep("Запрос вернул 0 строк");
    11. else{
    12.     while ($row = mssql_fetch_row($query)) {
    13.         echo "{$row[0]} {$row[1]} {$row[2]} {$row[3]}<br/>";
    14.     }
    15. }
    16. ?>
    получаю ошибку "закончилась память после выделения 128мб" на строчке mssql_query. Как же так? зачем это все мне в пхп прилетело в момент mssql_query? я хотел бы получать по одной строке внуть пхп когда делаю mssql_fetch_row и тратить при этом пару килобайт.
     
  20. Думаю, ошибка где то в другом месте должна быть.
     
  21. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    а это что думаете, почему не выполняется?
    PHP:
    1. <?php
    2. //коннект
    3. $conn = mssql_connect ('ipsoft', '***', '***')
    4.         or die ("Can't connect to Microsoft SQL Server");
    5. mssql_select_db('bill35', $conn)
    6.         or die ("Can't select databes");
    7.  
    8. //параметры хранимой процедуры
    9. $date= new Zend_Date();
    10. $accountNumber= '560-И';
    11. $sum= 10.35;
    12. $DATE= $date->get(Zend_Date::TIMESTAMP);
    13. echo $DATE;
    14. $PSID= '';
    15. $currencyCode= 810;
    16. $txn_id='';
    17. $ExternalPaymentID='';
    18.  
    19. //прицепить параметры
    20. $proc= mssql_init("PaymentAuthorizePS", $conn);
    21. mssql_bind($proc, '@AccountNumber', $accountNumber, SQLVARCHAR, false, false, 50); //BCOMMENT
    22. mssql_bind($proc, '@PaymentSumm', $sum, SQLFLT8); //money
    23. mssql_bind($proc, '@PaymentDate', $DATE, SQLINT4); //datetime 1275826536
    24. mssql_bind($proc, '@PSID', $PSID, SQLVARCHAR, false, false, 1); //BCOMMENT
    25. mssql_bind($proc, '@CurrencyCode', $currencyCode, SQLINT2); //int
    26. mssql_bind($proc, '@txn_id', $txn_id, SQLVARCHAR, false, false, 255); //varchar(255)
    27. mssql_bind($proc, '@ExternalPaymentID', $ExternalPaymentID, SQLVARCHAR, false, false, 255); //varchar(255)
    28.  
    29. //выполнить и получить результат
    30. $res= mssql_execute($proc);
    31. echo $res;
    output
    сама хранимая процедура очень простая. можно даже не читать дальше входных параметров. она только возвращает одно целое число 0 или 1. выходных параметров транзакций и других замут нет.
    [sql]ALTER procedure [dbo].[PaymentAuthorizePS]
    @AccountNumber BCOMMENT,
    @PaymentSumm money,
    @PaymentDate datetime,
    @PSID BCOMMENT, --временно
    @CurrencyCode int, -- код валюты ЗАГЛУШКА!
    -- @AuthResult int out,
    @txn_id varchar(255) = null,
    @ExternalPaymentID varchar(255) = null
    as
    begin
    declare
    @AuthResult int
    select @AuthResult = 5 --ACCOUNT_OTHER_FATAL
    if (select count(1) from Account a where a.Number = @AccountNumber) > 1
    goto Error
    if (select a.ID from Account a where a.Number = @AccountNumber) is null begin
    select @AuthResult = 2 --ACCOUNT_NOT_EXISTS
    goto error
    end
    select @AuthResult = 0 --PAYMENT_OK
    select @AuthResult
    return
    Error:
    select @AuthResult
    end[/sql]
     
  22. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Все проблемы решились спасибо 440Hz за конфиг. оказывается в конфиге стоял fretds 4.2
     
  23. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Теперь проблема с датами. Я передаю в хранимую процедуру даты в формате ISO-8601 (например 2010-06-08T12:06:20+06:00) поскольку это формат поддерживают все базы. и получаю в ответ вот такое сообщение
    соответственно вопрос к знатокам как правильно передавать даты?
     
  24. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    С датами тоже все решил. Млин SQL Server - ТУПАЯ ХУЙНЯ!!! После постгрес я в шоке, что он не понимает таких простых вещей. Я пришел к выводу, что вот этот способ универсальный
    PHP:
    1. <?php
    2. $DATE=$date->toString('YYYY-MM-ddTHH:mm:ss');
    3. mssql_bind($proc, '@PaymentDate', $DATE, SQLVARCHAR, false, false, 25); //datetime 2010-06-06T18:09:22
    4.  

    флоппик
    а как через freetds получить результат выполнения хранимой процедуры- целое число?
    Я пробую вот так, но ничего не получается
    PHP:
    1. <?php
    2. $res= mssql_execute($proc)
    3. echo $res; //получаю  Resource id #14.
     
  25. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Добил. Все работает.