MySQL (F.A.Q.)
#61

Сам не пробовал, но в теории можно попробовать так:

1 вариант:
pawn Код:
UPDATE bank_accounts IF id = 2 THEN SET balance = balance + 20 ELSIF id = 1 THEN SET balance = balance - 20;
2 вариант:
pawn Код:
UPDATE bank_accounts SET balance=balance-20 WHERE id=1, balance=balance+40 WHERE id=2
Reply
#62

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Сам не пробовал, но в теории можно попробовать так:

1 вариант:
pawn Код:
UPDATE bank_accounts IF id = 2 THEN SET balance = balance + 20 ELSIF id = 1 THEN SET balance = balance - 20;
2 вариант:
pawn Код:
UPDATE bank_accounts SET balance=balance-20 WHERE id=1, balance=balance+40 WHERE id=2
#1064 - You have an error in your SQL syntax;
Reply
#63

первый должен выглядеть как-то так:
Код:
UPDATE bank_accounts SET balance = (IF id = 2 THEN SET balance + 20 ELSIF id = 1 THEN SET balance - 20);
Мне пока некогда экспериментировать так что этот вариант ещё надо доводить до ума.
Reply
#64

Кто там жаловался на сброс кодировки после реконнекта.
Есть простое решение:

Нужно исправить код подключения:
pawn Код:
mysql_connect("localhost", "user", "db_name", "password", 3306, FALSE);//шестой параметр отвечает за автореконнект, отключаем его.
И добавить перехватчик ошибок:
pawn Код:
public OnQueryError(errorid, error[], callback[], query[], connectionHandle) {
    if (errorid == CR_SERVER_LOST) {
        connectionHandle = mysql_connect("localhost", "user", "db_name", "password", 3306, FALSE);
        mysql_query(connectionHandle, "SET NAMES cp1251;", FALSE);
        mysql_query(connectionHandle, "SET SESSION character_set_server='utf8';", FALSE);
    }
}
Такой код произведет повторное подключение с правильной кодировкой.

НО: последний запрос на котором соединение было разорвано будет утерян.
Его можно вызвать в этом месте но дополнительные параметры будут потеряны, если были:
pawn Код:
public OnQueryError(errorid, error[], callback[], query[], connectionHandle) {
    if (errorid == CR_SERVER_LOST) {
        connectionHandle = mysql_connect("localhost", "user", "db_name", "password", 3306, FALSE);
        mysql_query(connectionHandle, "SET NAMES cp1251;", FALSE);
        mysql_query(connectionHandle, "SET SESSION character_set_server='utf8';", FALSE);
        if (strlen(callback)) {
            mysql_tquery(connectionHandle, query, callback);
        } else {
            ysql_query(connectionHandle, query, FALSE);
        }
    }
}
Reply
#65

Как запросом можно извлечь из базы рандомную строку?
Reply
#66

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Как запросом можно извлечь из базы рандомную строку?
SELECT * FROM `table` ORDER BY RAND() LIMIT 1
Reply
#67

