myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
6 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему

> Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы)

Теги
Wariner
сообщение 1.10.2008, 16:46
Сообщение #1


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Вот есть
CODE
function UserConnected(sUser)
local ip = sUser.sIP
for row in db:rows("SELECT * FROM UserStat") do
if row.IP ~= IP then
local stmt=db:prepare("SELECT * FROM UserStat")
if stmt then
db:exec("INSERT INTO UserStat (Nick,IP) VALUES ('"..sUser.sNick.."', '"..sUser.sIP.."')")
end
end
end
Core.SendToNick(sUser.sNick,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]|")
end

возникла небольшая проблема... код выполняется если в базе записан хотябы один юзер а если она пустая то глухо... Как это решить?
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 16:57
Сообщение #2


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




1). Ты понимаешь, что ты пишет? Если понимаешь, то объясни. Потому что, если даже таблица не пустая, данный код (если исправить локальную переменную ip на IP) создаст гигантское количество повторяющихся записей.

2). Какую нагрузку несёт буква s в начале переменной sUser? Вроде как попытка использовать венгерскую нотацию, но все же не понятно почему таблица обозначается как строка? s - от слова String. По венгерской нотации надо бы писать tUser. t - Table.

3). Я полагаю, что ты хочешь написать что-то в этом роде:
Код
function UserConnected(tUser)
    local stmt=db:prepare("SELECT IP FROM UserStat WHERE IP='"..tUser.sIP.."'")
    if not stmt or not stmt:first_row() then
        db:exec("INSERT INTO UserStat (Nick,IP) VALUES ('"..tUser.sNick.."', '"..tUser.sIP.."')")
    else
        db:exec("UPDATE UserStat SET Nick='"..tUser.sNick.."' WHERE IP='"..tUser.sIP.."'")
    end
    Core.SendToUser(tUser,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]&#*124;")
end
* - удалить.

Заметь я справил в коде sUser на tUser, следуя венгерской нотации.

Если не понятно, что делается в коде, - спрашивай, я объясню подробно))
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 17:18
Сообщение #3


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




скорее нет чем да))) но вот этот код
CODE
function UserConnected(sUser)
local stmt=db:prepare("SELECT * FROM UserStat")
if stmt then
db:exec("INSERT INTO UserStat (Nick,IP) VALUES ('"..sUser.sNick.."', '"..sUser.sIP.."')")
end
Core.SendToNick(sUser.sNick,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]|")
end


записывает в базу мой ник и мой ип при коннекте(ну или другого юзера)
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 17:33
Сообщение #4


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Смотри пост выше. Если не понятно что-то, я ещё раз подробно объясню, что в каждой строчке делается)))))
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 17:45
Сообщение #5


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Цитата(Setuper @ 1.10.2008, 17:57) *
2). Какую нагрузку несёт буква s в начале переменной sUser? Вроде как попытка использовать венгерскую нотацию, но все же не понятно почему таблица обозначается как строка? s - от слова String. По венгерской нотации надо бы писать tUser. t - Table.

никакого смысла она не несёт если напишешь что то про нотацию будет хорошо)))
Цитата(Setuper @ 1.10.2008, 17:57) *
3). Я полагаю, что ты хочешь написать что-то в этом роде:

Я хочу написать что то типо юзер инфо написаного Николя только наверно более сжато. А от данного куска кода хочу чтобы при входе на хаб он смотрел нет ли IP юзера в базе и если нет заприсывал его туда со всеми остальными данными как ник и т.д.
Цитата(Setuper @ 1.10.2008, 17:57) *
Код
function UserConnected(tUser)
    local stmt=db:prepare("SELECT IP FROM UserStat WHERE IP='"..tUser.sIP.."'")
    if not stmt or not stmt:first_row() then
        db:exec("INSERT INTO UserStat (Nick,IP) VALUES ('"..tUser.sNick.."', '"..tUser.sIP.."')")  -- вставляет в базу кик и ип
    else
        db:exec("UPDATE UserStat SET Nick='"..tUser.sNick.."' WHERE IP='"..tUser.sIP.."'") -- меняет ник на новый у юзера с данным ip
    end
    Core.SendToUser(tUser,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]&#*124;")
