Completed
Push — development ( 86ad30...7b6aa4 )
by Sebastian
05:00
created

include/classes/base.class.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
$defflip = (!cfip()) ? exit(header('HTTP/1.1 401 Unauthorized')) : 1;
3
4
/**
5
 * Our base class that we extend our other classes from
6
 *
7
 * It supplies some basic features as cross-linking with other classes
8
 * after loading a newly created class.
9
 **/
10
class Base {
11
  private $sError = '';
12
  private $sCronError = '';
13
  protected $table = '';
14
  private $values = array(), $types = ''; 
15
16
  public function getTableName() {
17
    return $this->table;
18
  }
19
  
20
  protected $debug;
21
  public function setDebug($debug) {
22
    $this->debug = $debug;
23
  }
24
  public function setCoin($coin) {
25
    $this->coin = $coin;
26
  }
27
  public function setCoinAddress($coin_address) {
28
    $this->coin_address = $coin_address;
29
  }
30
  
31
  public $log;
32
  public function setLog($log) {
33
    $this->log = $log;
34
  }
35
  
36
  protected $mysqli;
37
  public function setMysql($mysqli) {
38
    $this->mysqli = $mysqli;
39
  }
40
  public function setMail($mail) {
41
    $this->mail = $mail;
42
  }
43
  public function setSalt($salt) {
44
    $this->salt = $salt;
45
  }
46
  public function setSalty($salt) {
47
    $this->salty = $salt;
48
  }
49
  /**
50
   * @var Smarty
51
   */
52
  var $smarty;
53
  public function setSmarty($smarty) {
54
    $this->smarty = $smarty;
55
  }
56
  public function setUser($user) {
57
    $this->user = $user;
58
  }
59
  public function setSessionManager($session) {
60
    $this->session = $session;
61
  }
62
  public function setConfig($config) {
63
    $this->config = $config;
64
  }
65
  
66
  protected $aErrorCodes;
67
  public function setErrorCodes(&$aErrorCodes) {
68
    $this->aErrorCodes =& $aErrorCodes;
69
  }
70
  public function setToken($token) {
71
    $this->token = $token;
72
  }
73
  public function setBlock($block) {
74
    $this->block = $block;
75
  }
76
  public function setPayout($payout) {
77
    $this->payout = $payout;
78
  }
79
  public function setNotification($notification) {
80
    $this->notification = $notification;
81
  }
82
  public function setTransaction($transaction) {
83
    $this->transaction = $transaction;
84
  }
85
  public function setMemcache($memcache) {
86
    $this->memcache = $memcache;
87
  }
88
  public function setStatistics($statistics) {
89
    $this->statistics = $statistics;
90
  }
91
  public function setSetting($setting) {
92
    $this->setting = $setting;
93
  }
94
  public function setTools($tools) {
95
    $this->tools = $tools;
96
  }
97
  public function setBitcoin($bitcoin) {
98
    $this->bitcoin = $bitcoin;
99
  }
100
  public function setTokenType($tokentype) {
101
    $this->tokentype = $tokentype;
102
  }
103
  public function setCSRFToken($token) {
104
    $this->CSRFToken = $token;
105
  }
106
  public function setShare($share) {
107
    $this->share = $share;
108
  }
109
  public function setErrorMessage($msg) {
110
    $this->sError = $msg;
111
    // Default to same error for crons
112
    $this->sCronError = $msg;
113
  }
114
  public function setCronMessage($msg) {
115
    // Used to overwrite any errors with a custom cron one
116
    $this->sCronError = $msg;
117
  }
118
  public function getError() {
119
    return $this->sError;
120
  }
121
  /**
122
   * Additional information in error string for cronjobs logging
123
   **/
124
  public function getCronError() {
125
    return $this->sCronError;
126
  }
127
128
  /**
129
   * Get error message from error code array
130
   * @param errCode string Error code string
131
   * @param optional string Optional addtitional error strings to append
132
   * @retrun string Error Message
133
   **/
134
  public function getErrorMsg($errCode='') {
135
    if (!is_array($this->aErrorCodes)) return 'Error codes not loaded';
136
    if (!array_key_exists($errCode, $this->aErrorCodes)) return 'Unknown Error Code: ' . $errCode;
137
    if (func_num_args() > 1) {
138
      $args = func_get_args();
139
      array_shift($args);
140
      $param_count = substr_count($this->aErrorCodes[$errCode], '%s');
141
      if ($param_count == count($args)) {
142
        return vsprintf($this->aErrorCodes[$errCode], $args);
143
      } else {
144
        return $this->aErrorCodes[$errCode] . ' (missing information to complete string)';
145
      }
146
    } else {
147
      return $this->aErrorCodes[$errCode];
148
    }
149
  }
150
151
  /**
152
   * Fetch count of all entries in table
153
   * @param none
154
   * @param data mixed Count or false
155
   **/
156
  public function getCount() {
157
    $this->debug->append("STA " . __METHOD__, 4);
158
    $stmt = $this->mysqli->prepare("SELECT COUNT(id) AS count FROM $this->table");
159
    if ($this->checkStmt($stmt) && $stmt->execute() && $result = $stmt->get_result())
160
      return $result->fetch_object()->count;
161
    return $this->sqlError();
162
  }
163
164
  /**
165
   * Fetch count of all entries in table filtered by a column/value
166
   * @param none
167
   * @param data mixed Count or false
168
   **/
169
  public function getCountFiltered($column='id', $value=NULL, $type='i', $operator = '=') {
170
    $this->debug->append("STA " . __METHOD__, 4);
171
    $stmt = $this->mysqli->prepare("SELECT COUNT(id) AS count FROM $this->table WHERE $column $operator ?");
172
    if ($this->checkStmt($stmt) && $stmt->bind_param($type, $value) && $stmt->execute() && $result = $stmt->get_result())
173
      return $result->fetch_object()->count;
174
    return $this->sqlError();
175
  }
176
177
  /**
178
   * Fetch all entries as an assoc array from a table
179
   * This should, in general, not be used but sometimes it's just easier
180
   * @param none
181
   * @return array Assoc array of all rows found in table
182
   **/
183 View Code Duplication
  public function getAllAssoc() {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
184
    $this->debug->append("STA " . __METHOD__, 4);
185
    $stmt = $this->mysqli->prepare("SELECT * FROM $this->table");
186
    if ($this->checkStmt($stmt) && $stmt->execute() && $result = $stmt->get_result())
187
      return $result->fetch_all(MYSQLI_ASSOC);
188
    return $this->sqlError();
189
  }
190
191
  /**
192
   * Get a single row as an assoc array
193
   * @param value string Value to search for
194
   * @param field string Column to search for
195
   * @param type string Type of value
196
   * @return array Resulting row
197
   **/
198
  protected function getSingleAssoc($value, $field='id', $type='i') {
199
    $this->debug->append("STA " . __METHOD__, 4);
200
    $stmt = $this->mysqli->prepare("SELECT * FROM $this->table WHERE $field = ? LIMIT 1");
201
    if ($this->checkStmt($stmt) && $stmt->bind_param($type, $value) && $stmt->execute() && $result = $stmt->get_result())
202
      return $result->fetch_assoc();
203
    return false;
204
  }
205
206
  /**
207
   * Get a single value from a row matching the query specified
208
   * @param value string Value to search for
209
   * @param search Return column to search for
210
   * @param field string Search column
211
   * @param type string Type of value
212
   * @param lower bool try with LOWER comparision
213
   * @return array Return result
214
   **/
215
  protected function getSingle($value, $search='id', $field='id', $type="i", $lower=false) {
216
    $this->debug->append("STA " . __METHOD__, 4); 
217
    $sql = "SELECT $search FROM $this->table WHERE";
218
    $lower ? $sql .= " LOWER($field) = LOWER(?)" : $sql .= " $field = ?";
219
    $sql .= " LIMIT 1";
220
    $stmt = $this->mysqli->prepare($sql);
221
    if ($this->checkStmt($stmt)) {
222
      $stmt->bind_param($type, $value);
223
      $stmt->execute();
224
      $stmt->bind_result($retval);
225
      $stmt->fetch();
226
      $stmt->close();
227
      return $retval;
228
    }
229
    return false;
230
  }
231
232
  /**
233
   * Check if the prepared statement is valid
234
   * @param $bState Statement return value
235
   * @return bool true or false
236
   **/
237
  function checkStmt($bState) {
238
    $this->debug->append("STA " . __METHOD__, 4);
239
    if ($bState ===! true)
240
      return $this->sqlError();
241
    return true;
242
  }
243
244
  /**
245
   * Catch SQL errors with this method
246
   * @param error_code string Error code to read
247
   **/
248
  protected function sqlError($error_code='E0020') {
249
    // More human-readable error for UI
250
    if (func_num_args() == 0) {
251
      $this->setErrorMessage($this->getErrorMsg($error_code));
252
    } else {
253
      $this->setErrorMessage(call_user_func_array(array($this, 'getErrorMsg'), func_get_args()));
254
    }
255
    // Default to SQL error for debug and cron errors
256
    $this->debug->append($this->getErrorMsg('E0019', $this->mysqli->error));
257
    $this->setCronMessage($this->getErrorMsg('E0019', $this->mysqli->error));
258
    return false;
259
  }
260
261
  /**
262
   * @param userID int Account ID
263
   * Update a single row in a table
264
   * @param field string Field to update
265
   * @return bool
266
   **/
267
  protected function updateSingle($id, $field, $table='') {
268
    if (empty($table)) $table = $this->table;
269
    $this->debug->append("STA " . __METHOD__, 4);
270
    $stmt = $this->mysqli->prepare("UPDATE $table SET " . $field['name'] . " = ? WHERE id = ? LIMIT 1");
271
    if ($this->checkStmt($stmt) && $stmt->bind_param($field['type'].'i', $field['value'], $id) && $stmt->execute())
272
      return true;
273
    $this->debug->append("Unable to update " . $field['name'] . " with " . $field['value'] . " for ID $id");
274
    return $this->sqlError();
275
  }
276
277
  /**
278
   * We may need to generate our bind_param list
279
   **/
280
  public function addParam($type, &$value) {
281
    $this->values[] = $value;
282
    $this->types .= $type;
283
  }
284
  public function getParam() {
285
    $array = array_merge(array($this->types), $this->values);
286
    // Clear the data
287
    $this->values = NULL;
288
    $this->types = NULL;
289
    // See here why we need this: http://stackoverflow.com/questions/16120822/mysqli-bind-param-expected-to-be-a-reference-value-given
290
    if (strnatcmp(phpversion(),'5.3') >= 0) {
291
      $refs = array();
292
      foreach($array as $key => $value)
293
        $refs[$key] = &$array[$key];
294
      return $refs;
295
    }
296
    return $array;
297
  }
298
}
299