1

我正在尝试在 APPLICATION.rkt 中生成的 HTML 页面上打印数据库中的值

但这就是我在执行下面的代码时看到的

&createstring;&db-conn;SELECT * from students

这是我要执行的操作:

#lang 球拍
(需要分贝)
(需要网络服务器/servlet)
(提供/合同(开始(请求?->。响应?)))

(定义 db-conn
      (虚拟连接
         (lambda () (mysql-connect #:server "localhost"
                 #:端口 8889
                 #:数据库“SOB”
                 #:用户“根”
                 #:密码“root”))))




(定义(开始请求)
  (定义(创建字符串 id 名称 sid)
    (string-append "id 是 "id "and name 是 "name" and sid 是 "sid))
  (响应/xexpr
   '(html
     (头(标题“SOB”))
     (身体
      ,@(map (h1) (map createstring (in-query db-conn "SELECT * from students"))))
     )))


(需要 web-server/servlet-env)
(服务/servlet 启动
               #:启动浏览器?#F
               #:退出?#F
               #:listen-ip #f
               #:端口 8080
               #:额外文件路径
               (列表(构建路径“/Users/lalith/Documents/LALITH FILES/MDX/SOB/”“htmlfiles”))
               #:servlet 路径
               “/servlets/APPLICATION.rkt”)

关于我在做什么 wrnog 有什么建议吗?

4

1 回答 1

3

有几个问题。

首先,使用quasiquote(或“反引号”)代替quote; 否则你不能用,@(ie, unquote-splicing) 来逃避它。换句话说,改变

'(html ___)

`(html ___)

然后,在,@逃生中,您map的 s 是错误的,并且无论如何map都无法使用。in-query你可能想要这样的东西:

,@(for/list ([(id name sid)
              (in-query db-conn "SELECT id, name, sid from students")])
    `(h1 ,(createstring id name sid)))

或类似的东西。(如果您想要的话,上面的代码将为表中的每一行创建一个级别 1 的标题。)


编辑回应评论:它看起来像是id数据库中的一个数字列。如果您有最新版本的 Racket,我建议使用~a,它类似于string-append但会先自动将非字符串值转换为字符串。将定义更改为createstring

(define (createstring id name sid)
  (~a "id is " id "and name is " name "and sid is "  sid))

在旧版本的 Racket(之前~a)中,format请改用(请参阅文档了解如何)。

于 2012-12-03T01:49:10.233 回答