/[LeafOK_CVS]/fenglin/bbs/search_article_v2.php
ViewVC logotype

Annotation of /fenglin/bbs/search_article_v2.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Wed Jan 21 07:58:27 2026 UTC (7 weeks, 6 days ago) by sysadm
Branch: MAIN
Add advanced search using Solr

1 sysadm 1.1 <?php
2     require_once "../lib/db_open.inc.php";
3     require_once "./session_init.inc.php";
4     require_once "./theme.inc.php";
5    
6     force_login();
7    
8     $result_set = array(
9     "return" => array(
10     "code" => 0,
11     "message" => "",
12     "errorFields" => array(),
13     )
14     );
15    
16     $uid = (isset($_GET["uid"]) ? intval($_GET["uid"]) : 0);
17     $username = (isset($_GET["username"]) ? trim($_GET["username"]) : "");
18     $nickname = (isset($_GET["nickname"]) ? trim($_GET["nickname"]) : "");
19     $title = (isset($_GET["title"]) ? trim($_GET["title"]) : "");
20     $content = (isset($_GET["content"]) ? trim($_GET["content"]) : "");
21    
22     if (!isset($_GET["begin_dt"]) || ($begin_dt = DateTimeImmutable::createFromFormat("Y-m-d", $_GET["begin_dt"], $_SESSION["BBS_user_tz"])) == false)
23     {
24     $begin_dt = new DateTimeImmutable("-1 month", $_SESSION["BBS_user_tz"]);
25     }
26     if (!isset($_GET["end_dt"]) || ($end_dt = DateTimeImmutable::createFromFormat("Y-m-d", $_GET["end_dt"], $_SESSION["BBS_user_tz"])) == false)
27     {
28     $end_dt = new DateTimeImmutable("1 day", $_SESSION["BBS_user_tz"]);
29     }
30    
31     $sid = (isset($_GET["sid"]) ? intval($_GET["sid"]) : 0);
32     $ex = (isset($_GET["ex"]) && $_GET["ex"] == "1" ? 1 : 0);
33     $reply = (isset($_GET["reply"]) && $_GET["reply"] == "1" ? 1 : 0);
34     $use_nick = (isset($_GET["use_nick"]) && $_GET["use_nick"] == "1" ? 1 : 0);
35     $original = (isset($_GET["original"]) && $_GET["original"] == "1" ? 1 : 0);
36     $page = (isset($_GET["page"]) ? intval($_GET["page"]) : 1);
37     $rpp = (isset($_GET["rpp"]) ? intval($_GET["rpp"]) : 10);
38    
39     $sid_list = "(-1)";
40     if ($sid > 0)
41     {
42     if ($_SESSION["BBS_priv"]->checkpriv($sid, S_LIST))
43     {
44     $sid_list = $sid;
45     }
46     }
47     else
48     {
49     $rs = mysqli_query($db_conn, "SELECT SID FROM section_config WHERE enable" .
50     ($sid < 0 ? " AND CID = " . (-$sid) : ""));
51     if ($rs == false)
52     {
53     $result_set["return"]["code"] = -2;
54     $result_set["return"]["message"] = "Query section error: " . mysqli_error($db_conn);
55    
56     mysqli_close($db_conn);
57     exit(json_encode($result_set));
58     }
59    
60     while ($row = mysqli_fetch_array($rs))
61     {
62     if ($_SESSION["BBS_priv"]->checkpriv($row["SID"], S_LIST))
63     {
64     $sid_list .= (" OR " . $row["SID"]);
65     }
66     }
67     mysqli_free_result($rs);
68     }
69    
70     // Initialize Solr client
71     $solr_options = array
72     (
73     "hostname" => "localhost",
74     "port" => "8983",
75     "path" => "/solr/lbbs",
76     );
77    
78     $solr_client = new SolrClient($solr_options);
79    
80     $query_str = "" .
81     ($sid_list == "(-1)" ? "" : "SectionId:($sid_list) AND ") .
82     ($reply ? "" : "TopicId:0 AND ") .
83     ($username == "" ? "" : "PostUserName:($username) AND ") .
84     ($nickname == "" ? "" : "PostUserNickName:($nickname) AND ") .
85     ($ex == 1 ? "Excerption:1 AND " : "") .
86     ($original ? "Eransship:0 AND " : "") .
87     "PostDateTime:[" . $begin_dt->setTimezone(new DateTimeZone("UTC"))->format("Y-m-d\T00:00:00\Z") . " TO " .
88     $end_dt->setTimezone(new DateTimeZone("UTC"))->format("Y-m-d\T23:59:59\Z") . "] AND " .
89     ($title == "" ? "" : "ArticleTitle:($title) AND ") .
90     ($content == "" ? "" : "Content:($content) AND ") .
91     "*:*";
92    
93     // Query count of articles
94     $solr_query = new SolrQuery();
95     $solr_query->setQuery($query_str);
96     $solr_query->addField("ArticleId");
97     $solr_query->addSortField("PostDateTime", SolrQuery::ORDER_DESC);
98     try
99     {
100     $solr_res = $solr_client->query($solr_query);
101     }
102     catch (Exception $e)
103     {
104     $result_set["return"]["code"] = -3;
105     $result_set["return"]["message"] = "Solr query error";
106    
107     exit(json_encode($result_set));
108     }
109     $solr_obj = $solr_res->getResponse();
110    
111     if ($solr_obj->responseHeader->status != 0)
112     {
113     $result_set["return"]["code"] = -3;
114     $result_set["return"]["message"] = "Solr query error: " . $solr_obj->responseHeader->status;
115    
116     exit(json_encode($result_set));
117     }
118    
119     $toa = $solr_obj->response->numFound;
120    
121     unset($solr_query);
122    
123     if (!in_array($rpp, $BBS_list_rpp_options))
124     {
125     $rpp = $BBS_list_rpp_options[0];
126     }
127    
128     $page_total = ceil($toa / $rpp);
129     if ($page > $page_total)
130     {
131     $page = $page_total;
132     }
133    
134     if ($page <= 0)
135     {
136     $page = 1;
137     }
138    
139     // Fill up result data
140     $result_set["data"] = array(
141     "uid" => $uid,
142     "sid" => $sid,
143     "ex" => $ex,
144     "reply" => $reply,
145     "use_nick" => $use_nick,
146     "original" => $original,
147     "username" => $username,
148     "nickname" => $nickname,
149     "title" => $title,
150     "content" => $content,
151     "begin_dt" => $begin_dt,
152     "end_dt" => $end_dt,
153     "favorite" => 0,
154     "trash" => 0,
155     "toa" => $toa,
156     "page" => $page,
157     "rpp" => $rpp,
158     "page_total" => $page_total,
159    
160     "articles" => array(),
161     );
162    
163     // Query article IDs
164     $solr_query = new SolrQuery();
165     $solr_query->setQuery($query_str);
166     $solr_query->addField("ArticleId");
167     $solr_query->addSortField("PostDateTime", SolrQuery::ORDER_DESC);
168     $solr_query->setStart(($page - 1) * $rpp);
169     $solr_query->setRows($rpp);
170     try
171     {
172     $solr_res = $solr_client->query($solr_query);
173     }
174     catch (Exception $e)
175     {
176     $result_set["return"]["code"] = -3;
177     $result_set["return"]["message"] = "Solr query error";
178    
179     exit(json_encode($result_set));
180     }
181     $solr_obj = $solr_res->getResponse();
182    
183     if ($solr_obj->responseHeader->status != 0)
184     {
185     $result_set["return"]["code"] = -3;
186     $result_set["return"]["message"] = "Solr query error: " . $solr_obj->responseHeader->status;
187    
188     exit(json_encode($result_set));
189     }
190    
191     // print_r($solr_obj);
192     // exit();
193    
194     $aid_list = "-1";
195    
196     if ($solr_obj->response->docs !== false)
197     {
198     foreach ($solr_obj->response->docs as $doc)
199     {
200     $aid_list .= (", " . $doc["ArticleId"]);
201     }
202     }
203    
204     unset($solr_query);
205     unset($solr_client);
206    
207     // Query articles
208     $sql = "SELECT bbs.*, section_class.cname, section_class.title AS c_title,
209     section_config.sname, section_config.title AS s_title FROM bbs
210     INNER JOIN section_config ON bbs.SID = section_config.SID
211     INNER JOIN section_class ON section_config.CID = section_class.CID" .
212     " WHERE bbs.AID in ($aid_list)" .
213     " ORDER BY sub_dt DESC";
214    
215     $rs = mysqli_query($db_conn, $sql);
216     if ($rs == false)
217     {
218     $result_set["return"]["code"] = -2;
219     $result_set["return"]["message"] = "Query article list error: " . mysqli_error($db_conn);
220    
221     mysqli_close($db_conn);
222     exit(json_encode($result_set));
223     }
224    
225     $visited_aid_list = array();
226    
227     if ($_SESSION["BBS_uid"] > 0)
228     {
229     $aid_list = "-1";
230    
231     while ($row = mysqli_fetch_array($rs))
232     {
233     if ((new DateTimeImmutable("-" . $BBS_new_article_period . " day")) < (new DateTimeImmutable($row["sub_dt"])))
234     {
235     $aid_list .= (", " . $row["AID"]);
236     }
237     else
238     {
239     array_push($visited_aid_list, $row["AID"]);
240     }
241     }
242    
243     mysqli_data_seek($rs, 0);
244    
245     if ($aid_list != "-1")
246     {
247     $sql = "SELECT AID FROM view_article_log WHERE AID IN ($aid_list) AND UID = " . $_SESSION["BBS_uid"];
248    
249     $rs_view = mysqli_query($db_conn, $sql);
250     if ($rs_view == false)
251     {
252     $result_set["return"]["code"] = -2;
253     $result_set["return"]["message"] = "Query view_article_log error: " . mysqli_error($db_conn);
254    
255     mysqli_close($db_conn);
256     exit(json_encode($result_set));
257     }
258    
259     while ($row_view = mysqli_fetch_array($rs_view))
260     {
261     array_push($visited_aid_list, $row_view["AID"]);
262     }
263    
264     mysqli_free_result($rs_view);
265     }
266     }
267    
268     $author_list = array();
269    
270     while ($row = mysqli_fetch_array($rs))
271     {
272     array_push($result_set["data"]["articles"], array(
273     "aid" => $row["AID"],
274     "tid" => $row["TID"],
275     "title" => $row["title"],
276     "sub_dt" => (new DateTimeImmutable($row["sub_dt"]))->setTimezone($_SESSION["BBS_user_tz"]),
277     "length" => $row["length"],
278     "icon" => $row["icon"],
279     "uid" => $row["UID"],
280     "username" => $row["username"],
281     "nickname" => $row["nickname"],
282     "reply_count" => $row["reply_count"],
283     "view_count" => $row["view_count"],
284     "transship" => $row["transship"],
285     "lock" => $row["lock"],
286     "ontop" => $row["ontop"],
287     "excerption" => $row["excerption"],
288     "gen_ex" => $row["gen_ex"],
289     "last_reply_dt" => (new DateTimeImmutable($row["last_reply_dt"]))->setTimezone($_SESSION["BBS_user_tz"]),
290     "last_reply_uid" => $row["last_reply_UID"],
291     "last_reply_username" => $row["last_reply_username"],
292     "last_reply_nickname" => $row["last_reply_nickname"],
293     "class_name" => $row["cname"],
294     "class_title" => $row["c_title"],
295     "section_name" => $row["sname"],
296     "section_title" => $row["s_title"],
297     "visited" => (($_SESSION["BBS_uid"] > 0 && ($row["UID"] == $_SESSION["BBS_uid"] || in_array($row["AID"], $visited_aid_list))) ? 1 : 0),
298     ));
299    
300     if (!isset($author_list[$row["UID"]]))
301     {
302     $author_list[$row["UID"]] = true;
303     }
304     if (!isset($author_list[$row["last_reply_UID"]]))
305     {
306     $author_list[$row["last_reply_UID"]] = true;
307     }
308     }
309     mysqli_free_result($rs);
310    
311     $uid_list = "-1";
312     foreach ($author_list as $uid => $status)
313     {
314     $uid_list .= (", " . $uid);
315     }
316     unset($author_list);
317    
318     $author_list = array();
319    
320     $sql = "SELECT UID FROM user_list WHERE UID IN ($uid_list) AND enable";
321    
322     $rs = mysqli_query($db_conn, $sql);
323     if ($rs == false)
324     {
325     $result_set["return"]["code"] = -2;
326     $result_set["return"]["message"] = "Query user list error: " . mysqli_error($db_conn);
327    
328     mysqli_close($db_conn);
329     exit(json_encode($result_set));
330     }
331    
332     while ($row = mysqli_fetch_array($rs))
333     {
334     $author_list[$row["UID"]] = true;
335     }
336     mysqli_free_result($rs);
337    
338     $result_set["data"]["author_list"] = $author_list;
339     unset($author_list);
340    
341     mysqli_close($db_conn);
342    
343     // Cleanup
344     unset($uid);
345     unset($sid);
346     unset($ex);
347     unset($reply);
348     unset($use_nick);
349     unset($original);
350     unset($username);
351     unset($nickname);
352     unset($title);
353     unset($content);
354     unset($begin_dt);
355     unset($end_dt);
356     unset($search_topic);
357     unset($toa);
358     unset($page);
359     unset($rpp);
360     unset($page_total);
361    
362     // Output with theme view
363     $theme_view_file = get_theme_file("view/search_article", $_SESSION["BBS_theme_name"]);
364     if ($theme_view_file == null)
365     {
366     exit(json_encode($result_set)); // Output data in Json
367     }
368     include $theme_view_file;

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1