2014-10-27 189 views
2

对不起,我的英文。 我想创建一个简单的网站,将从MySQL数据库中获取数据并将其显示在页面上。 我有两个问题:swi prolog mysql + web

% database.pl 
:- module(database, 
[ create_db_connect/0, 
use_database/0, 
query_to_database/1, 
disconnect_database/0 
]). 

:- use_module(library(odbc)). 

create_db_connect :- 
odbc_connect('test', _, 
     [ user('root'), 
     password('123') 
     alias(myblog), 
     open(once) 
]). 

use_database :- 
odbc_query(myblog, 'use test', _). 

query_to_database(X):- 
odbc_query(myblog, 'SELECT data FROM testtable where id = 4', row(X)). 

disconnect_database :- odbc_disconnect(myblog). 

导入此模块中的主要文件:

% el.pl 
:- use_module(library(http/thread_httpd)). 
:- use_module(library(http/http_dispatch)). 
:- use_module(library(http/html_write)). 
:- use_module(library(http/http_parameters)). 
:- use_module(library(http/html_head)). 

:- use_module(database). 

:- http_handler(root(.), home, []). 

server(Port): - 
http_server(http_dispatch, [port(Port)]). 


home(_Request): - 
reply_html_page (
title('Sql'), 
[\ main_page 
]). 

main_page --> 
create_db_connect, 
use_database, 
query_to_database(X), 
disconnect_database, 
html(div('id="tab_c2"', p('~w')-[X])). 

在这种情况下,得到错误

1)在单独的模块做了一个数据库工作:

Warning: The predicates below are not defined. If these are defined 
Warning: at runtime using assert/1, use: - dynamic Name/Arity. 
Warning: 
Warning: create_db_connect/2, which is referenced by 
Warning: /root/prologDev/el.pl:56:17: 1-st clause of main_page/2 

但为什么?我在模块database.pl中定义了它!

2)虽然我不喜欢这个决定,但我调整了这个模块database.pl:

:- module (database, 
[ create_db_connect/2, 
    use_database/2, 
    query_to_database/3, 
    disconnect_database/2 
]). 

:- use_module(library(odbc)). 

create_db_connect(_, _) :- 
odbc_connect('test', _, 
[ user('root'), 
    password('123'), 
    alias(myblog), 
    open(once) 
]). 

use_database(_, _) :- 
odbc_query(myblog, 'use test', _). 
query_to_database(X, _, _) :- 
odbc_query(myblog, 'SELECT data FROM testtable where id = 4', row(X)). 
disconnect_database(_, _) :- odbc_disconnect(myblog). 

而现在,该页面是空的。 当我停止swipl whit halt时,发生错误: my_thread_global_end()中的错误:1个线程没有退出。

我做错了什么?

回答

1

请注意,main_page//0是非终端,而不是谓词。拨叫main_page//0数据库谓词,你需要写类似:

main_page --> 
    {create_db_connect, 
    use_database, 
    query_to_database(X), 
    disconnect_database}, 
    html(div('id="tab_c2"', p('~w')-[X])). 

{}/1结构允许你打电话从谓词(的身体)的语法规则。没有它,create_db_connect和其他将被解释为调用其他非终端(create_db_connect//0,...)。

通常,通过附加两个参数将非终端扩展为谓词。因此,您得到的警告:

Warning: create_db_connect/2, which is referenced by 
Warning: /root/prologDev/el.pl:56:17: 1-st clause of main_page/2