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

Contents of /fenglin/bbs/search_article_v2.php

Parent Directory Parent Directory | Revision Log Revision Log


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

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