Comments_System::install()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 26
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 2
nop 0
dl 0
loc 26
rs 10
c 0
b 0
f 0
1
<?php
2
3
4
/**
5
 * This will generate a comments system for you in no time...
6
 * It includes an installed build in so all you have to do is upload the class file run a few commands
7
 * 		and you are ready to go :)
8
 * The intention is to make this a stand alone class so we are using ``mysqli`` to handle the mysql interactions
9
 * 	therefor you will need to pass your mysql details also
10
 * @author  Mihai Ionut Vilcu ([email protected])
11
 * July-2013
12
 */
13
class Comments_System
14
{
15
  /**
16
   * Default settings
17
   * @var array
18
   */
19
  var $settings = array(
20
    'comments_table' => '_comments', // the name of the table in which the comments will be hold
21
    'banned_table' => '_banned', // the name of the table in which the comments will be hold
22
    'auto_install' => true, // if the class is not already installed it will attempt to install it
23
    'public' => true, // if true unregistered users are allowed to post a comment
24
    'optional_email' => false, // if true users don't need to enter a valid email
25
    'isAdmin' => false, // if true some extra options are displyed delete
26
    'adminStyle' => array( // special formating to admin messages
27
      'username' => 'color: #0000ff; font-weidth: bold;',
28
      'box' => 'background-color: #FFFCDD'
29
    ),
30
    'user_details' => array( // if public is false we use this user details to the added message
31
      'name' => 'user',
32
      'email' => '[email protected]',
33
    ),
34
    'sort' => 'ORDER BY `id` DESC', // the sort, this is pasted as is so make sure it is parsed
35
  );
36
  var $link; // it will hold the mysql connection
37
  var $error = false; // it will hold an error message if any
38
  var $success = false; // it will hold an success message if any
39
  var $tmp = false; // it will carry some temporary data
40
  var    $ignore = array('comm_edit', 'comm_del', 'comm_reply', 'comm_ban', 'comm_unban'); // keep the url clean
41
  var $checked_ips = array(); // will hold the ips checked if banned or not
42
43
  /**
44
   * setup the mysql connction and some settings
45
   * @param array $db_details contains the database details
46
   * @param array  $settings   settings to overwrite the default ones
47
   */
48
  function __construct($db_details, $settings = array())
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
49
  {
50
    if (session_id() == '')
51
      session_start();
52
53
    // we first manage the mysql connection
54
    $this->link = @mysqli_connect($db_details['db_host'], $db_details['db_user'], $db_details['db_pass']);
0 ignored issues
show
Bug introduced by
The call to mysqli_connect() has too few arguments starting with database. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

54
    $this->link = @/** @scrutinizer ignore-call */ mysqli_connect($db_details['db_host'], $db_details['db_user'], $db_details['db_pass']);

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
55
56
    if (!$this->link) die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
57
58
    mysqli_select_db($this->link, $db_details['db_name']) or die(mysqli_error($this->link));
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
59
60
    // we add the new settings if any
61
    $this->settings = array_merge($this->settings, $settings);
62
63
    $this->settings['comments_table'] = str_replace("`", "``", $this->settings['comments_table']);
64
65
    // auto install
66
    if ($this->settings['auto_install'] && !@mysqli_num_rows(mysqli_query($this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "`")))
0 ignored issues
show
Bug introduced by
It seems like mysqli_query($this->link...comments_table'] . '`') can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

66
    if ($this->settings['auto_install'] && !@mysqli_num_rows(/** @scrutinizer ignore-type */ mysqli_query($this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "`")))
Loading history...
67
      $this->install();
68
69
70
    // edit comment
71
    if (isset($_POST['comm_edit']) && ($comm = mysqli_query($this->link, "SELECT * FROM `" . $this->settings['comments_table'] . "` 
72
				WHERE `id`='" . (int) $_POST['comm_edit'] . "'"))) {
73
      // if the comment exists and the user has the rights to edit it
74
      if (mysqli_num_rows($comm) && $this->hasRights(mysqli_fetch_object($comm))) {
0 ignored issues
show
Bug introduced by
It seems like $comm can also be of type true; however, parameter $result of mysqli_fetch_object() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

74
      if (mysqli_num_rows($comm) && $this->hasRights(mysqli_fetch_object(/** @scrutinizer ignore-type */ $comm))) {
Loading history...
75
        $this->grabComment($_SESSION['comm_pageid'], (int) $_POST['comm_edit']);
76
        $this->tmp = "edited";
77
      }
78
    }
79
80
81
    // delete comment
82
    if (isset($_POST['comm_del']))
83
      if ($this->delComm($_POST['comm_del']))
84
        $this->success = "Comment deleted !";
85
86
    // bann ip
87
    if (isset($_GET['comm_ban']) && $this->banIP($_GET['comm_ban'])) // we banned the ip
88
      $this->success = "IP banned !";
89
90
    // UnBann ip
91
    if (isset($_GET['comm_unban']) && $this->unBanIP($_GET['comm_unban']))
92
      $this->success = "IP UnBanned !";
93
94
    return true;
95
  }
96
97
98
99
  function grabComment($pageid, $update_id = false)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
100
  {
101
    if (session_id() == '')
102
      session_start();
103
104
    $_SESSION['comm_pageid'] = $pageid;
105
106
    // we make sure it's a valid post
107
    if (
108
      isset($_POST['comm_submit']) && isset($_SESSION['comm_token']) && ($_POST['comm_token'] === $_SESSION['comm_token']) &&
109
      ($this->tmp != 'edited')
110
    ) { // we make sure we don't handle the data again if it was an edit
111
112
      $name = isset($_POST['comm_name']) ? $_POST['comm_name'] : '';
113
      $email = isset($_POST['comm_email']) ? $_POST['comm_email'] : '';
114
115
      $min = 2;
116
117
      if (!$this->settings['public']) { // if it's not public we use the provided details
118
        // if it's not public and it has $_POST[name] something is wrong
119
        if (isset($_POST['comm_name'])) {
120
          $this->error = "Something is wrong !";
121
          return false;
122
        }
123
124
        $min = 0;
125
        $name = $this->settings['user_details']['name'];
126
        $email = $this->settings['user_details']['email'];
127
      }
128
129
      if ($this->isBanned($this->ip())) {
130
        $this->error = "You are banned !";
131
        return false;
132
      }
133
134
      if (!isset($name[$min])) {
135
        $this->error = "Invalid name !";
136
        return false;
137
      }
138
      $message = $_POST['comm_msg'];
139
140
      if (!isset($message[2])) {
141
        $this->error = "Invalid message !";
142
        return false;
143
      }
144
145
146
      // we check in case the email is not valid
147
      if (!$this->settings['optional_email'])
148
        if (!$this->isValidMail($email)) {
149
          $this->error = "Invalid email !";
150
          return false;
151
        }
152
153
154
      // we check if it's an update or a new message 
155
      if ($update_id) {
156
        if ($this->settings['public'])
157
          $upd_fields = ",`name` = '" . mysqli_real_escape_string($this->link, $name) . "',
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

157
          $upd_fields = ",`name` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $name) . "',
Loading history...
158
									`email` = '" . mysqli_real_escape_string($this->link, $email) . "'";
159
        else
160
          $upd_fields = '';
161
162
163
        if (mysqli_query($this->link, "UPDATE `" . $this->settings['comments_table'] . "` SET 
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

163
        if (mysqli_query(/** @scrutinizer ignore-type */ $this->link, "UPDATE `" . $this->settings['comments_table'] . "` SET 
Loading history...
164
					`message` = '" . mysqli_real_escape_string($this->link, $message) . "'
165
					$upd_fields
166
					WHERE `id` = '" . (int) $update_id . "'")) {
167
168
          $this->success = "Comment edited successfully !";
169
          return true;
170
        }
171
      }
172
173
174
      // we check if this is a valid reply
175
      if (
176
        isset($_POST['comm_reply']) &&
177
        mysqli_num_rows(mysqli_query($this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "` 
0 ignored issues
show
Bug introduced by
It seems like mysqli_query($this->link...' AND `parent` = '0'') can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

177
        mysqli_num_rows(/** @scrutinizer ignore-type */ mysqli_query($this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "` 
Loading history...
178
					WHERE `id`= '" . (int) $_POST['comm_reply'] . "' AND `parent`  = '0'"))
179
      )
180
        $reply = ",`parent` = '" . (int) $_POST['comm_reply'] . "'";
181
      else
182
        $reply = '';
183
184
185
186
      if (mysqli_query($this->link, "INSERT INTO `" . $this->settings['comments_table'] . "` SET 
187
				`name` = '" . mysqli_real_escape_string($this->link, $name) . "',
188
				`message` = '" . mysqli_real_escape_string($this->link, $message) . "',
189
				`time` = '" . time() . "',
190
				`ip` = '" . mysqli_real_escape_string($this->link, $this->ip()) . "',
191
				`email` = '" . mysqli_real_escape_string($this->link, $email) . "',
192
				`browser` = '" . mysqli_real_escape_string($this->link, $_SERVER['HTTP_USER_AGENT']) . "',
193
				`pageid` = '" . mysqli_real_escape_string($this->link, $pageid) . "',
194
				`isadmin` = '" . (int) $this->settings['isAdmin'] . "'
195
				$reply
196
				")) {
197
        $_SESSION['comm_last_id'] = mysqli_insert_id($this->link);
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_insert_id() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

197
        $_SESSION['comm_last_id'] = mysqli_insert_id(/** @scrutinizer ignore-type */ $this->link);
Loading history...
198
        $this->success = "Comment posted successfully !";
199
        return true;
200
      } else {
201
        $this->error = "Some error camed up !";
202
        return false;
203
      }
204
    } else if (isset($_POST['comm_submit']) && isset($_SESSION['comm_token']) && ($this->tmp != 'edited')) {
205
      unset($_SESSION['comm_token']);
206
      $this->error = "Invalid request !";
207
    }
208
  }
209
210
  /**
211
   * Lists the comments for the inserted page id
212
   * @param  integer $pageid  
213
   * @param  integer $perpage 
214
   * @return string           the generated html code
215
   */
216
  function generateComments($pageid = 0, $perpage = 10)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
217
  {
218
219
    if (session_id() == '')
220
      session_start();
221
222
    $_SESSION['comm_pageid'] = $pageid;
223
224
    $html = "";
225
226
227
    $comments = $this->getComments($pageid, $perpage);
228
229
230
    // we generate the output of the comments
231
    if ($comments) {
232
      foreach ($comments as $comment) {
233
        if (!($name = $this->getUsername($comment->name)))
234
          $name = $comment->name;
235
236
        // show reply link or form
237
        if (isset($_GET['comm_reply']) && ($comment->id == $_GET['comm_reply'])) {
238
          $show_reply = $this->generateForm("?" . $this->queryString('', $this->ignore), 1);
239
        } else {
240
          $show_reply = "<a href='?" . $this->queryString('', $this->ignore) . "&comm_reply=$comment->id#$comment->id'>Reply</a>";
241
        }
242
        // show normal username or with adminStyles
243
        $style = "";
244
        if ($comment->isadmin) {
245
          $show_name = "<span style='" . $this->settings['adminStyle']['username'] . "'>" . $this->html($name) . "</span>";
246
          $style = $this->settings['adminStyle']['box'];
247
        } else {
248
          $show_name = $this->html($name);
249
        }
250
        // show extra info only to admin
251
        $show_extra = "";
252
        if ($this->settings['isAdmin']) {
253
          $browser = explode(" ", $comment->browser);
254
          $show_extra = "($comment->email | " . $browser[0] . " | $comment->ip)";
255
        }
256
        $is_del = (isset($_GET['comm_del']) && ($_GET['comm_del'] === $comment->id) && $this->hasRights($comment))
257
          ? " background-color: #FFDE89; border: 1px solid red;" : null;
258
259
        $html .= "
260
			<div class='card' id='$comment->id' style='" . $style . $is_del . "'>
261
				<div class='card-body'>";
262
263
        if (isset($_GET['comm_edit']) && ($_GET['comm_edit'] === $comment->id) && $this->hasRights($comment)) {
264
          // we generate the form in edit mode with precompleted data
265
          $html .= $this->generateForm('', 2, $comment);
266
        } else {
267
          $html .= "<a class='float-left mr-2' rel='nofollow, noopener' href='http://gravatar.com'>
268
          <img class='img-thumbnail' src='http://gravatar.com/avatar/" . md5($comment->email) . "'>
269
          </a>";
270
          $html .= "<h5 class='card-title'>
271
						$show_name $show_extra
272
						<small class='text-muted'>" . $this->tsince($comment->time) . "</small>
273
						" . $this->admin_options($comment) . "
274
					</h5>
275
					<p>" . nl2br($this->html($comment->message)) . "</p>";
276
        }
277
        if ($is_del) {
278
          $html .= $this->gennerateConfirm('', 'comm_del', $comment->id);
279
        } else {
280
          $html .= $show_reply;
281
        }
282
        $html .= $this->generateReplies($comment->id) . "
283
				</div>
284
			</div>";
285
      }
286
    }
287
    $html .= $this->generatePages($pageid, $perpage);
288
289
    return $html;
290
  }
291
292
293
  function generateReplies($comm_id, $limit = 3)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
294
  {
295
    $html = "";
296
    $comments = $this->getReplies($comm_id, $limit);
297
    // we generate the output of the comments
298
    if ($comments)
299
      foreach ($comments as $comment) {
300
        if (!($name = $this->getUsername($comment->name)))
301
          $name = $comment->name;
302
303
        // show normal username or with adminStyles
304
        $style = "";
305
        if ($comment->isadmin) {
306
          $show_name = "<span style='" . $this->settings['adminStyle']['username'] . "'>" . $this->html($name) . "</span>";
307
          $style = $this->settings['adminStyle']['box'];
308
        } else
309
          $show_name = $this->html($name);
310
311
        // show extra info only to admin
312
        $show_extra = "";
313
        if ($this->settings['isAdmin']) {
314
          $browser = explode(" ", $comment->browser);
315
          $show_extra = "($comment->email | " . $browser[0] . " | $comment->ip)";
316
        }
317
        $is_del = (isset($_GET['comm_del']) && ($_GET['comm_del'] === $comment->id) && $this->hasRights($comment))
318
          ? " background-color: #FFDE89; border: 1px solid red;" : null;
319
320
        $html .= "
321
			<div class='media' id='$comment->id' style='" . $style . $is_del . "'>
322
				<a class='pull-left' href='http://gravatar.com'>
323
				<img class='media-object' src='http://gravatar.com/avatar/" . md5($comment->email) . "'>
324
				</a>	
325
				<div class='media-body'>";
326
327
328
        if (isset($_GET['comm_edit']) && ($_GET['comm_edit'] === $comment->id) && $this->hasRights($comment))
329
          // we generate the form in edit mode with precompleted data
330
          $html .= $this->generateForm('', 2, $comment);
331
        else
332
          $html .= "<h4 class='media-heading'>
333
						$show_name $show_extra
334
						<small class='muted'>" . $this->tsince($comment->time) . " replied </small>
335
						" . $this->admin_options($comment) . "
336
					</h4>
337
					<p>" . nl2br($this->html($comment->message)) . "</p>";
338
339
        if ($is_del)
340
          $html .= $this->gennerateConfirm('', 'comm_del', $comment->id);
341
342
        $html .= "</div></div>";
343
      }
344
345
    return $html;
346
  }
347
348
  function generateForm($location =  '', $type = 0, $comment = false)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
349
  {
350
    $this->setToken();
351
    if ($location == '')
352
      $location = "?" . $this->queryString('', $this->ignore);
353
354
355
    if (!$comment)
356
      $comment = (object) array("name" => "", "email" => "", "message" => "");
357
358
    if ($type == 1)
359
      $title = "<input type='hidden' name='comm_reply' value='" . (int) $_GET['comm_reply'] . "'>Post a reply";
360
    else if ($type == 2)
361
      $title = "<input type='hidden' name='comm_edit' value='" . (int) $_GET['comm_edit'] . "'>Edit comment";
362
    else
363
      $title = "Post a comment";
364
365
    $show_name_email = '';
366
367
    if ($this->settings['public']) {
368
      $show_name_email = "<div class='control-group'>
369
			  <label class='control-label' for='comm_name'>Name</label>
370
			  <div class='controls'>
371
				<input id='comm_name' name='comm_name' type='text' class='input-xlarge' value='$comment->name'>
372
				
373
			  </div>
374
			</div>
375
376
			<div class='control-group'>
377
			  <label class='control-label' for='comm_email'>Email</label>
378
			  <div class='controls'>
379
				<input id='comm_email' name='comm_email' type='text' class='input-xlarge' value='$comment->email'>
380
			  	<p>
381
			  	" . ($this->settings['optional_email'] ? "(optional, it will not be public.)" : "") . "
382
			  	</p>
383
			  </div>
384
			</div>";
385
    }
386
387
388
    $html = "
389
	<form class='form-horizontal' action='$location#comm_status' method='post'>
390
		<fieldset>
391
		<legend>$title</legend>
392
393
		$show_name_email
394
395
		<div class='md-form mb-2'>
396
		  <label class='control-label' for='comm_msg'>Message</label>
397
		  <div class='controls'>					 
398
			<textarea class='form-control' id='comm_msg' name='comm_msg'>$comment->message</textarea>
399
		  </div>
400
		</div>
401
402
		<input type='hidden' name='comm_token' value='" . $_SESSION['comm_token'] . "'>
403
404
		<div class='md-form mb-2'>
405
		  <div class='controls'>
406
			<input type='submit' id='comm_submit' name='comm_submit' class='btn btn-primary' value='Post'>
407
			" . ($type ? "<input type='submit' id='comm_cancel' value='Cancel' class='btn'>" : "") . "
408
		  </div>
409
		</div>
410
411
		</fieldset>
412
	</form>";
413
414
    return $html;
415
  }
416
417
  /**
418
   * it will create the table to hold the comments
419
   * @return boolean true if the install succeeds
420
   */
421
  function install()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
422
  {
423
424
    $sql = "CREATE TABLE IF NOT EXISTS `" . $this->settings['comments_table'] . "` (
425
		  `id` int(11) NOT NULL AUTO_INCREMENT,
426
		  `name` varchar(255) NOT NULL,
427
		  `message` text NOT NULL,
428
		  `time` int(11) NOT NULL,
429
		  `ip` varchar(255) NOT NULL,
430
		  `email` varchar(255) NOT NULL,
431
		  `browser` varchar(255) NOT NULL,
432
		  `pageid` int(11) NOT NULL,
433
		  `parent` int(11) NOT NULL,
434
		  `isadmin` int(11) NOT NULL,
435
		  PRIMARY KEY (`id`)
436
		);";
437
438
    $sql2 = "CREATE TABLE IF NOT EXISTS `_banned` (
439
		  `ip` varchar(255) NOT NULL,
440
		  UNIQUE KEY `ip` (`ip`)
441
		);";
442
443
    if (mysqli_query($this->link, $sql) && mysqli_query($this->link, $sql2))
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

443
    if (mysqli_query(/** @scrutinizer ignore-type */ $this->link, $sql) && mysqli_query($this->link, $sql2))
Loading history...
444
      return true;
445
446
    return false;
447
  }
448
  /**
449
   * gets the comments from the db
450
   * @param  integer $pageid the id for the specific page
451
   * @param  integer $perpage number of comments perpage
452
   * @return array		  the comments
453
   */
454
  function getComments($pageid = 0, $perpage = 10)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
455
  {
456
    $comments = array();
457
458
    $sql = "SELECT * FROM `" . $this->settings['comments_table'] . "` WHERE `parent` = 0 ";
459
460
    if ($pageid)
461
      $sql .= "AND `pageid` = '" . mysqli_real_escape_string($this->link, $pageid) . "'";
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

461
      $sql .= "AND `pageid` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $pageid) . "'";
Loading history...
462
463
    // some sorting options
464
    $sql .= " " . $this->settings['sort'] . " "; // this is pasted as is
465
466
467
    // grab the page number
468
    $page_number = !isset($_GET['comm_page']) || ((int) $_GET['comm_page'] <= 0) ? 1 : (int) $_GET['comm_page'];
469
470
    $total_results = mysqli_num_rows(mysqli_query($this->link, $sql));
0 ignored issues
show
Bug introduced by
It seems like mysqli_query($this->link, $sql) can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

470
    $total_results = mysqli_num_rows(/** @scrutinizer ignore-type */ mysqli_query($this->link, $sql));
Loading history...
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

470
    $total_results = mysqli_num_rows(mysqli_query(/** @scrutinizer ignore-type */ $this->link, $sql));
Loading history...
471
472
    if ($page_number > ceil($total_results / $perpage))
473
      $page_number = ceil($total_results / $perpage);
474
475
    $start = ($page_number - 1) * $perpage;
476
477
    $sql .= "LIMIT $start, $perpage";
478
479
    if ($result = mysqli_query($this->link, $sql))
480
      while ($row = mysqli_fetch_object($result))
0 ignored issues
show
Bug introduced by
It seems like $result can also be of type true; however, parameter $result of mysqli_fetch_object() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

480
      while ($row = mysqli_fetch_object(/** @scrutinizer ignore-type */ $result))
Loading history...
481
        $comments[] = $row;
482
    else
483
      return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type array.
Loading history...
484
485
    return $comments;
486
  }
487
  /**
488
   * gets the replies to a certain comment
489
   * @param  integer $comm_id the id for the specific comment
490
   * @param  integer $limit max number of comments to be displayed as reply
491
   * @return array		  the comments
492
   */
493
  function getReplies($comm_id = 0, $limit = 3)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
494
  {
495
    $comments = array();
496
497
    $sql = "SELECT * FROM `" . $this->settings['comments_table'] . "` 
498
			WHERE `parent` = '" . mysqli_real_escape_string($this->link, $comm_id) . "'";
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

498
			WHERE `parent` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $comm_id) . "'";
Loading history...
499
500
    // limitation
501
    $sql .= "LIMIT 0, $limit";
502
503
    if ($result = mysqli_query($this->link, $sql))
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

503
    if ($result = mysqli_query(/** @scrutinizer ignore-type */ $this->link, $sql))
Loading history...
504
      while ($row = mysqli_fetch_object($result))
0 ignored issues
show
Bug introduced by
It seems like $result can also be of type true; however, parameter $result of mysqli_fetch_object() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

504
      while ($row = mysqli_fetch_object(/** @scrutinizer ignore-type */ $result))
Loading history...
505
        $comments[] = $row;
506
    else
507
      return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type array.
Loading history...
508
509
    return $comments;
510
  }
511
512
  /**
513
   * it parses the text for output
514
   * @param  string $text the text to be parsed
515
   * @return string	   paesed text
516
   */
517
  function html($text)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
518
  {
519
    return htmlentities($text, ENT_QUOTES);
520
  }
521
522
  /**
523
   * while developing this class a small problem camed up,
524
   * 	what if i have a user system already and i want to store the userid instread of he's username(in case he changes it) ?
525
   *  for this matter i made this function which by default will return false
526
   *  which means that we will consider that the `name` column is a string not an integer(userid)
527
   *  BUT if you store the userid in the name column you have to make sure that this function
528
   *  will return the username coresponding to that id, i included an example
529
   * 
530
   */
531
  function getUsername($userid)
0 ignored issues
show
Unused Code introduced by
The parameter $userid is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

531
  function getUsername(/** @scrutinizer ignore-unused */ $userid)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
532
  {
533
    return false;
534
    // in case you decide to store the userid use this
535
    // $user = mysqli_fetch_object(mysql_query($this->link, "SELECT * FROM `users` WHERE 'userid' = '".(int)$userid."'"));
536
    // return $user->username;
537
  }
538
539
  /**
540
   * Time elapes since a times
541
   * @param  int $time The past time
542
   * @return string	   time elapssed
543
   * credits: http://stackoverflow.com/a/2916189/1579481
544
   */
545
  function tsince($time, $end_msg = 'ago')
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
546
  {
547
548
    $time = abs(time() - $time); // to get the time since that moment
549
550
    if ($time == 0)
551
      return "Just now";
552
553
    $tokens = array(
554
      31536000 => 'year',
555
      2592000 => 'month',
556
      604800 => 'week',
557
      86400 => 'day',
558
      3600 => 'hour',
559
      60 => 'minute',
560
      1 => 'second'
561
    );
562
563
    foreach ($tokens as $unit => $text) {
564
      if ($time < $unit) continue;
565
      $numberOfUnits = floor($time / $unit);
566
      return $numberOfUnits . ' ' . $text . (($numberOfUnits > 1) ? 's' : '') . ' ' . $end_msg;
567
    }
568
  }
569
570
  function isValidMail($mail)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
571
  {
572
573
    if (!filter_var($mail, FILTER_VALIDATE_EMAIL))
574
      return FALSE;
575
576
577
    list($username, $maildomain) = explode("@", $mail);
578
    if (checkdnsrr($maildomain, "MX"))
579
      return TRUE;
580
581
    return FALSE;
582
  }
583
584
  // Returns the real IP address of the user
585
  function ip()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
586
  {
587
    // No IP found (will be overwritten by for
588
    // if any IP is found behind a firewall)
589
    $ip = FALSE;
590
591
    // If HTTP_CLIENT_IP is set, then give it priority
592
    if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
593
      $ip = $_SERVER["HTTP_CLIENT_IP"];
594
    }
595
596
    // User is behind a proxy and check that we discard RFC1918 IP addresses
597
    // if they are behind a proxy then only figure out which IP belongs to the
598
    // user.  Might not need any more hackin if there is a squid reverse proxy
599
    // infront of apache.
600
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
601
602
      // Put the IP's into an array which we shall work with shortly.
603
      $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
604
      if ($ip) {
605
        array_unshift($ips, $ip);
606
        $ip = FALSE;
607
      }
608
609
      for ($i = 0; $i < count($ips); $i++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
610
        // Skip RFC 1918 IP's 10.0.0.0/8, 172.16.0.0/12 and
611
        // 192.168.0.0/16
612
        if (!preg_match('/^(?:10|172\.(?:1[6-9]|2\d|3[01])|192\.168)\./', $ips[$i])) {
613
          if (version_compare(phpversion(), "5.0.0", ">=")) {
614
            if (ip2long($ips[$i]) != false) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing ip2long($ips[$i]) of type integer to the boolean false. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
615
              $ip = $ips[$i];
616
              break;
617
            }
618
          } else {
619
            if (ip2long($ips[$i]) != -1) {
620
              $ip = $ips[$i];
621
              break;
622
            }
623
          }
624
        }
625
      }
626
    }
627
628
    // Return with the found IP or the remote address
629
    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
630
  }
631
  /**
632
   * sets a random token stored in the session used to validate the form submit
633
   */
634
  function setToken()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
635
  {
636
    if (session_id() == '')
637
      session_start();
638
639
    $_SESSION['comm_token'] = md5(time() . rand());
640
  }
641
  /**
642
   * it will return the query string as hidden fields or as url
643
   * @param  string $type   type of output
644
   * @param  array  $ignore ignored elements
645
   * @return string         
646
   */
647
  function queryString($type = '', $ignore = array())
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
648
  {
649
650
    $result = '';
651
652
    foreach ($_GET as $k => $v) {
653
      if ((is_array($ignore) && in_array($k, $ignore))
654
        || (is_string($ignore) && preg_match($ignore, $k))
655
      )
656
        continue;
657
658
      if ($type == 'hidden') {
659
        $result .= "<input type='hidden' name='" . urlencode($k) . "' value='" . urlencode($v) . "'>";
660
      } else {
661
        $result[] = urlencode($k) . "=" . urlencode($v);
662
      }
663
    }
664
665
    if (is_array($result))
0 ignored issues
show
introduced by
The condition is_array($result) is always false.
Loading history...
666
      return implode("&", $result);
667
668
    return $result;
669
  }
670
671
672
  /**
673
   * generates a confirmation form
674
   * @return string the html code of the form
675
   */
676
  function gennerateConfirm($location = '', $info_name = 'comm_del', $info_value = 0, $submit = "I&#39;m sure, Delete")
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
677
  {
678
679
    if ($location == '')
680
      $location = "?" . $this->queryString('', $this->ignore);
681
682
    return "<form class='form-horizontal' action='$location' method='post'>
683
		<div class='control-group'>
684
		  <div class='controls'>
685
		  " . ($info_name ? "<input type='hidden' name='$info_name' value='$info_value'>" : "") . "
686
			<input type='submit' id='comm_submit' name='comm_confirm' class='btn btn-primary' value='$submit'>
687
			<a href='" . $_SERVER['HTTP_REFERER'] . "' class='btn'>Cancel</a>
688
		  </div>
689
		</div>
690
		</form>";
691
  }
692
  /**
693
   * checks if the current user has the rights to delete/edit a comment
694
   * @param  object $comment data related to one comment
695
   * @return boolean [description]
696
   */
697
  function hasRights($comment)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
698
  {
699
    if (session_id() == '')
700
      session_start();
701
702
    if ($this->settings['isAdmin'] || (isset($_SESSION['comm_last_id']) && $_SESSION['comm_last_id'] == $comment->id))
703
      return true;
704
    return false;
705
  }
706
  /**
707
   * returns the html code of the options available
708
   * @param  object $comment data related to one comment
709
   * @return string          the html code to display the options
710
   */
711
  function admin_options($comment)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
712
  {
713
    // if is admin or the person who posted the message
714
    if ($this->hasRights($comment))
715
      return "<a href='?" . $this->queryString('', $this->ignore) . "&comm_edit=$comment->id#$comment->id'>Edit</a> 
716
				| <a href='?" . $this->queryString('', $this->ignore) . "&comm_del=$comment->id#$comment->id'>Delete</a>" .
717
        ($this->settings['isAdmin'] ? //if is admin 
718
          " | <a href='?" . $this->queryString('', $this->ignore) . "&comm_" .
719
          ($this->isBanned($comment->ip) ? "un" : "") . "ban=" . urlencode($comment->ip) . "'>" .
720
          ($this->isBanned($comment->ip) ? "Un" : "") . "Ban</a>" : "");
721
  }
722
723
724
  /**
725
   * will generate the html code for page numbers
726
   * @param  interger  $total   the total number of elements
0 ignored issues
show
Bug introduced by
The type interger was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
727
   * @param  interger  $page    current page
728
   * @param  integer $perpage number of elements per page
729
   * @return string           the generated html code
730
   */
731
  function generatePages($pageid, $perpage = 10)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
732
  {
733
734
735
    $sql = "SELECT `id` FROM `" . $this->settings['comments_table'] . "` WHERE `parent` = 0 ";
736
737
    if ($pageid)
738
      $sql .=  " AND `pageid`='" . (int) $pageid . "'";
739
740
741
    $total = mysqli_num_rows(mysqli_query($this->link, $sql));
0 ignored issues
show
Bug introduced by
It seems like mysqli_query($this->link, $sql) can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

741
    $total = mysqli_num_rows(/** @scrutinizer ignore-type */ mysqli_query($this->link, $sql));
Loading history...
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

741
    $total = mysqli_num_rows(mysqli_query(/** @scrutinizer ignore-type */ $this->link, $sql));
Loading history...
742
743
    $total_pages = ceil($total / $perpage);
744
745
    $page = !isset($_GET['comm_page']) || ((int) $_GET['comm_page'] <= 0) ? 1 : (int) $_GET['comm_page'];
746
747
    $query = "&" . $this->queryString('', array('comm_page'));
748
749
    $html = "<div class='pagination'><ul>";
750
751
    if ($page > 4)
752
      $html .= "<li><a href='?$query'>First</a></li>";
753
754
    if ($page > 1)
755
      $html .= "<li><a href='?comm_page=" . ($page - 1) . "$query'>Prev</a> </li>";
756
757
    for ($i = max(1, $page - 3); $i <= min($page + 3, $total_pages); $i++)
758
      $html .= ($i == $page ? "<li class='active'><a>" . $i . "</a></li>" : " <li><a href='?comm_page=$i$query'>$i</a></li> ");
759
760
    if ($page < $total_pages)
761
      $html .= "<li><a href='?comm_page=" . ($page + 1) . "$query'>Next</a></li>";
762
763
    if ($page < $total_pages - 3)
764
      $html .= "<li><a href='?comm_page=$total_pages$query'> Last </a></li>";
765
766
    $html .= "</ul></div>";
767
768
    return $html;
769
  }
770
771
  /**
772
   * deletes comment based on the comment id, it also checks for the rights of the user.
773
   * @param  interger $comment_id the id of the comment to be deleted
774
   * @return boolean             true on success
775
   */
776
  function delComm($comment_id)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
777
  {
778
    $comm = mysqli_query($this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "` WHERE `id` = '" . (int) $comment_id . "'");
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

778
    $comm = mysqli_query(/** @scrutinizer ignore-type */ $this->link, "SELECT `id` FROM `" . $this->settings['comments_table'] . "` WHERE `id` = '" . (int) $comment_id . "'");
Loading history...
779
    if (mysqli_num_rows($comm) && $this->hasRights(mysqli_fetch_object($comm))) {
0 ignored issues
show
Bug introduced by
It seems like $comm can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

779
    if (mysqli_num_rows(/** @scrutinizer ignore-type */ $comm) && $this->hasRights(mysqli_fetch_object($comm))) {
Loading history...
Bug introduced by
It seems like $comm can also be of type true; however, parameter $result of mysqli_fetch_object() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

779
    if (mysqli_num_rows($comm) && $this->hasRights(mysqli_fetch_object(/** @scrutinizer ignore-type */ $comm))) {
Loading history...
780
      mysqli_query($this->link, "DELETE FROM `" . $this->settings['comments_table'] . "` 
781
				WHERE `id` = '" . (int) $comment_id . "' OR `parent` = '" . (int) $comment_id . "'");
782
783
      return true;
784
    }
785
786
    return false;
787
  }
788
  /**
789
   * Adds the inserted ip in the banned list
790
   * @param  string $ip the ip to be banned
791
   */
792
  function banIP($ip)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
793
  {
794
    if ($this->settings['isAdmin'])
795
      if (mysqli_query($this->link, "INSERT INTO `" . $this->settings['banned_table'] . "` 
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

795
      if (mysqli_query(/** @scrutinizer ignore-type */ $this->link, "INSERT INTO `" . $this->settings['banned_table'] . "` 
Loading history...
796
				SET `ip` = '" . mysqli_real_escape_string($this->link, $ip) . "'"))
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

796
				SET `ip` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $ip) . "'"))
Loading history...
797
        return true;
798
    return false;
799
  }
800
801
  /**
802
   * Deletes an ip from the banned list.
803
   * @param  string $ip the ip to be unbanned
804
   */
805
  function unBanIP($ip)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
806
  {
807
    if ($this->settings['isAdmin']) {
808
      mysqli_query($this->link, "DELETE FROM `" . $this->settings['banned_table'] . "` 
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

808
      mysqli_query(/** @scrutinizer ignore-type */ $this->link, "DELETE FROM `" . $this->settings['banned_table'] . "` 
Loading history...
809
				WHERE `ip` = '" . mysqli_real_escape_string($this->link, $ip) . "'");
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

809
				WHERE `ip` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $ip) . "'");
Loading history...
810
      return true;
811
    }
812
813
    return false;
814
  }
815
  /**
816
   * checks if an ip is banned
817
   * @param  string $ip ip to be checked
818
   * @return boolean     true if the ip is banned
819
   */
820
  function isBanned($ip)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
821
  {
822
    // no need to check the same ip 2 times in a row
823
    if (count($this->checked_ips) && in_array($ip, array_keys($this->checked_ips)))
824
      return $this->checked_ips[$ip];
825
826
    $this->checked_ips[$ip] = $ip;
827
828
829
    if (mysqli_num_rows(mysqli_query($this->link, "SELECT * FROM `" . $this->settings['banned_table'] . "` 
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_query() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

829
    if (mysqli_num_rows(mysqli_query(/** @scrutinizer ignore-type */ $this->link, "SELECT * FROM `" . $this->settings['banned_table'] . "` 
Loading history...
Bug introduced by
It seems like mysqli_query($this->link...this->link, $ip) . ''') can also be of type true; however, parameter $result of mysqli_num_rows() does only seem to accept mysqli_result, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

829
    if (mysqli_num_rows(/** @scrutinizer ignore-type */ mysqli_query($this->link, "SELECT * FROM `" . $this->settings['banned_table'] . "` 
Loading history...
830
			WHERE `ip` = '" . mysqli_real_escape_string($this->link, $ip) . "'"))) {
0 ignored issues
show
Bug introduced by
It seems like $this->link can also be of type boolean; however, parameter $mysql of mysqli_real_escape_string() does only seem to accept mysqli, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

830
			WHERE `ip` = '" . mysqli_real_escape_string(/** @scrutinizer ignore-type */ $this->link, $ip) . "'"))) {
Loading history...
831
      $this->checked_ips[$ip] = true;
832
      return true;
833
    }
834
    $this->checked_ips[$ip] = false;
835
836
837
    return false;
838
  }
839
}
840