
Daniel
29.08.2017
11:10:50
"здравствуйте, меня зовут Васлий. и я 15 лет программировал на ПХП" - "здравствуй, Василий"

Alexander
29.08.2017
11:12:48
так, не отвлекаемся
есть мап, произвольной длинны, надо собрать INSERT INTO (?,?...?) VALUES(?,?...?)

Google

Mush
29.08.2017
11:14:48
Ассоциативный массив - самое неправильное название хешмапа
как-то н лет назад был я на пхп собесе как испытуемый.
господа спрашивали меня про внутреннее устройство типов на пхп. я робко сказал “там все структуры - это нечто вокруг внутреннего типа zval” (вроде так там эта структура в пхп исходниках называется).
Господа встрепенулись - как же ты не знаешь хешмап? Это же ассоциативный массив пхп! были уверены что ассоциативный массив это прямо таки хешмапа внутри. и соотв порядок ключей там не хранится.
прямо с пеной у рта говорили что это так и очень удивились когда порядок ключе в ассоциативном пхп массиве соответствовал порядку их добавления.

Alexander
29.08.2017
11:14:57
squirrel уже смотрю, спасибо

Daniel
29.08.2017
11:17:05

Alexander
29.08.2017
11:19:22
есть у белки Insert("users").Columns("name", "age") , но не вижу, чтобы можно было сделать Insert("users").Columns(my_map)

Ivan
29.08.2017
11:20:05
это го

Daniel
29.08.2017
11:20:08

Ivan
29.08.2017
11:20:09
нету магии тут

Alexander
29.08.2017
11:22:20

Andrew
29.08.2017
11:22:38

Alexander
29.08.2017
11:27:28
а я смогу передать в функцию .Exec(), которая принимает разное количество переменных, передать несколько параметров из мапы?
если никто не понял, то как вместо args ...interface{} запихнуть массив?

Daniel
29.08.2017
11:28:47
array...

Kirill
29.08.2017
11:29:23

Google

Kirill
29.08.2017
11:29:30
А мапу - нет

Daniel
29.08.2017
11:31:18
jib,jxrf
вот так правильно:
func makeQuery(table string, myMap map[string]interface{}) (string, []interface{}) {
keys := make([]string, 0, len(myMap))
vals := make([]interface{}, 0, len(myMap))
for key, val := range myMap {
keys = append(keys, key)
vals = append(vals, val)
}
placeholders := strings.Repeat("?,", len(keys))
return fmt.Sprintf(
"INSERT INTO %s (%s) VALUES(%s)",
table,
strings.Join(keys, ", "),
placeholders[:len(placeholders)-1],
),
vals
}

Mikalai
29.08.2017
11:35:38
вот так правильно:
func makeQuery(table string, myMap map[string]interface{}) (string, []interface{}) {
keys := make([]string, 0, len(myMap))
vals := make([]interface{}, 0, len(myMap))
for key, val := range myMap {
keys = append(keys, key)
vals = append(vals, val)
}
placeholders := strings.Repeat("?,", len(keys))
return fmt.Sprintf(
"INSERT INTO %s (%s) VALUES(%s)",
table,
strings.Join(keys, ", "),
placeholders[:len(placeholders)-1],
),
vals
}
И тут нам прилетает sql-иньекция

Daniel
29.08.2017
11:35:57
а я не говорил, что так надо делать :)

Konstantin
29.08.2017
11:58:43
да мапу валидатором обработать и пойдет)

Daniel
29.08.2017
11:58:57
нет
реально - нет
динамический запрос, основанный на внешних данных - это путь прямо в ад

Konstantin
29.08.2017
12:00:57
построитель запросов не отвечает за данные)

Mikalai
29.08.2017
12:01:04
А вообще какой в этом смысл, список колонок в таблице обычно ведь редко меняется

Daniel
29.08.2017
12:01:58
да коллега не может от php отвыкнуть, хочет написать себе нанопхп

Konstantin
29.08.2017
12:02:28
короче если это все написать в vim то все ок будет ?
ну а если в gogland preview edition. то все отвественность на тебе))
это я сегодня набрался, извините)

Kirill
29.08.2017
12:06:13
Ловите наркомана!

Sergey
29.08.2017
12:07:14
Вообще, если прогаешь в vim, то там по-умолчанию всегда хорошо получается!

Roman ?
29.08.2017
12:08:02
Особенно бибикать и все ломать ?

Givi
29.08.2017
12:11:43
Тааак....

Google

Alexander
29.08.2017
12:17:12

Konstantin
29.08.2017
12:19:43
panic()

Andrew
29.08.2017
12:27:09
panic()
main.go:1: missing argument to panic

