PHP5 MySQL5 и хранимые процедуры

Тема в разделе "Как сделать...", создана пользователем CrashX, 28 май 2009.

Статус темы:
Закрыта.
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    сервак PHP5 + MySQL5
    в MySQL есть хранимые процедуры
    допустим
    это

    PHP:
    CREATE PROCEDURE reg_user(IN in_login VARCHAR(29), IN in_passwd VARCHAR(50), IN in_nic VARCHAR(100), IN in_uname VARCHAR(100), IN in_username VARCHAR(100), IN in_email VARCHAR(100), IN in_location VARCHAR(25), IN in_gid TINYINT(4), IN in_oid SMALLINT(6), OUT result TINYINT(1))
      
    SQL SECURITY INVOKER
    BEGIN
      
    DECLARE q VARCHAR (20);
      DECLARE EXIT 
    HANDLER FOR SQLEXCEPTION

    a
    :
      
    BEGIN
        SET result 
    := 1;
        
    ROLLBACK;
      
    END a;

      
    START TRANSACTION;
      
    SELECT
        psevdonim
      INTO
        q
      FROM
        crashx
    .organizacia
      WHERE
        crashx
    .organizacia.oid in_oid;
      
    INSERT INTO crashx.users VALUES (NULLin_gidin_oidCONCAT(in_login'@'q), in_passwdin_emailin_nicin_unamein_usernamein_locationNULLNULLNOW(), NOW());
      
    COMMIT;
      
    SET result := 0;
    END
    и так
    на сервере она вызывает просто
    PHP:
    USE base00;
      
    CALL reg_user('gl_buh''''Главный бухгалтер''Анна''Семенович''ddd@mail.ru'''12, @res);
    SELECT @res;

    на PHP не хотит результ выдавать!

    MySQLi не нужно тк весь движок написан с использованием MySQL
     
  2. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    пример вызова тут
    PHP:
    $mysql mysql_connect('localhost''example''example');
    mysql_select_db('test'$mysql);

    print 
    <h3>MYSQLsimple select</h3>;
    $rs mysql_query‘SELECT FROM users;’ );
    while(
    $row mysql_fetch_assoc($rs))
    {
    debug($row);
    }

    print 
    <h3>MYSQLcalling sp with out variables</h3>;
    $rs mysql_query‘CALL get_user(1, @first, @last)’ );
    $rs mysql_query‘SELECT @first, @last’ );
    while(
    $row mysql_fetch_assoc($rs))
    {
    debug($row);
    }

    print 
    <h3>MYSQLcalling sp returning a recordset doesn\’t work</h3>;
    $rs mysql_query‘CALL get_users()’ );
    while(
    $row mysql_fetch_assoc($rs))
    {
    debug($row);
    }
    подробнее тут:

    Перейти по ссылке

    т.е. у тебя я так понимаю будет что то типа:
    PHP:
    $rs mysql_query('CALL reg_user('gl_buh', '', 'Главный бухгалтер', 'Анна', 'Семенович', 'ddd@mail.ru', '', 1, 2, @res)');
    $rs mysql_query('SELECT @res');
     
    XSiteCMS нравится это.
  3. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    спасибо
    выбрал реализацию через MySQLi
    все переписал класс тк в MySQLi можно вызывать процедуру котора вернет ряд записей как обычный select, и при не нужно все поля описывать как выходяшие они отрпавляются объектом а обычном MySQL это не работает если кто подскажет как то буду рад



    вернет в MySQL болт а в MySQLi запись(и)
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    блин трабла есть процедура

    есть вызов с сервера
    результат 0 те обновилось!

    есть вызов с PHP драйвер MySQLi

    в чем ошибка? код один и тот же!!
     
  5. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    нужно очищать конект после каждого запроса

    Перейти по ссылке

    вот глянь пример как человек сделал.

    насчет MySQL и пустых резалтов, у тебя не было OUT в процедуре, добавь аут и SELECT @res будет возращать записи в обычном mysql модули, но для костыля что выше юзать можно только mysqli в mysql нету next_result и use_result
     
    XSiteCMS нравится это.
  6. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    хм в этом коде кажется одна очепятка))) не хватает символа))
    хотя и делал после каждого запроса просто

    mysqli_free_result($result); видимо остальные результаты не очищались спасибо))

    в mysql можно в OUT положить ряд записей ? поправь эту функцию что бы она выдавала ряд записей))) а то просто у меня мало ли где хостинг дудет там не известно что будет))
    а драйвера 2 описано и все работает кроме возарата записей без описания каждого поля )
     
  7. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    что за ряды? OUT это обычный столбец, т.е. если нужно несколько то добавь их через запятую, OUT col1, OUT col2 и после в селекте читай их как обычно.
    Код:
    $row = mysql_query('select @col1, @col2');
    while ($row = mysq_fetch_assoc($res))
    {
         print_r($row);
    }
    
     
  8. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    неа там можно позвращать сразу всю запись (row/record) без OUT, или ряд записей (rows)

    и притом результат тот же сто и обычный select )))) а тут еще нужно преобразовывать результат в формат без @ тк все построено на этом и в случае изменения таблицы нужно и процедуру править))
     
  9. Slayter

    Slayter

    Регистр.:
    8 апр 2006
    Сообщения:
    232
    Симпатии:
    52
    Какова цель использования хранимок для решения этой задачи?! :-]
     
  10. Zogr

    Zogr Постоялец

    Регистр.:
    6 июн 2008
    Сообщения:
    96
    Симпатии:
    7
    Не флейма ради и не холиваров для:

    Если смогли перенести на другое API, то уж попробуйте рассмотреть возможность использования PostgreSQL вместо мускуля, поскольку постргресс на много голов выше мускуля по качеству, широте поддержки нормального SQL и стабильности. Если беспокоит производительность, то, как я понимаю, в свежем постгрессе она сравнима с мускулем, а иногда и превосходит.
    В общем, больше писать не буду, т.к. не знаю из каких конкретно соображений вы выбрали именно мускуль... Просто с постгрессом сколько уже работаю, никогда таких (да и особо других) проблем не было, сплошной вселенский позитив.
    Успеха.
     
Статус темы:
Закрыта.