2014-10-27 188 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