Racket:如何在HTML页面中打印mysql结果

时间:2012-12-03 00:52:05

标签: html mysql racket

我正在尝试在APPLICATION.rkt

中生成的HTML页面上打印数据库中的值

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

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

以下是我要执行的内容:

#lang racket
(require db)
(require web-server/servlet)
(provide/contract (start (request? . -> . response?)))

(define db-conn
      (virtual-connection
         (lambda () (mysql-connect   #:server "localhost"
                 #:port 8889
                 #:database "SOB"
                 #:user "root"
                 #:password "root"))))




(define (start request)
  (define (createstring id name sid)
    (string-append "id is " id "and name is " name "and sid is "  sid))
  (response/xexpr
   '(html
     (head (title "SOB"))
     (body 
      ,@(map (h1) (map createstring (in-query db-conn "SELECT * from students"))))
     )))


(require web-server/servlet-env)
(serve/servlet start
               #:launch-browser? #f
               #:quit? #f
               #:listen-ip #f
               #:port 8080
               #:extra-files-paths
               (list (build-path "/Users/lalith/Documents/LALITH FILES/MDX/SOB/" "htmlfiles"))
               #:servlet-path
               "/servlets/APPLICATION.rkt") 

有关我正在做什么的任何建议吗?

1 个答案:

答案 0 :(得分:3)

有几个问题。

首先,使用quasiquote(或"反引号")代替quote;否则你无法使用,@(即unquote-splicing)逃脱它。换句话说,改变

'(html ___)

`(html ___)

然后,在,@转义内,您的map错误,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(请参阅相关文档)。