end
* - удалить.

Буду очень признателен если распишешь поподробнее)))
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 18:17
Сообщение #6


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Код
function UserConnected(tUser)

    --[[Выполнение предзапроса.
    Для экономии процессорного времени и памяти вместо запроса SELECT *,
    используем запрос SELECT IP, но по сути можно и так, и так.
    Запрос SELECT IP FROM UserStat выдаст все ip адреса,
    но зачем нам все адреса, когда нам нужен ip адрес вошедшего юзера.
    поэтому пишем запрос и добавляем, что поле IP в нашей таблице должно равняться tUser.sIP.]]

    local stmt=db:prepare("SELECT IP FROM UserStat WHERE IP='"..tUser.sIP.."'")


    --[[Проверка, что предзапрос не выполнился или нет ни одной строки нашего запроса.
    В принципе можно было написать просто if not stmt then]]

    if not stmt or not stmt:first_row() then


        --[[Если наш запрос на выдачу ip адреса пользователя не прошёл,
        то это означает, что пользователя с таким ip нету в нашей базе.
        Значит надо его туда добавить.
        Запрос INSERT INTO 'имя_таблицы' ('столбцы') VALUES ('вносимые_данные')
        заносит данные в таблицу]]

        db:exec("INSERT INTO UserStat (Nick,IP) VALUES ('"..tUser.sNick.."', '"..tUser.sIP.."')")
    else


        --[[Если наш запрос на получение из базы данных ip адреса вошедшего юзера выполнился,
        то нам не надо вносить данные в базу данных.
        Если попытаться внести данные запросом INSERT, то данные занесутся
        и будут две одинаковые строки в таблице, что нарушит целостность базы данных.
        Однако нужно учесть, что юзер может зайти с другого ника,
        поэтому надо обновить ник пользователя.
        Запрос, осуществляющий обновление уже существующих данных в таблице выглядит так:
        UPDATE 'имя_таблицы' SET 'обновляемое_поле'='новое_значение']]

        db:exec("UPDATE UserStat SET Nick='"..tUser.sNick.."' WHERE IP='"..tUser.sIP.."'")
    end
    Core.SendToUser(tUser,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]&#*124;")
end


Надеюсь понятно объяснил big_smile.gif
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 18:26
Сообщение #7


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Супер)))) Думаю понятнее просто некуда)))) БД это вещь))))
А ещё вопрос если бы можно было открыть БД с помощью какого нибудь визуального редактора она была бы вот такой:
id................Nick.................IP
1............-=Wariner=-......10.2.........
2................ник2................ip2
и тд.(без точек конечно же) Или я ошибаюсь?
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 18:30
Сообщение #8


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




ты прав на все 100
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 19:12
Сообщение #9


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




