Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → 3d Party Tools → Передача uid в acct_userid и acct_username в username

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 22

1

Topic: Передача uid в acct_userid и acct_username в username

как можно сделать так..
http://i.piccy.info/i7/4beb60a3d106535b8731da5b02273d7c/4-48-218/59368000/555.jpg
как передавать значение uid в поле acct_userid и значение acct_username в username? зЫ и еще значение в acct_username может быть в любом регистре, хотелось бы чтобы значение в username было только в нижнем регистре. Спасибо за помощь заранее.

И еще одна проблема Есть таблица bnet в ней есть uid поле созданное в формате
"uid int NOT NULL PRIMARY KEY","'0'" по дефолту созданное PVPGN`ом
и есть запрос который якобы вставляет данные уже после всех обработок

    $result = $db->query("INSERT INTO BNET(acct_username, acct_passhash1, acct_email, acct_ctime, user_level, lastlogin_time, lastlogin_ip, confirm, can_comment)
                      VALUES('".$name."','".$password."','".$email."','".(int)time()."','0','','".safeEscape($_SERVER["REMOTE_ADDR"])."','".$confirmCode."', '1')");

при выполнение выдает эрор MySQL Error: 1062 ( Duplicate entry '0' for key 'PRIMARY')
как я понимаю оно не может записать данные потому что не может задать айди, выходит нужно проверять макс id и добавлять +1 чтобы дать ему знать какой некст айди?
получается по идее запрос должен выглядеть как-то так

SELECT MAX(`uid`) FROM `BNET`

но я не знаю как это все связать во едино....
зЫ я уже пытался применить в uid AUTOINCREMENT но вся проблема в том, что оно потом как-то не очень корректно работает поэтому наверно хотелось бы сделать с помощью Select max uid т.к думаю это родно для пвпгна

2

Re: Передача uid в acct_userid и acct_username в username

Mania wrote:

как передавать значение uid в поле acct_userid и значение acct_username в username?

А зачем?

На тему экранирования - смотри параметризированые запросы, а не эти костыли.

Автоинкремент - имхо правильное решение, что там работает не так?

3

Re: Передача uid в acct_userid и acct_username в username

1) Первое делается через триггеры (triggers). Они вызываются сервером MySQL при вставке/обновлении/удалении данных, которые можно как-то обработать, в т.ч. продублировать в другие поля.
Пример триггера под твою задачу:

DELIMITER $$

CREATE
    TRIGGER `newaccount_trigger` BEFORE INSERT
    ON `bnet`
    FOR EACH ROW BEGIN
        SET NEW.uid = (SELECT MAX(uid) FROM `bnet`) + 1, NEW.acct_userid = NEW.uid, NEW.username = LOWER(NEW.acct_username);
    END$$

DELIMITER ;

Но может быть проще вставлять эти поля все вместе из php скрипта?


2) Полю uid можно добавить флаг AUTOINCREMENT, чтобы если полю не задано значение, то MySQL сам прибавлял бы туда +1 при вставке. Но если используешь предыдущий триггер, то это необязательно, т.к. в нем uid уже увеличивается.

ALTER TABLE `bnet` CHANGE `uid` `uid` INT(11)  NOT NULL AUTO_INCREMENT;

PvPGN действительно вставляет его, сначала выбирая MAX(), затем прибавляя 1. Наверное, потому что сначала не было поддержки MySQL и все было на файлах.

Do not ask for support in PM.

4 (edited by Mania 08.11.2012 16:01)

Re: Передача uid в acct_userid и acct_username в username

HarpyWar wrote:

1) Первое делается через триггеры (triggers). Они вызываются сервером MySQL при вставке/обновлении/удалении данных, которые можно как-то обработать, в т.ч. продублировать в другие поля.
Пример триггера под твою задачу:

DELIMITER $$

CREATE
    TRIGGER `newaccount_trigger` BEFORE INSERT
    ON `bnet`
    FOR EACH ROW BEGIN
        SET NEW.uid = (SELECT MAX(uid) FROM `bnet`) + 1, NEW.acct_userid = NEW.uid, NEW.username = LOWER(NEW.acct_username);
    END$$

DELIMITER ;

Но может быть проще вставлять эти поля все вместе из php скрипта?

1) и как применить триггер?
вставлять все вместе из пхп скрипта
ну сейчас запрос выглядит так

          $result = $db->query("INSERT INTO BNET(acct_username, acct_passhash1, acct_email, acct_ctime, user_level, acct_lastlogin_time, acct_lastlogin_ip, confirm, can_comment) 
          VALUES('".$name."','".$password."','".$email."','".(int)time()."','0','','".safeEscape($_SERVER["REMOTE_ADDR"])."','".$confirmCode."', '1')");

ты имеешь ввиду что будет проще передавать так?

 $result = $db->query("INSERT INTO BNET(acct_username, username, acct_passhash1, acct_email, acct_ctime, user_level, acct_lastlogin_time, acct_lastlogin_ip, confirm, can_comment) 
          VALUES('".$name."','".$name."','".$password."','".$email."','".(int)time()."','0','','".safeEscape($_SERVER["REMOTE_ADDR"])."','".$confirmCode."', '1')");
HarpyWar wrote:

2) Полю uid можно добавить флаг AUTOINCREMENT, чтобы если полю не задано значение, то MySQL сам прибавлял бы туда +1 при вставке. Но если используешь предыдущий триггер, то это не потребуется, т.к. в нем uid уже увеличивается.

ALTER TABLE `bnet` CHANGE `uid` `uid` INT(11)  NOT NULL AUTO_INCREMENT;

PvPGN действительно вставляет его, сначала выбирая MAX(), затем прибавляя 1. Наверное, потому что сначала не было поддержки MySQL и все было на файлах.

2) дело в том, что и uid  и acct_userid должны быть заполнены т.к в клиенте не будет логинить... или ты имеешь ввиду что AUTOINCREMENT применить и для uid и для acct_userid?

Добавлено: 07.11.2012 15:01

xpeh wrote:
Mania wrote:

как передавать значение uid в поле acct_userid и значение acct_username в username?

А зачем?

На тему экранирования - смотри параметризированые запросы, а не эти костыли.

Автоинкремент - имхо правильное решение, что там работает не так?

автоинкримент когда я его применять матерился не по детски так как я применял к полю в котором было уже пару тысяч айдишников

5

Re: Передача uid в acct_userid и acct_username в username

Триггер добавляется как и любой SQL код. Выбираешь базу и выполняешь туда этот код, после чего в ней будет создан триггер.
С остальным тогда можешь не париться.

Do not ask for support in PM.

6 (edited by Mania 07.11.2012 17:34)

Re: Передача uid в acct_userid и acct_username в username

HarpyWar wrote:

Триггер добавляется как и любой SQL код. Выбираешь базу и выполняешь туда этот код, после чего в ней будет создан триггер.
С остальным тогда можешь не париться.

работает=) спасибо
1) Скажи пожалуйста а каким запросом можно посмотреть какие триггеры применены к бд? и как их удалить в случае чего?
2)

HarpyWar wrote:

Но может быть проще вставлять эти поля все вместе из php скрипта?

если не трудно скажи тот запрос что я выше кинул подходит:? как передать тогда username в нижнем регистре? зЫ просто интересен способ реализации этих полей на пхп
Я имею ввиду что например если не трогать триггеры и не нагружать бд  альтернативой было бы применить к uid автоинримент а в пхп файле дописать что-то типа        
$что_писать_тут_хз['uid'] = $что_писать_тут_хз['acct_userid'];
$name['acct_username'] = $name['username'];
последние 2 строки наверно глупая идея(((

7

Re: Передача uid в acct_userid и acct_username в username

1) По аналогии с таблицами:

SHOW TRIGGERS;
DROP TRIGGER `newaccount_trigger`;

Триггеры нагружают бд точно так же, как и обычные запросы. Ничего сложного и тяжелого в них нет, они лишь позволяют автоматизировать некоторые вещи.
В данном случае с триггером будет даже быстрее.


2) $result = $db->query("INSERT INTO BNET(acct_username, username, acct_passhash1, acct_email, acct_ctime, user_level, acct_lastlogin_time, acct_lastlogin_ip, confirm, can_comment)
         VALUES('".$name."','".strtolower($name)."','".$password."','".$email."','".(int)time()."','0','','".safeEscape($_SERVER["REMOTE_ADDR"])."','".$confirmCode."', '1')");

Затем обновить acct_userid:
SELECT MAX(`uid`) + 1 FROM BNET;
UPDATE BNET SET acct_userid = {value} FROM BNET WHERE uid={new_uid};

Do not ask for support in PM.

8

Re: Передача uid в acct_userid и acct_username в username

Харпи ну хоть ты осиль параметризированные запросы наконец.

9

Re: Передача uid в acct_userid и acct_username в username

xpeh wrote:

Харпи ну хоть ты осиль параметризированные запросы наконец.

Он меняет чужой код, где везде написано таким образом.

Do not ask for support in PM.

10

Re: Передача uid в acct_userid и acct_username в username

Заменить запрос - раз плюнуть.

11

Re: Передача uid в acct_userid и acct_username в username

HarpyWar wrote:

Затем обновить acct_userid:
SELECT MAX(`uid`) + 1 FROM BNET;
UPDATE BNET SET acct_userid = {value} FROM BNET WHERE uid={new_uid};

в {value} я вставляю значение из запроса селекст макс айди
{new_uid} - что должно быть тут?

12

Re: Передача uid в acct_userid и acct_username в username

xpeh wrote:

Заменить запрос - раз плюнуть.

Да ладно? smile чтобы добавить эти параметризированные запросы, нужно не малость изменить в таком коде.


Mania, в общем, сначала можно положить в переменную "SELECT (MAX(`uid`) + 1) as new_uid FROM BNET", затем всё вместе вставить: uid, acct_userid, acct_username, username и прочее, что в этом длинном запросе.

Do not ask for support in PM.

13

Re: Передача uid в acct_userid и acct_username в username

HarpyWar wrote:

нужно не малость изменить в таком коде.

Было:

$result = $db->query("INSERT INTO BNET(acct_username, username, acct_passhash1, acct_email, acct_ctime, user_level, acct_lastlogin_time, acct_lastlogin_ip, confirm, can_comment) 
VALUES('".$name."','".$name."','".$password."','".$email."','".(int)time()."','0','','".safeEscape($_SERVER["REMOTE_ADDR"])."','".$confirmCode."', '1')");

Стало что-то вроде такого:

$result = $xxx->query("INSERT INTO BNET(acct_username, username, acct_passhash1, acct_email, acct_ctime, user_level, acct_lastlogin_time, acct_lastlogin_ip, confirm, can_comment) 
VALUES((?),(?),(?),(?),(?),(?),(?),(?),(?),(?),(?))", $name, $name, $password, $email, time(), '0', '', $_SERVER["REMOTE_ADDR"],$confirmCode, '1')

Дофига изменить надо, правда? И скули невозможны в принципе, если все переменные передавать как параметры.

14

Re: Передача uid в acct_userid и acct_username в username

а в чем собственно разница? скорость*?

15

Re: Передача uid в acct_userid и acct_username в username

xpeh, неизвестно, что за метод query и сколько он параметров принимает. Скорее всего, $db - это класс-обертка над функциями типа mysql_query, который не работает с такими параметрами. Поэтому да, менять придется много.

Mania, защита от sql инъекций. В таком случае можно использовать так:

$query = sprintf("SELECT firstname, lastname, address, age FROM friends 
    WHERE firstname='%s' AND lastname='%s'",
    mysql_real_escape_string($firstname),
    mysql_real_escape_string($lastname));

$result = $db->query($query);
Do not ask for support in PM.

16

Re: Передача uid в acct_userid и acct_username в username

Mania wrote:

а в чем собственно разница?

Гарантированная защита от sql инъекций, не надо вручную экранировать переменные.

www.google.com/search?q=php+prepared+statements

www.google.de/search?q=php+parameterized+queries

17

Re: Передача uid в acct_userid и acct_username в username

xpeh wrote:
Mania wrote:

а в чем собственно разница?

Гарантированная защита от sql инъекций, не надо вручную экранировать переменные.

www.google.com/search?client=ope … statements

в таком случае имеет смысл переписать все запросы=)

18

Re: Передача uid в acct_userid и acct_username в username

Это для пыхарей открытие, все остальные их используют по умолчанию smile

19

Re: Передача uid в acct_userid и acct_username в username

HarpyWar wrote:

Mania, в общем, сначала можно положить в переменную "SELECT (MAX(`uid`) + 1) as new_uid FROM BNET"

у меня что-то не вышло(( можешь показать пример?

20

Re: Передача uid в acct_userid и acct_username в username

$result = $db->query("SELECT (MAX(`uid`) + 1) as new_uid FROM BNET");
$new_uid = $db->fetch_object($result)->new_uid;
Do not ask for support in PM.

21 (edited by Mania 08.11.2012 16:08)

Re: Передача uid в acct_userid и acct_username в username

пасиб надоел знаю=)
зЫ смотрю что при реге через клиент оно еще создает записи в friend, profile и в record, так вопрос собственно в том можно ли в тот запрос всунуть еще инсерт в еще 3 таблицы friend, profile и в record или нужно делать это все 3мя разными запросами? если можно то как?

22

Re: Передача uid в acct_userid и acct_username в username

Записи в этих таблицах создавать не надо, pvpgn их сам добавит при необходимости.

Do not ask for support in PM.

Posts: 22

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 1 guest, 0 registered users

forums.pvpgn.pro → 3d Party Tools → Передача uid в acct_userid и acct_username в username