2012-12-03 43 views
1

我想打印在APPLICATION.rkt球拍:如何打印mysql的结果在一个HTML页面

生成的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") 

任何建议,我在做什么wrnog?

回答

3

有几个问题。

首先,使用quasiquote(或“反引号”)而不是quote;否则你无法用,@(即unquote-splicing)逃脱。换句话说,改变

'(html ___) 

`(html ___) 

然后,,@逃生里面,你map s为错误的,mapin-query反正工作。你可能想是这样的,而不是:

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

或者类似的东西。 (上面的代码将使一个1级标题为表中的每一行,如果这就是你想要的。)


编辑回应评论:它看起来像id是一个数字列在数据库。如果您有最新版本的球拍,我推荐使用~a,这与string-append相似,但是会自动将非字符串值先转换为字符串。的createstring定义改成这样:

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

在旧版本的球拍(~a之前),使用format(请参阅对如何文档)。

+0

非常感谢您的及时和非常有用的答复.. 查询现在excuted并得到答复,但我得到一个“违反合同”的错误消息 对不起我在拍 与字符串一个begginner追加:违反合同 预计:字符串? 给出:1个 说法位置:第二 其他参数...: “ID为” “并将其命名为” “A” “和SID是” “B” –

+0

@Racketbeginner,查看更新到我的回答。 –