блин, ну что ж у меня затыки на каждом шагу(((
вот
CODE
function UserConnected(sUser)
Core.GetUserAllData(sUser)
local shara = sUser.iShareSize or 0
Core.SendToUser(sUser, GetNormalShare(shara))
local stmt=db:prepare("SELECT IP FROM UserStat WHERE IP='"..sUser.sIP.."'")
if not stmt or not stmt:first_row() then
db:exec("INSERT INTO UserStat (Nick,IP,Shara) VALUES ('"..sUser.sNick.."', '"..sUser.sIP.."', '"..shara.."')")
else
db:exec("UPDATE UserStat SET Nick='"..sUser.sNick.."', Shara='"..shara.."' WHERE IP='"..sUser.sIP.."'")
end
Core.SendToNick(sUser.sNick,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]|")
end

с ником и ипом всё нормально, а с шарой начались проблемы(((
Добавил при конекте отсылание в чат шары для проверки там всё норм, после записи в БД и извлечении с шарой происходят непонятки((( например с одного клиента шара 17.69ГБ а показыват 1.694 ГБ а с другого 18 ГБ а показывает минус и большое число байтов(дело не в функции GetNormalShare это я проверил)
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 19:28
Сообщение #10


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Как ты создаёшь таблицу напиши
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 19:44
Сообщение #11


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




CODE
function OnStartup()
db = sqlite3.open("Userstat.db3")
db:exec("CREATE TABLE UserStat (id INTEGER PRIMARY KEY, Nick INTEGER, IP INTEGER, Shara INTEGER)")
end

Не ужели у шары тип данных не INTEGER beat_brick.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 21:15
Сообщение #12


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Код
db:exec("CREATE TABLE UserStat (id INTEGER PRIMARY KEY, Nick TEXT, IP TEXT, Shara TEXT)")
Go to the top of the page
+Quote Post
Wariner
сообщение 1.10.2008, 21:44
Сообщение #13


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




2Setuper: А есть такая прога которая бы открывала БД как блокнот? чтобы наглядгно видеть что получилось? Если есть подскажи название, пожалуйста.
Go to the top of the page
+Quote Post
Setuper
сообщение 1.10.2008, 21:55
Сообщение #14


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




sqlitebrowser

Вообще говоря это можно найти ТУТ
Просто иногда достаточно повнимательнее читать посты. Внизу первого поста я приводил наиболее полезные линки для работы с SQLite. big_smile.gif
Go to the top of the page
+Quote Post
Wariner
сообщение 2.10.2008, 17:52
Сообщение #15


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




А можно ли создавать столбцы в базе по ходу дела? Т.е. при заходе на хаб идёт сличение IP если IP в БД есть то сличается ник, если он отличается от от записанного в БД то создаётся новый столбец типо "старый ник1" и туда перемещается ник из БД а новый Заносится на место старого.
Go to the top of the page
+Quote Post
Setuper
сообщение 2.10.2008, 20:14
Сообщение #16


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Код
db:exec("ALTER TABLE имя_таблицы ADD имя_столбца")


Опять же по указанным мною ссылкам это легко находится:
http://sb-news.net/sqlite.php?page=35
Go to the top of the page
+Quote Post
Wariner
сообщение 2.10.2008, 21:38
Сообщение #17


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




с помощью sqlitebrowser`а обнаружелась ошибка в коде
CODE
function UserConnected(sUser)
Core.GetUserAllData(sUser)
local shara = sUser.iShareSize or 0
local stmt=db:prepare("SELECT IP FROM UserStat WHERE IP='"..sUser.sIP.."'")
if not stmt or not stmt:first_row() then
db:exec("INSERT INTO UserStat (Nick,IP,Shara,Msg,DataOff) VALUES ('"..sUser.sNick.."', '"..sUser.sIP.."', '"..shara.."', '0', '0')")
else
db:exec("UPDATE UserStat SET Nick='"..sUser.sNick.."', Shara='"..shara.."' WHERE IP='"..sUser.sIP.."'")
end
Core.SendToNick(sUser.sNick,"$UserCommand 1 3 Статистика$<%[mynick]> !ui %[line:Введите ник]|")
end

С первым вошедшим всё нормально. При заходе второго человека он сразу же приступает к выполнению условия else. Я честно говоря не понимаю почему так.
2Setuper ещё раз перечитал твоё описание вроде поо нему всё верно...
Цитата
--[[Проверка, что предзапрос не выполнился или нет ни одной строки нашего запроса.
В принципе можно было написать просто if not stmt then]]

если делаю просто то вообще в БД ничего не записывается даже у первого юзера(((
Go to the top of the page
+Quote Post
Setuper
сообщение 2.10.2008, 22:57
Сообщение #18


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Итак, по порядку:

Цитата(Wariner @ 2.10.2008, 22:38) *
С первым вошедшим всё нормально. При заходе второго человека он сразу же приступает к выполнению условия else. Я честно говоря не понимаю почему так.
2Setuper ещё раз перечитал твоё описание вроде поо нему всё верно...


Это не единственный глюк dll библиотеки базы данных для API2.
Глюки:
1). Нельзя создать более одной таблицы в базе данных.
2). Нельзя создать более одной записи в таблице.

Данные глюки отсутствуют в полноценной библиотеке для API1.
Именно по этой причине у меня в подписи написано:
PtokaX 0.3.6.0 + Lua 5.1.3 + SQLite 3.2.7 + SBot 6.0RC3 - now
PtokaX 0.4.1.1 + Lua 5.1.3 + SQLite 3.5.6 + SBot 7.0RC1 - in the future!
still_dreaming.gif


Цитата(Wariner @ 2.10.2008, 22:38) *
если делаю просто то вообще в БД ничего не записывается даже у первого юзера(((

Что касается этого, то это я не верно написал. Извиняюсь.
Дело в том, что предзапросы должны как-то обрабатываться обращением к базе данных. В случае, если написать просто if not stmt then, то обработки этого предзапроса не произошло. Обрабатывать предзапрос следует одним из из следующих способов:
Код
stmt:first_row()
stmt:rows()
stmt:cols()
stmt:exec()


Поэтому правильно писать так:
Код
if not stmt or not stmt:first_row() then


Способ обработки предзапроса stmt:first_row() выбран из-за экономии процессорного времени и памяти - это самый эффективный запрос для проверки.


Поэтому как ни крути а на новой PtokaX ты не сможешь ничего нормально реализовать, используя БД.
Проблема с DLL библиотекой уже давно остро стоит!
Go to the top of the page
+Quote Post
Wariner
сообщение 3.10.2008, 8:23
Сообщение #19


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




т.е

id................Nick.................IP
1............-=Wariner=-......10.2.........
2 - а вот эту строку записать уже не возможно? я правильно понял?:'-(

а ещё хочу уточнить проблема только в dll или и в sqlite3.lua тоже?
PS: а не известно когда сие чудо сделают рабочим?
PS2: что то я с утра натупил.... Ведь коогда не было проверки на новый или старый IP в базу сохранялось несколько строк!!!
PS3: совсем запутался(((
Go to the top of the page
+Quote Post
Setuper
сообщение 3.10.2008, 10:50
Сообщение #20


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Ага. В общем тухлая библиотека и как она работает диву даёшься.
Ещё раз говорю переходи на API1 там таких проблем нет.

Я пытался скомпилить нормальную либу, но запутался в def файлах и скомпилив она у меня не работала.
Хотя я думаю, что если разобраться, то скомпилить можно, вот только нет времени разбираться.
Go to the top of the page
+Quote Post

6 страниц V   1 2 3 > » 
Ответить в данную темуНачать новую тему
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts ВАЖНО: Topic has attachmentsВопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
1 049 Wariner 991 361 3.2.2019, 12:51 Посл. сообщение: MIKHAIL
No new ВАЖНО: Topic has attachmentsМодули для скриптов RusHub
26 Setuper 45 394 21.3.2017, 17:31 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsВаши Вопросы И Предложения По Поводу Форума
447 Svyat 322 163 20.10.2015, 19:39 Посл. сообщение: Ksan
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 337 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No new Topic has attachmentsВопросы по протоколу NMDC
Делаю программу
26 Master255 29 751 12.1.2015, 0:38 Посл. сообщение: Master255
No New Posts Вопросы к Phazeus по Экзекутору
Мастер может забанить мастера, как решить в Экзекуторе?
1 AndreiDC 5 373 31.10.2014, 19:20 Посл. сообщение: Ksan
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 800 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 7 309 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 25 996 28.1.2014, 13:11 Посл. сообщение: Alexey
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 269 300 19.12.2013, 13:59 Посл. сообщение: mod
No new Topic has attachmentsМелкие вопросы
44 Wariner 50 989 19.9.2013, 12:34 Посл. сообщение: Alexey
No New Posts От: Ваши Вопросы И Предложения По Поводу Форума
От темы с ID: 753
3 anila 9 130 28.3.2013, 16:02 Посл. сообщение: настя
No New Posts Единая платформа для скриптов
Обсуждения вопроса создания единой платформы скриптов
5 Enyby 9 056 18.1.2012, 20:15 Посл. сообщение: Setuper
No new Topic has attachmentsПеределка скриптов
Прошу помощи
47 Fe(one)X 41 396 26.12.2011, 15:04 Посл. сообщение: Ksan
No New Posts От: Вопросы по RusHub
От темы с ID: 2902
4 Otshelnik-Fm 8 471 19.10.2011, 9:23 Посл. сообщение: Mangust

 



RSS Сейчас: 26.11.2024, 23:28