Внезапно появилась проблема с плагином R5(https://sampforum.blast.hk/showthread.php?tid=56564). При апдейте аккаунтов появляется ошибка:
Код:
[20:41:03] CMySQLHandler::Query(UPDATE `players1` SET `Level`=0,`Admin`=0,`Cash`=300,`Helper`=0,`Exp`=135,`Tut`=1,`Register`=0,`DonateRank`=0,`UpgradePoint`=0,`ConnectTime`=0,`Sex`=1,`Age`=26 WHERE `Name`='Hector_Ramirez') - An error has occured. (Error ID: 2014, Commands out of sync; you can't run this command now)
[20:41:03] >> mysql_query( Connection handle: 1 )
Код:
new src[512],name[MAX_PLAYER_NAME],EscapeName[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
mysql_real_escape_string(name, EscapeName);
GetPlayerPos(playerid,PlayerInfo[playerid][pPos_x],
	PlayerInfo[playerid][pPos_y],PlayerInfo[playerid][pPos_z]);
GetPlayerFacingAngle(playerid,PlayerInfo[playerid][pPos_f]);
format(query,sizeof(query),"UPDATE `"PlayerTable"` SET ");
format(src,sizeof(src),"`Level`=%d,",PlayerInfo[playerid][pLevel]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Admin`=%d,",GetAdminLevel(playerid));
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Cash`=%d,",PlayerInfo[playerid][pCash]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Helper`=%d,",PlayerInfo[playerid][pHelp]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Exp`=%d,",PlayerInfo[playerid][pExp]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Tut`=%d,",PlayerInfo[playerid][pTut]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Register`=%d,",PlayerInfo[playerid][pReg]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`DonateRank`=%d,",PlayerInfo[playerid][pDonateRank]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`UpgradePoint`=%d,",PlayerInfo[playerid][gPupgrade]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`ConnectTime`=%d,",PlayerInfo[playerid][pConnectTime]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Sex`=%d,",PlayerInfo[playerid][pSex]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Age`=%d",PlayerInfo[playerid][pAge]);
strcat(query,src,sizeof(query));
format(src,sizeof(src)," WHERE `Name`='%s'",EscapeName);
strcat(query,src,sizeof(query));
mysql_query(query);
Собственно, втф?
Reply
#68

Quote:
Originally Posted by Makar93
Посмотреть сообщение
Внезапно появилась проблема с плагином R5(https://sampforum.blast.hk/showthread.php?tid=56564). При апдейте аккаунтов появляется ошибка:
Код:
[20:41:03] CMySQLHandler::Query(UPDATE `players1` SET `Level`=0,`Admin`=0,`Cash`=300,`Helper`=0,`Exp`=135,`Tut`=1,`Register`=0,`DonateRank`=0,`UpgradePoint`=0,`ConnectTime`=0,`Sex`=1,`Age`=26 WHERE `Name`='Hector_Ramirez') - An error has occured. (Error ID: 2014, Commands out of sync; you can't run this command now)
[20:41:03] >> mysql_query( Connection handle: 1 )
Код:
new src[512],name[MAX_PLAYER_NAME],EscapeName[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
mysql_real_escape_string(name, EscapeName);
GetPlayerPos(playerid,PlayerInfo[playerid][pPos_x],
	PlayerInfo[playerid][pPos_y],PlayerInfo[playerid][pPos_z]);
GetPlayerFacingAngle(playerid,PlayerInfo[playerid][pPos_f]);
format(query,sizeof(query),"UPDATE `"PlayerTable"` SET ");
format(src,sizeof(src),"`Level`=%d,",PlayerInfo[playerid][pLevel]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Admin`=%d,",GetAdminLevel(playerid));
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Cash`=%d,",PlayerInfo[playerid][pCash]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Helper`=%d,",PlayerInfo[playerid][pHelp]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Exp`=%d,",PlayerInfo[playerid][pExp]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Tut`=%d,",PlayerInfo[playerid][pTut]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Register`=%d,",PlayerInfo[playerid][pReg]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`DonateRank`=%d,",PlayerInfo[playerid][pDonateRank]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`UpgradePoint`=%d,",PlayerInfo[playerid][gPupgrade]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`ConnectTime`=%d,",PlayerInfo[playerid][pConnectTime]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Sex`=%d,",PlayerInfo[playerid][pSex]);
strcat(query,src,sizeof(query));
format(src,sizeof(src),"`Age`=%d",PlayerInfo[playerid][pAge]);
strcat(query,src,sizeof(query));
format(src,sizeof(src)," WHERE `Name`='%s'",EscapeName);
strcat(query,src,sizeof(query));
mysql_query(query);
Собственно, втф?
У меня это заняло меньше минуты использования гугла по тексту ошибки: A.2.12 Ошибка в клиенте Commands out of sync
Почему бы в следующий раз не попробовать поискать самому?
Reply
#69

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
У меня это заняло меньше минуты использования гугла по тексту ошибки: A.2.12 Ошибка в клиенте Commands out of sync
Почему бы в следующий раз не попробовать поискать самому?
Я видел это, выше конкретный код, там лишь одно выполнение запроса, как может быть неверный порядок?
Reply
#70

Quote:
Originally Posted by Makar93
Посмотреть сообщение
Я видел это, выше конкретный код, там один лишь вызов запроса, как может быть неверный порядок?
А теперь читаем ещё раз и внимательно!
Quote:

Это может произойти, например, если используется mysql_use_result() и делается попытка выполнить новый запрос до того, как вызвана mysql_free_result(), или если клиент пытается выполнить два возвращающих данные запроса без обращения к mysql_use_result() либо mysql_store_result() в промежутке между ними.

Подчеркнул основное для слабовидящих.
Reply
#71

Quote:
Originally Posted by Stepashka
View Post
Я не про это, вы когда в таблицу свои данные вставляли, в данных был указан ID или нет?
нет, ид сам заполняется
Reply
#72

Quote:
Originally Posted by Jon_De
View Post
нет, ид сам заполняется
Значит в таблице уже когда-то были записи.
В будущем если вы хотите полностью очистить таблицу и сбросить автоинкремент используйте TRANCATE.
Reply
#73

Можно ли добавлять индекс прямо во время работы с базой? То-есть, когда сервер к ней подключен. Из-за этого проблем не будет?
Reply
#74

Quote:
Originally Posted by stabker
View Post
Можно ли добавлять индекс прямо во время работы с базой? То-есть, когда сервер к ней подключен. Из-за этого проблем не будет?
facepalm.

Не будет.
Reply
#75

Quote:
Originally Posted by stabker
View Post
Можно ли добавлять индекс прямо во время работы с базой? То-есть, когда сервер к ней подключен. Из-за этого проблем не будет?
Только если он не занять и следующие его значения так же свободны!
Reply
#76

Quote:
Originally Posted by eakwarp
View Post
facepalm.

Не будет.
За ответ спасибо. Но высер с "facepalm" вообще ни к чему.

Quote:
Originally Posted by Stepashka
View Post
Только если он не занять и следующие его значения так же свободны!
Поясните подробнее, пожалуйста.
Reply
#77

Quote:
Originally Posted by stabker
View Post
Поясните подробнее, пожалуйста.
Если при последующем добавлении строк ключ окажется занят таблица сломается. Поэтому я всегда говорю одно и то же - НЕ ТРОГАЕТЕ ВЫ ЭТО ПОЛЕ!
Reply
#78

Quote:
Originally Posted by Stepashka
View Post
Если при последующем добавлении строк ключ окажется занят таблица сломается. Поэтому я всегда говорю одно и то же - НЕ ТРОГАЕТЕ ВЫ ЭТО ПОЛЕ!
Может вы просто мой вопрос не совсем поняли (либо я что-то не так понимаю/спросил)? Мне нужно индекс добавить, а не какое-то уникальное значение изменить и т.п.

Reply
#79

Вот такой вот вопрос.

В таблице имеется 2 строки. У каждой по 3 значения.
Значения первой: name='vasya', age='22', id='1'
Значения второй: name='lena', age='32', id='3'

Мне надо обменять данные строк так, чтобы получилось:
Значения первой: name='lena', age='22', id='3'
Значения второй: name='vasya', age='32', id='1'

Принципы обмена в двух запросах:
1 запрос:
Quote:

UPDATE table SET name='vasya',id='1' WHERE name='lena',id='3'

2 запрос:
Quote:

UPDATE table SET name='lena',id='3' WHERE name='vasya',id='1'

Но на практике в итоге получается:
Значения первой: name='lena', age='22', id='3'
Значения второй: name='lena', age='32', id='3'

А всё потому, что запросы выполняются по очереди, и пока второй запрос начнет выполняться, данные уже изменятся. Собственно, как решить проблему?
Reply
#80

Сохранять в переменную.
И зачем ты меняешь имена и идишники, если тебе необходимо поменять только возраст?
Reply


Forum Jump:


Users browsing this thread: 5 Guest(s)