Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在golang html模板中访问{range.}}范围之外的结构变量_Html_Templates_Go - Fatal编程技术网

在golang html模板中访问{range.}}范围之外的结构变量

在golang html模板中访问{range.}}范围之外的结构变量,html,templates,go,Html,Templates,Go,以及发送到模板的帖子片段的来源 type Post struct { threadID int subject string name string text string date_posted string } func (p *Post) ThreadID() int { return p.threadID } func (p *Post) Subject() string { return p.subject } func (p *Post) Name()

以及发送到模板的帖子片段的来源

type Post struct {
threadID int
subject string
name string
text string
date_posted string
}

func (p *Post) ThreadID()   int    { return p.threadID    }
func (p *Post) Subject()    string { return p.subject     }
func (p *Post) Name()       string { return p.name        }
func (p *Post) Text()       string { return p.text        }
func (p *Post) DatePosted() string { return p.date_posted } 

如果线程ID只能从POST类型本身检索,考虑将您的帖子切片转换成单独的类型。给它一个ThreadID方法,它只返回它包含的第一篇文章的id,如果不存在,则返回零

threadID := r.URL.Path[len("/reply/"):]
replies, err := i.db.Query("SELECT * FROM latest_threads where thread_id="+threadID);
将此列表传递到模板中。现在,您可以在
{{range.}
子句之外的任何地方从模板引用它

type PostList []*Post

func (p PostList) ThreadId() int {
    if len(p) == 0 {
        return 0
    }
    return p[0].ThreadId
}

利用漏洞警告 作为旁注,它与SQL查询有关。
你可能只是把它作为一个简单的例子。如果不是,请注意,您的代码是一个配方。如果线程ID是数字的,那么请确保在将其传递到SQL查询之前对其进行解析。例如:清理输入。

您可以将其作为一个结构传递,如下所示:

<form action="/post/{{.ThreadID}}" method="POST">
那么像这样的事情就行了

layoutData := struct {
    ThreadID int
    Posts []Post
} {
    ThreadID: threadID,
    Posts: Posts,
}

试验
回复
{{range$post:=.Posts}
{{$post.Subject}
{{$post.Name}
{{$post.DatePosted}
{{$post.Text}



{{end}
您只需传入threadID和文章片段,然后就可以引用它了。创建表单不需要覆盖任何内容。如何将两个内容传递给模板@Corylanou如果您与我分享如何将切片传递到模板,我将修改该代码以向您展示如何执行该操作。sqlx包()和go数据库sql站点()都有关于如何根据您的DB驱动程序(mySQL/Postgres/etc)执行此操作的示例。这非常有意义!谢谢。我对范围有一些问题,我在范围退出状态1编辑中遇到了意外错误:用{{range$post:=.Posts}}修复了它。是的,很抱歉,我也修复了这个示例。我有同样的问题,但我想访问.Posts范围内的.ThreadID。我不知道我该怎么做。sqli上的道具-因为我知道有人使用复制/粘贴,并且认为他们的问题已经解决了。
<form action="/post/{{.ThreadID}}" method="POST">
layoutData := struct {
    ThreadID int
    Posts []Post
} {
    ThreadID: threadID,
    Posts: Posts,
}
<!DOCTYPE html>
<html>
<head>
    <title> Test </title>
</head>
<body>
    <div>
        <h2>Reply</h2>
        <form action="/post/{{ .ThreadID }}" method="POST">
        <input type="text" name="subject" />
        <input type="text" name="name" value="Anonymous" />
        <input type="text" name="message" />
        <input type="submit" value="submit" />
        </form>
    </div>
    <div>
        {{range $post := .Posts}}
        <h3>{{ $post.Subject}}</h3>
        <h3>{{$post.Name}}</h3>
        <div>{{$post.DatePosted}}</div>
        <div><p>{{$post.Text}}</p></div>
        <br /><br />
        {{end}}
    </div>
</body>