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

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
сервак 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 (NULL, in_gid, in_oid, CONCAT(in_login, '@', q), in_passwd, in_email, in_nic, in_uname, in_username, in_location, NULL, NULL, NOW(), NOW());
  COMMIT;
  SET result := 0;
END
и так
на сервере она вызывает просто
PHP:
USE base00;
  CALL reg_user('gl_buh', '', 'Главный бухгалтер', 'Анна', 'Семенович', 'ddd@mail.ru', '', 1, 2, @res);
SELECT @res;

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

MySQLi не нужно тк весь движок написан с использованием MySQL
 
пример вызова тут
PHP:
$mysql = mysql_connect('localhost', 'example', 'example');
mysql_select_db('test', $mysql);

print ‘<h3>MYSQL: simple select</h3>’;
$rs = mysql_query( ‘SELECT * FROM users;’ );
while($row = mysql_fetch_assoc($rs))
{
debug($row);
}

print ‘<h3>MYSQL: calling 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>MYSQL: calling 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');
 
спасибо
выбрал реализацию через MySQLi
все переписал класс тк в MySQLi можно вызывать процедуру котора вернет ряд записей как обычный select, и при не нужно все поля описывать как выходяшие они отрпавляются объектом а обычном MySQL это не работает если кто подскажет как то буду рад



DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`get_users`$$
CREATE PROCEDURE `test`.`get_users`()
BEGIN
SELECT *
FROM users;
END $$
DELIMITER ;

$rs = mysql_query( ‘CALL get_users()’ );
while($row = mysql_fetch_assoc($rs))
{
debug($row);
}
вернет в MySQL болт а в MySQLi запись(и)
 
блин трабла есть процедура

USE crashx;
DROP PROCEDURE IF EXISTS set_user;
CREATE PROCEDURE set_user(
IN in_id INT(11),
IN in_gid TINYINT(4),
IN in_oid SMALLINT(6),
IN in_ulogin VARCHAR(50),
IN in_upassword VARCHAR(50),
IN in_email VARCHAR(100),
IN in_unick VARCHAR(100),
IN in_uname VARCHAR(100),
IN in_usurname VARCHAR(100),
IN in_location VARCHAR(25),
IN in_lang VARCHAR(20),
IN in_template VARCHAR(20),
IN in_regdate DATETIME,
IN in_visit DATETIME,
OUT result TINYINT(1))
SQL SECURITY INVOKER
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION

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

START TRANSACTION;
UPDATE
users
SET
`gid` =in_gid,
`ulogin` =in_ulogin,
`upassword`=in_upassword,
`email` =in_email,
`unick` =in_unick,
`uname` =in_uname,
`usurname` =in_usurname,
`location` =in_location,
`lang` =in_lang,
`template` =in_template,
`regdate` =in_regdate,
`visit` =in_visit
WHERE
(`id` =in_id
AND
`oid` =in_oid);
COMMIT;
SET result := 0;
END

есть вызов с сервера
USE crashx;
CALL set_user('4', '4', '4', 'admin@wwww', 'q', 'qq@aa.rr', '', 'qq', '11', '22', 'russian', 'ratibo', '2009-06-01 12:55:42', '2009-06-01 12:55:42', @result);
SELECT
@result;
результат 0 те обновилось!

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

из отладчика
[info] => user->update(CALL Set_User())
[query] => CALL set_user('4', '4', '4', 'admin@wwww', 'q', 'qq@aa.rr', '', 'qq', '11', '22', 'russian', 'ratibo', '2009-06-01 12:55:42', '2009-06-01 12:55:42',@result);
[error] => 2014:Commands out of sync; you can't run this command now
[time] => 01 06 2009 07:59

вызов результата
[info] => user->update(@result)
[query] => SELECT @result ;
[error] => 2014:Commands out of sync; you can't run this command now
[time] => 01 06 2009 09:10
)

в чем ошибка? код один и тот же!!
 
блин трабла есть процедура
есть вызов с сервера
результат 0 те обновилось!
есть вызов с PHP драйвер MySQLi
в чем ошибка? код один и тот же!!
нужно очищать конект после каждого запроса

Для просмотра ссылки Войди или Зарегистрируйся

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

насчет MySQL и пустых резалтов, у тебя не было OUT в процедуре, добавь аут и SELECT @res будет возращать записи в обычном mysql модули, но для костыля что выше юзать можно только mysqli в mysql нету next_result и use_result
 
хм в этом коде кажется одна очепятка))) не хватает символа))
function mysqli_clean_connection($dbc)
{
while(mysqli_more_results($dbc))
{
if(mysqli_next_result($dbc))
{
$result = mysqli_use_result($dbc);
mysqli_free_result($result);
}
}
}
хотя и делал после каждого запроса просто

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

в mysql можно в OUT положить ряд записей ? поправь эту функцию что бы она выдавала ряд записей))) а то просто у меня мало ли где хостинг дудет там не известно что будет))
а драйвера 2 описано и все работает кроме возарата записей без описания каждого поля )
 
хм в этом коде кажется одна очепятка))) не хватает символа))
хотя и делал после каждого запроса просто
mysqli_free_result($result); видимо остальные результаты не очищались спасибо))
в mysql можно в OUT положить ряд записей ? поправь эту функцию что бы она выдавала ряд записей))) а то просто у меня мало ли где хостинг дудет там не известно что будет))
а драйвера 2 описано и все работает кроме возарата записей без описания каждого поля )
что за ряды? OUT это обычный столбец, т.е. если нужно несколько то добавь их через запятую, OUT col1, OUT col2 и после в селекте читай их как обычно.
Код:
$row = mysql_query('select @col1, @col2');
while ($row = mysq_fetch_assoc($res))
{
     print_r($row);
}
 
неа там можно позвращать сразу всю запись (row/record) без OUT, или ряд записей (rows)

и притом результат тот же сто и обычный select )))) а тут еще нужно преобразовывать результат в формат без @ тк все построено на этом и в случае изменения таблицы нужно и процедуру править))
 
Какова цель использования хранимок для решения этой задачи?! :-]
 
все переписал класс...

Не флейма ради и не холиваров для:

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