Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы) |
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 возникла небольшая проблема... код выполняется если в базе записан хотябы один юзер а если она пустая то глухо... Как это решить? |
|
|
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, следуя венгерской нотации. Если не понятно, что делается в коде, - спрашивай, я объясню подробно)) |
|
|
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 записывает в базу мой ник и мой ип при коннекте(ну или другого юзера) |
|
|
1.10.2008, 17:33
Сообщение
#4
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Смотри пост выше. Если не понятно что-то, я ещё раз подробно объясню, что в каждой строчке делается)))))
|
|
|
1.10.2008, 17:45
Сообщение
#5
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
2). Какую нагрузку несёт буква s в начале переменной sUser? Вроде как попытка использовать венгерскую нотацию, но все же не понятно почему таблица обозначается как строка? s - от слова String. По венгерской нотации надо бы писать tUser. t - Table. никакого смысла она не несёт если напишешь что то про нотацию будет хорошо))) 3). Я полагаю, что ты хочешь написать что-то в этом роде: Я хочу написать что то типо юзер инфо написаного Николя только наверно более сжато. А от данного куска кода хочу чтобы при входе на хаб он смотрел нет ли IP юзера в базе и если нет заприсывал его туда со всеми остальными данными как ник и т.д. Код 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 Буду очень признателен если распишешь поподробнее))) |
|
|
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 Надеюсь понятно объяснил |
|
|
1.10.2008, 18:26
Сообщение
#7
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Супер)))) Думаю понятнее просто некуда)))) БД это вещь))))
А ещё вопрос если бы можно было открыть БД с помощью какого нибудь визуального редактора она была бы вот такой: id................Nick.................IP 1............-=Wariner=-......10.2......... 2................ник2................ip2 и тд.(без точек конечно же) Или я ошибаюсь? |
|
|
1.10.2008, 18:30
Сообщение
#8
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
ты прав на все 100
|
|
|
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 это я проверил) |
|
|
1.10.2008, 19:28
Сообщение
#10
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Как ты создаёшь таблицу напиши
|
|
|
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 |
|
|
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)")
|
|
|
1.10.2008, 21:44
Сообщение
#13
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
2Setuper: А есть такая прога которая бы открывала БД как блокнот? чтобы наглядгно видеть что получилось? Если есть подскажи название, пожалуйста.
|
|
|
1.10.2008, 21:55
Сообщение
#14
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Вообще говоря это можно найти ТУТ Просто иногда достаточно повнимательнее читать посты. Внизу первого поста я приводил наиболее полезные линки для работы с SQLite. |
|
|
2.10.2008, 17:52
Сообщение
#15
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
А можно ли создавать столбцы в базе по ходу дела? Т.е. при заходе на хаб идёт сличение IP если IP в БД есть то сличается ник, если он отличается от от записанного в БД то создаётся новый столбец типо "старый ник1" и туда перемещается ник из БД а новый Заносится на место старого.
|
|
|
2.10.2008, 20:14
Сообщение
#16
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код db:exec("ALTER TABLE имя_таблицы ADD имя_столбца") Опять же по указанным мною ссылкам это легко находится: |
|
|
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]] если делаю просто то вообще в БД ничего не записывается даже у первого юзера((( |
|
|
2.10.2008, 22:57
Сообщение
#18
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Итак, по порядку:
С первым вошедшим всё нормально. При заходе второго человека он сразу же приступает к выполнению условия 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! если делаю просто то вообще в БД ничего не записывается даже у первого юзера((( Что касается этого, то это я не верно написал. Извиняюсь. Дело в том, что предзапросы должны как-то обрабатываться обращением к базе данных. В случае, если написать просто 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 библиотекой уже давно остро стоит! |
|
|
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: совсем запутался((( |
|
|
3.10.2008, 10:50
Сообщение
#20
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ага. В общем тухлая библиотека и как она работает диву даёшься.
Ещё раз говорю переходи на API1 там таких проблем нет. Я пытался скомпилить нормальную либу, но запутался в def файлах и скомпилив она у меня не работала. Хотя я думаю, что если разобраться, то скомпилить можно, вот только нет времени разбираться. |
|
|
Похожие темы
|
Сейчас: 27.11.2024, 1:55 |