Konstantin
29.08.2017
12:27:39
?
https://highloadcup.ru/rating/
никто тут не участвует? что-то гошники отстают немножко, нужно прибавить)

Andrew
29.08.2017
13:35:34

xPushkin
29.08.2017
13:39:31

Egor
29.08.2017
13:49:30
народ всем привет
затык
слушаю на go проксированный трафик через порт, хочу распарсить то что приходит на порт, читаю всё в []bytes виде, при простом конверте в стрингу приведением типов выходит шляпа
по идее там типичные HTTP. как можно это сделать без геморроя?

Irek
29.08.2017
13:50:35
может быть шифрованный трафик?

Egor
29.08.2017
13:51:30
нет, сервер мой и обработка респонса тоже.
я по сути стою в середине
там всё странного вида с аски символами, среди спецсимволов нужный текст который в нормальном UTF-8

Egor
29.08.2017
13:52:59
хочу распарсить ответ []bytes который видно на скрине в структуру
если чето такое можно вертеть через bufio/url/http модули, то наставьте куда копать хотя бы)

Siarhei
29.08.2017
13:55:28
у тебя там еще на странице лишнее печатается?
а дальше https://github.com/PuerkitoBio/goquery
если я правильно понял

Egor
29.08.2017
13:56:03
если об этом речь

Siarhei
29.08.2017
13:56:19
хм...

Google

Irek
29.08.2017
13:56:41

Siarhei
29.08.2017
13:56:52
а DOCUMENT_ROOT и прочие прелести? откуда они берутся?
на какой-то var_dump похоже

Egor
29.08.2017
13:57:11
схема req —> nginx —> go_tool —> php-fpm —> page.php
go_tool я принимаю запрос по сокету в виде []bytes, вывожу его, хатем передаю в php-fpm

xPushkin
29.08.2017
13:58:02

Siarhei
29.08.2017
13:58:09
я вот тоже не пойму
либо одно, либо другое уже

Egor
29.08.2017
13:58:24

Admin
ERROR: S client not available

xPushkin
29.08.2017
13:58:43

Irek
29.08.2017
13:58:56
и nginx зачем в вашем случае? )

Egor
29.08.2017
13:59:56
могу заверить, на рабочеспособность не влияет никак - оно работает)
просто не могу структурировать данные из []bytes

Irek
29.08.2017
14:00:42
что-то мне подсказывает, что вашу картину nginx портит. Уверены, что он проксирует корректные данные?

Aleksandr
29.08.2017
14:00:43

xPushkin
29.08.2017
14:01:08

Egor
29.08.2017
14:02:52
нее..
входная точка - в сокете лежит проксированный nginx-ом запрос
я его читаю в []bytes через .Read() и мне приходит то что выше можно посмотреть
по факту там лежит HTTP запрос в виде []bytes и респонс на него в том же виде
задача привести в страктовый вид и разбить хэдеры, бади и тд

Aleksandr
29.08.2017
14:04:01

Google

Egor
29.08.2017
14:04:20
может быть любым - ограничивается только HTTP протоколом

Aleksandr
29.08.2017
14:04:34
ты хранишь в каком-то неведомом формате. просишь нас помочь тебе распарсить этот неведомый формат. мы не знаем формат. ты знаешь?

Dmitriy
29.08.2017
14:06:07
Привет! Ребят, сможете подсказать?
Использую protobuf через grpc. Задался вопросом как идентифицировать сессию клиента между запросами, пока что только в голове решение – token прописать в каждом request message
Есть ли у кого-нибудь другое решение?

Egor
29.08.2017
14:06:10
вопрос как этот хлам с кривой аски превращать в структуру по полям конкретным?

Aleksandr
29.08.2017
14:08:35

Egor
29.08.2017
14:08:45
как бы вот

Irek
29.08.2017
14:08:53
Заголовки из nginx должны через x-forwarder передаваться
Включено у тебя?

Egor
29.08.2017
14:09:07
угу

Irek
29.08.2017
14:10:33

Aleksandr
29.08.2017
14:11:54
как бы вот
на последнем скрине видно, что это контрольные символы, а сам текст заголовков и тела корректен в общем-то.
опять же это не http, который тебе известен, а попытка хранения nginx запроса-ответа (запроса кстати на скринах я не вижу - только ответ и серверные переменные)
в общем это какая0то nginx-фича, с которой тебе надо разбираться самому, и в целом, кажется, по твоему описанию, это не то что тебе нужно
вот как выглядит http-request в том http, который мы знаем:
GET /
Host: [host]
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
это не то, что на твоих скринах

Egor
29.08.2017
14:19:09