GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

importerAdminController   F
last analyzed

Complexity

Total Complexity 220

Size/Duplication

Total Lines 1259
Duplicated Lines 16.44 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 0
Metric Value
dl 207
loc 1259
rs 0.8
c 0
b 0
f 0
wmc 220
lcom 1
cbo 9

14 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 3 1
B procImporterAdminCheckXmlFile() 28 55 10
C procImporterAdminSync() 42 68 11
F procImporterAdminPreProcessing() 8 104 20
B procImporterAdminImport() 0 56 10
F importMember() 23 179 35
D importMessage() 0 90 15
F importModule() 22 238 54
B importTrackbacks() 0 40 7
F importComments() 41 131 25
F importAttaches() 13 120 18
A getTmpFilename() 8 8 2
A saveTemporaryFile() 22 22 4
B importExtraVars() 0 39 8

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like importerAdminController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use importerAdminController, and based on these observations, apply Extract Interface, too.

1
<?php
2
/* Copyright (C) XEHub <https://www.xehub.io> */
3
@set_time_limit(0);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
4
require_once('./modules/importer/extract.class.php');
5
6
/**
7
 * importerAdminController class
8
 * admin controller class of importer module
9
 *
10
 * @author XEHub ([email protected])
11
 * @package /modules/importer
12
 * @version 0.1
13
 */
14
class importerAdminController extends importer
15
{
16
	/**
17
	 * Unit count
18
	 * @var int
19
	 */
20
	var $unit_count = 300;
21
	/**
22
	 * Xml parser
23
	 * @var XmlParser
24
	 */
25
	var $oXmlParser = null;
26
27
	/**
28
	 * Initialization
29
	 * @return void
30
	 */
31
	function init()
32
	{
33
	}
34
35
	/**
36
	 * Check whether the passing filename exists or not. Detect the file type, too.
37
	 * @return void
38
	 */
39
	function procImporterAdminCheckXmlFile()
40
	{
41
		global $lang;
42
43
		$filename = Context::get('filename');
44
		$isExists = 'false';
45
46
		if(strncasecmp('http://', $filename, 7) === 0)
47
		{
48
			if(ini_get('allow_url_fopen'))
49
			{
50
				$fp = @fopen($filename, "r");
51 View Code Duplication
				if($fp)
52
				{
53
					$str = fgets($fp, 100);
54
					if(strlen($str) > 0)
55
					{
56
						$isExists = 'true';
57
						$type = 'XML';
58
						if(stristr($str, 'tattertools')) $type = 'TTXML';
59
60
						$this->add('type', $type);
61
					}
62
					fclose($fp);
63
					$resultMessage = $lang->found_xml_file;
64
				}
65
				else $resultMessage = $lang->cannot_url_file;
66
			}
67
			else $resultMessage = $lang->cannot_allow_fopen_in_phpini;
68
69
			$this->add('exists', $isExists);
70
		}
71
		else
72
		{
73
			$realPath = FileHandler::getRealPath($filename);
74
75
			if(file_exists($realPath) && is_file($realPath)) $isExists = 'true';
76
			$this->add('exists', $isExists);
77
78 View Code Duplication
			if($isExists == 'true')
79
			{
80
				$type = 'XML';
81
82
				$fp = fopen($realPath, "r");
83
				$str = fgets($fp, 100);
84
				if(stristr($str, 'tattertools')) $type = 'TTXML';
85
				fclose($fp);
86
87
				$this->add('type', $type);
88
				$resultMessage = $lang->found_xml_file;
89
			}
90
			else $resultMessage = $lang->not_found_xml_file;
91
		}
92
		$this->add('result_message', $resultMessage);
93
	}
94
95
	/**
96
	 * Sync member information with document information
97
	 * @return void
98
	 */
99
	function procImporterAdminSync()
100
	{
101
		$oMemberModel = getModel('member');
102
		$member_config = $oMemberModel->getMemberConfig();
103
104
		$postFix = ($member_config->identifier == 'email_address') ? 'ByEmail' : '';
105
106
		// 계정이 이메일인 경우 이메일 정보로 사용자를 싱크하도록 한다. 이때 변수명은 그대로 user_id를 사용한다.
107
108
		/* DBMS가 CUBRID인 경우 MySQL과 동일한 방법으로는 문서 및 댓글에 대한 사용자 정보를 동기화 할 수 없으므로 예외 처리 합니다.
109
		   CUBRID를 사용하지 않는 경우에만 보편적인 기존 질의문을 사용합니다. */
110
		$db_info = Context::getDBInfo ();
111
		if($db_info->db_type != "cubrid")
112
		{
113
			$output = executeQuery('importer.updateDocumentSync'.$postFix);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
114
			$output = executeQuery('importer.updateCommentSync'.$postFix);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
115
		}
116
		else
117
		{
118
			$output = executeQueryArray ('importer.getDocumentMemberSrlWithUserID'.$postFix);
119 View Code Duplication
			if(is_array ($output->data) && count ($output->data))
120
			{
121
				$success_count = 0;
122
				$error_count = 0;
123
				$total_count = 0;
124
				foreach ($output->data as $val)
125
				{
126
					$args->user_id = $val->user_id;
0 ignored issues
show
Bug introduced by
The variable $args does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
127
					$args->member_srl = $val->member_srl;
128
					$tmp = executeQuery ('importer.updateDocumentSyncForCUBRID'.$postFix, $args);
129
					if($tmp->toBool () === true)
130
					{
131
						$success_count++;
132
					}
133
					else
134
					{
135
						$error_count++;
136
					}
137
					$total_count++;
138
				}
139
			} // documents section
140
141
			$output = executeQueryArray ('importer.getCommentMemberSrlWithUserID'.$postFix);
142 View Code Duplication
			if(is_array ($output->data) && count ($output->data))
143
			{
144
				$success_count = 0;
145
				$error_count = 0;
146
				$total_count = 0;
147
				foreach ($output->data as $val)
148
				{
149
					$args->user_id = $val->user_id;
150
					$args->member_srl = $val->member_srl;
151
					$tmp = executeQuery ('importer.updateCommentSyncForCUBRID'.$postFix, $args);
152
					if($tmp->toBool () === true)
153
					{
154
						$success_count++;
155
					}
156
					else
157
					{
158
						$error_count++;
159
					}
160
					$total_count++;
161
				}
162
			} // comments section
163
		}
164
165
		$this->setMessage('msg_sync_completed');
166
	}
167
168
	/**
169
	 * Pre-analyze the xml file and cache it
170
	 * @return void
171
	 */
172
	function procImporterAdminPreProcessing()
173
	{
174
		// Get the target xml file to import
175
		$xml_file = Context::get('xml_file');
176
		// Get a type of the target
177
		$type = Context::get('type');
178
		// Extract and cache information from the xml file
179
		$oExtract = new extract();
180
181
		switch($type)
182
		{
183 View Code Duplication
			case 'member' :
184
				$output = $oExtract->set($xml_file,'<members ', '</members>', '<member>', '</member>');
185
				if($output->toBool()) $oExtract->saveItems();
186
				break;
187 View Code Duplication
			case 'message' :
188
				$output = $oExtract->set($xml_file,'<messages ', '</messages>', '<message>','</message>');
189
				if($output->toBool()) $oExtract->saveItems();
190
				break;
191
			case 'ttxml' :
192
				// Category information
193
				$output = $oExtract->set($xml_file, '', '', '', '');
194
				if ($output->toBool())
195
				{
196
					// Get a category of ttxml separately
197
					$started = false;
198
					$buff = '';
199
					while (!feof($oExtract->fd))
200
					{
201
						$str = fgets($oExtract->fd, 1024);
202
						if(strstr($str, '<category>'))
203
						{
204
							$started = true;
205
							$str = strstr($str, '<category>');
206
						}
207
						if(substr($str,0,strlen('<post ')) == '<post ') break;
208
						if ($started) $buff .= $str;
209
					}
210
					$buff = '<categories>'.$buff.'</categories>';
211
					$oExtract->closeFile();
212
					$category_filename = sprintf('%s/%s', $oExtract->cache_path, 'category.xml');
213
					FileHandler::writeFile($category_filename, $buff);
214
215
					// Guestbook information
216
					$output = $oExtract->set($xml_file, '', '', '', '');
217
					if($output->toBool())
218
					{
219
						$started = false;
220
						$buff = '';
221
						while (!feof($oExtract->fd))
222
						{
223
							$str = fgets($oExtract->fd, 1024);
224
							if(strstr($str, '<guestbook>'))
225
							{
226
								$started = true;
227
								$str = strstr($str, '<guestbook>');
228
							}
229
							if($started)
230
							{
231
								$pos = strpos($str, '</guestbook>');
232
								if($pos !== false)
233
								{
234
									$buff .= substr($str, 0, $pos + strlen('</guestbook>'));
235
									break;
236
								}
237
								$buff .= $str;
238
							}
239
						}
240
						$oExtract->closeFile();
241
						$guestbook_filename = sprintf('%s/%s', $oExtract->cache_path, 'guestbook.xml');
242
						FileHandler::writeFile($guestbook_filename, $buff);
243
						// Individual items
244
						$output = $oExtract->set($xml_file,'<blog', '</blog>', '<post ', '</post>');
245
						if($output->toBool()) $oExtract->saveItems();
246
					}
247
				}
248
				break;
249
			default :
250
				// First get category information
251
				$output = $oExtract->set($xml_file,'<categories>', '</categories>', '<category','</category>');
252
				if($output->toBool())
253
				{
254
					$oExtract->mergeItems('category.xml');
255
					// Get each item
256
					$output = $oExtract->set($xml_file,'<posts ', '</posts>', '<post>', '</post>');
257
					if($output->toBool()) $oExtract->saveItems();
258
				}
259
				break;
260
		}
261
262
		if(!$output->toBool())
263
		{
264
			$this->add('error',0);
265
			$this->add('status',-1);
266
			$this->setMessage($output->getMessage());
267
			return;
268
		}
269
		// Notify that all data completely extracted
270
		$this->add('type',$type);
271
		$this->add('total',$oExtract->getTotalCount());
272
		$this->add('cur',0);
273
		$this->add('key', $oExtract->getKey());
274
		$this->add('status',0);
275
	}
276
277
	/**
278
	 * Migrate data after completing xml file extraction
279
	 * @return void
280
	 */
281
	function procImporterAdminImport()
282
	{
283
		// Variable setting
284
		$type = Context::get('type');
285
		$total = Context::get('total');
286
		$cur = Context::get('cur');
287
		$key = Context::get('key');
288
		$user_id = Context::get('user_id');
289
		$target_module = Context::get('target_module');
290
		$guestbook_target_module = Context::get('guestbook_target_module');
291
		$this->unit_count = Context::get('unit_count');
0 ignored issues
show
Documentation Bug introduced by
The property $unit_count was declared of type integer, but \Context::get('unit_count') is of type string. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
292
		// Check if an index file exists
293
		$index_file = './files/cache/importer/'.$key.'/index';
294
		if(!file_exists($index_file)) return new BaseObject(-1, 'msg_invalid_xml_file');
295
296
		switch($type)
297
		{
298
			case 'ttxml' :
299
				if(!$target_module) return new BaseObject(-1,'msg_invalid_request');
300
301
				$oModuleModel = getModel('module');
302
				$columnList = array('module_srl', 'module');
303
				$target_module_info = $oModuleModel->getModuleInfoByModuleSrl($target_module, $columnList);
304
305
				$ttimporter = FileHandler::exists(_XE_PATH_ . 'modules/importer/ttimport.class.php');
306
				if($ttimporter) require_once($ttimporter);
0 ignored issues
show
Bug Best Practice introduced by
The expression $ttimporter of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
307
308
				$oTT = new ttimport();
309
				$cur = $oTT->importModule($key, $cur, $index_file, $this->unit_count, $target_module, $guestbook_target_module, $user_id, $target_module_info->module);
310
				break;
311
			case 'message' :
312
				$cur = $this->importMessage($key, $cur, $index_file);
313
				break;
314
			case 'member' :
315
				$cur = $this->importMember($key, $cur, $index_file);
316
				break;
317
			case 'module' :
318
				// Check if the target module exists
319
				if(!$target_module) return new BaseObject(-1,'msg_invalid_request');
320
				$cur = $this->importModule($key, $cur, $index_file, $target_module);
321
				break;
322
		}
323
		// Notify that all data completely extracted
324
		$this->add('type',$type);
325
		$this->add('total',$total);
326
		$this->add('cur',$cur);
327
		$this->add('key', $key);
328
		$this->add('target_module', $target_module);
329
		// When completing, success message appears and remove the cache files
330
		if($total <= $cur)
331
		{
332
			$this->setMessage( sprintf(Context::getLang('msg_import_finished'), $cur, $total) );
333
			FileHandler::removeDir('./files/cache/importer/'.$key);
334
		}
335
		else $this->setMessage( sprintf(Context::getLang('msg_importing'), $total, $cur) );
336
	}
337
338
	/**
339
	 * Import member information
340
	 * @param int $key
341
	 * @param int $cur
342
	 * @param string $index_file
343
	 * @return int
344
	 */
345
	function importMember($key, $cur, $index_file)
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed.

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

Loading history...
346
	{
347
		if(!$cur) $cur = 0;
348
		// Create the xmlParser object
349
		$oXmlParser = new XmlParser();
350
		// Create objects for importing member information
351
		$this->oMemberController = getController('member');
0 ignored issues
show
Bug introduced by
The property oMemberController does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
352
		$this->oMemberModel = getModel('member');
0 ignored issues
show
Bug introduced by
The property oMemberModel does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
353
		// Get a default member group
354
		$default_group = $this->oMemberModel->getDefaultGroup();
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class ModuleObject as the method getDefaultGroup() does only exist in the following sub-classes of ModuleObject: memberModel. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
355
		$default_group_srl = $default_group->group_srl;
356
		// Get information of the Webmaster
357
		$oModuleModel = getModel('module');
358
		$member_config = $oModuleModel->getModuleConfig('member');
359
		// Open an index file
360
		$f = fopen($index_file,"r");
361
		// Pass if already read
362
		for($i=0;$i<$cur;$i++) fgets($f, 1024);
363
		// Read by each line until the condition meets
364
		for($idx=$cur;$idx<$cur+$this->unit_count;$idx++)
365
		{
366
			if(feof($f)) break;
367
			// Find a given location
368
			$target_file = trim(fgets($f, 1024));
369
			// Load and parse the file
370
			$xmlObj = $oXmlParser->loadXmlFile($target_file);
371
			FileHandler::removeFile($target_file);
372
			if(!$xmlObj) continue;
373
			// List Objects
374
			$obj = new stdClass();
375
			$obj->member_srl = getNextSequence();
376
			$obj->user_id = base64_decode($xmlObj->member->user_id->body);
377
			$obj->password = base64_decode($xmlObj->member->password->body);
378
			$obj->user_name = base64_decode($xmlObj->member->user_name->body);
379
			$obj->nick_name = base64_decode($xmlObj->member->nick_name->body);
380
			if(!$obj->user_name) $obj->user_name = $obj->nick_name;
381
			$obj->email_address = base64_decode($xmlObj->member->email->body);
382
			$obj->homepage = base64_decode($xmlObj->member->homepage->body);
383
			$obj->blog = base64_decode($xmlObj->member->blog->body);
384
			$obj->birthday = substr(base64_decode($xmlObj->member->birthday->body),0,8);
385
			$obj->allow_mailing = base64_decode($xmlObj->member->allow_mailing->body);
386
			$obj->point = base64_decode($xmlObj->member->point->body);
387
			$obj->image_nickname = base64_decode($xmlObj->member->image_nickname->buff->body);
388
			$obj->image_mark = base64_decode($xmlObj->member->image_mark->buff->body);
389
			$obj->profile_image = base64_decode($xmlObj->member->profile_image->buff->body);
390
			$obj->signature = base64_decode($xmlObj->member->signature->body);
391
			$obj->regdate = base64_decode($xmlObj->member->regdate->body);
392
			$obj->last_login = base64_decode($xmlObj->member->last_login->body);
393
394
			if($xmlObj->member->extra_vars)
395
			{
396
				foreach($xmlObj->member->extra_vars as $key => $val)
397
				{
398
					if(in_array($key, array('node_name','attrs','body'))) continue;
399
					$obj->extra_vars->{$key} = base64_decode($val->body);
400
				}
401
			}
402
			// Create url for homepage and blog
403 View Code Duplication
			if($obj->homepage && strncasecmp('http://', $obj->homepage, 7) !== 0 && strncasecmp('https://', $obj->homepage, 8) !== 0) $obj->homepage = 'http://'.$obj->homepage;
404
			// Check user ID
405 View Code Duplication
			if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
406
			{
407
				$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
408
			}
409
			if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
410
			{
411
				$obj->user_id = 't' . $obj->member_srl;
412
			}
413
			// Check email address
414
			if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
415
			{
416
				$obj->email_address = $obj->user_id . '@example.com';
417
			}
418
			list($obj->email_id, $obj->email_host) = explode('@', $obj->email);
419
			// Set the mailing option
420
			if($obj->allow_mailing!='Y') $obj->allow_mailing = 'N';
421
			// Set the message option
422
			$obj->allow_message = 'Y';
423
			if(!in_array($obj->allow_message, array('Y','N','F'))) $obj->allow_message= 'Y';
424
			// Get member-join date if the last login time is not found
425
			if(!$obj->last_login) $obj->last_login = $obj->regdate;
426
			// Set the list order
427
			$obj->list_order = -1 * $obj->member_srl;
428
			// List extra vars
429
			$extra_vars = $obj->extra_vars;
430
			unset($obj->extra_vars);
431
			$obj->extra_vars = serialize($extra_vars);
432
			// Check if the same user ID exists
433
			$args = new stdClass;
434
			$args->user_id = $obj->user_id;
435
			$output = executeQuery('member.getMemberSrl', $args);
436
			if(!$output->toBool() || $output->data)
437
			{
438
				$obj->user_id .= '_'.$obj->member_srl;
439
			}
440
			// Check if the same nickname exists
441
			$args = new stdClass;
442
			$args->nick_name = $obj->nick_name;
443
			$output = executeQuery('member.getMemberSrl', $args);
444
			if(!$output->toBool() || $output->data)
445
			{
446
				$obj->user_id .= '_'.$obj->member_srl;
447
			}
448
			// Check if the same email address exists
449
			$args = new stdClass;
450
			$args->email_address = $obj->email_address;
451
			$output = executeQuery('member.getMemberSrl', $args);
452
			if(!$output->toBool() || $output->data)
453
			{
454
				$obj->email_address = $obj->user_id . '@example.com';
455
			}
456
457
			// Add a member
458
			$output = executeQuery('member.insertMember', $obj);
459
460
			if($output->toBool() && !($obj->password))
461
			{
462
				// Send a mail telling the user to reset his password.
463
				$oMail = new Mail();
464
				$oMail->setTitle("Password update for your " . getFullSiteUrl() . " account");
465
				$webmaster_name = $member_config->webmaster_name?$member_config->webmaster_name:'Webmaster';
466
				$oMail->setContent("Dear $obj->user_name, <br /><br />
467
						We recently migrated our site to XpressEngine. Since you password was encrypted we could not migrate it too, so please reset it by following this link:
468
						<a href='" . getFullSiteUrl() . "/?act=dispMemberFindAccount' >" . getFullSiteUrl() . "?act=dispMemberFindAccount</a>. You need to enter you email address and hit the 'Find account' button. You will then receive an email with a new, generated password that you can change after login. <br /><br />
469
470
						Thank you for your understanding,<br />
471
						{$webmaster_name}"
472
				);
473
				$oMail->setSender($webmaster_name, $member_config->webmaster_email);
474
				$oMail->setReceiptor( $obj->user_name, $obj->email);
475
				$oMail->send();
476
			}
477
478
			// add group join/image name-mark-signiture and so on if a new member successfully added
479
			if($output->toBool())
480
			{
481
				// Join to the default group
482
				$obj->group_srl = $default_group_srl;
483
				executeQuery('member.addMemberToGroup',$obj);
484
				// Image name
485 View Code Duplication
				if($obj->image_nickname)
486
				{
487
					$target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($obj->member_srl));
488
					$target_filename = sprintf('%s%d.gif', $target_path, $obj->member_srl);
489
					FileHandler::writeFile($target_filename, $obj->image_nickname);
490
				}
491
				// Image mark
492 View Code Duplication
				if($obj->image_mark && file_exists($obj->image_mark))
493
				{
494
					$target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($obj->member_srl));
495
					$target_filename = sprintf('%s%d.gif', $target_path, $obj->member_srl);
496
					FileHandler::writeFile($target_filename, $obj->image_mark);
497
				}
498
				// Profile image
499 View Code Duplication
				if($obj->profile_image)
500
				{
501
					$target_path = sprintf('files/member_extra_info/profile_image/%s/', getNumberingPath($obj->member_srl));
502
					$target_filename = sprintf('%s%d.gif', $target_path, $obj->member_srl);
503
					FileHandler::writeFile($target_filename, $obj->profile_image);
504
				}
505
				// Signiture
506
				if($obj->signature)
507
				{
508
					$signature = removeHackTag($obj->signature);
509
					$signature_buff = sprintf('<?php if(!defined("__XE__")) exit();?>%s', $signature);
510
511
					$target_path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($obj->member_srl));
512
					if(!is_dir($target_path)) FileHandler::makeDir($target_path);
513
					$target_filename = sprintf('%s%d.signature.php', $target_path, $obj->member_srl);
514
515
					FileHandler::writeFile($target_filename, $signature_buff);
516
				}
517
			}
518
		}
519
520
		fclose($f);
521
522
		return $idx-1;
523
	}
524
525
	/**
526
	 * Import message information parsed from a given xml file
527
	 * @param int $key
528
	 * @param int $cur
529
	 * @param string $index_file
530
	 * @return int
531
	 */
532
	function importMessage($key, $cur, $index_file)
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed.

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

Loading history...
533
	{
534
		if(!$cur) $cur = 0;
535
		// Create the xmlParser object
536
		$oXmlParser = new XmlParser();
537
		// Open an index file
538
		$f = fopen($index_file,"r");
539
		// Pass if already read
540
		for($i=0;$i<$cur;$i++) fgets($f, 1024);
541
		// Read each line until the condition meets
542
		for($idx=$cur;$idx<$cur+$this->unit_count;$idx++)
543
		{
544
			if(feof($f)) break;
545
			// Find a location
546
			$target_file = trim(fgets($f, 1024));
547
			// Load and parse the file
548
			$xmlObj = $oXmlParser->loadXmlFile($target_file);
549
			FileHandler::removeFile($target_file);
550
			if(!$xmlObj) continue;
551
			// List objects
552
			$obj = null;
553
			$obj->receiver = base64_decode($xmlObj->message->receiver->body);
554
			$obj->sender = base64_decode($xmlObj->message->sender->body);
555
			$obj->title = base64_decode($xmlObj->message->title->body);
556
			$obj->content = base64_decode($xmlObj->message->content->body);
557
			$obj->readed = base64_decode($xmlObj->message->readed->body)=='Y'?'Y':'N';
558
			$obj->regdate = base64_decode($xmlObj->message->regdate->body);
559
			$obj->readed_date = base64_decode($xmlObj->message->readed_date->body);
560
			// Get member_srl of sender/recipient (If not exists, pass)
561
			if(!$obj->sender) continue;
562
			$sender_args->user_id = $obj->sender;
0 ignored issues
show
Bug introduced by
The variable $sender_args does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
563
			$sender_output = executeQuery('member.getMemberInfo',$sender_args);
564
			$sender_srl = $sender_output->data->member_srl;
565
			if(!$sender_srl)
566
			{
567
				unset($sender_args);
568
				$sender_args->email_address = $obj->sender;
569
				$sender_output = executeQuery('member.getMemberInfoByEmailAddress',$sender_args);
570
				$sender_srl = $sender_output->data->member_srl;
571
			}
572
			if(!$sender_srl) continue;
573
574
			$receiver_args->user_id = $obj->receiver;
0 ignored issues
show
Bug introduced by
The variable $receiver_args does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
575
			if(!$obj->receiver) continue;
576
			$receiver_output = executeQuery('member.getMemberInfo',$receiver_args);
577
			$receiver_srl = $receiver_output->data->member_srl;
578
			if(!$receiver_srl)
579
			{
580
				unset($receiver_args);
581
				$receiver_args->email_address = $obj->receiver;
582
				$receiver_output = executeQuery('member.getMemberInfoByEmailAddress',$receiver_args);
583
				$receiver_srl = $receiver_output->data->member_srl;
584
			}
585
			if(!$receiver_srl) continue;
586
			// Message to save into sender's message box
587
			$sender_args->sender_srl = $sender_srl;
588
			$sender_args->receiver_srl = $receiver_srl;
589
			$sender_args->message_type = 'S';
590
			$sender_args->title = $obj->title;
591
			$sender_args->content = $obj->content;
592
			$sender_args->readed = $obj->readed;
593
			$sender_args->regdate = $obj->regdate;
594
			$sender_args->readed_date = $obj->readed_date;
595
			$sender_args->related_srl = getNextSequence();
596
			$sender_args->message_srl = getNextSequence();
597
			$sender_args->list_order = $sender_args->message_srl * -1;
598
599
			$output = executeQuery('communication.sendMessage', $sender_args);
600
			if($output->toBool())
601
			{
602
				// Message to save into recipient's massage box
603
				$receiver_args->message_srl = $sender_args->related_srl;
604
				$receiver_args->list_order = $sender_args->related_srl*-1;
605
				$receiver_args->sender_srl = $sender_srl;
606
				if(!$receiver_args->sender_srl) $receiver_args->sender_srl = $receiver_srl;
607
				$receiver_args->receiver_srl = $receiver_srl;
608
				$receiver_args->message_type = 'R';
609
				$receiver_args->title = $obj->title;
610
				$receiver_args->content = $obj->content;
611
				$receiver_args->readed = $obj->readed;
612
				$receiver_args->regdate = $obj->regdate;
613
				$receiver_args->readed_date = $obj->readed_date;
614
				$output = executeQuery('communication.sendMessage', $receiver_args);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
615
			}
616
		}
617
618
		fclose($f);
619
620
		return $idx-1;
621
	}
622
623
	/**
624
	 * Import data in module.xml format
625
	 * @param int $key
626
	 * @param int $cur
627
	 * @param string $index_file
628
	 * @param int $module_srl
629
	 * @return int
630
	 */
631
	function importModule($key, $cur, $index_file, $module_srl)
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed.

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

Loading history...
632
	{
633
		// Pre-create the objects needed
634
		$this->oXmlParser = new XmlParser();
635
		// Get category information of the target module
636
		$oDocumentController = getController('document');
637
		$oDocumentModel = getModel('document');
638
		$category_list = $category_titles = array();
0 ignored issues
show
Unused Code introduced by
$category_list is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
639
		$category_list = $oDocumentModel->getCategoryList($module_srl);
640
		if(count($category_list)) foreach($category_list as $key => $val) $category_titles[$val->title] = $val->category_srl;
641
		// Extract category information
642
		$category_file = preg_replace('/index$/i', 'category.xml', $index_file);
643
		if(file_exists($category_file))
644
		{
645
			$buff = FileHandler::readFile($category_file);
0 ignored issues
show
Unused Code introduced by
$buff is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
646
647
			// Create the xmlParser object
648
			$xmlDoc = $this->oXmlParser->loadXmlFile($category_file);
649
650
			$categories = $xmlDoc->items->category;
651
			if($categories)
652
			{
653
				if(!is_array($categories)) $categories = array($categories);
654
				$match_sequence = array();
655
				foreach($categories as $k => $v)
656
				{
657
					$category = trim(base64_decode($v->body));
658
					if(!$category || $category_titles[$category]) continue;
659
660
					$sequence = $v->attrs->sequence;
661
					$parent = $v->attrs->parent;
662
663
					$obj = null;
664
					$obj->title = $category;
665
					$obj->module_srl = $module_srl;
666
					if($parent) $obj->parent_srl = $match_sequence[$parent];
667
668
					$output = $oDocumentController->insertCategory($obj);
669
					if($output->toBool()) $match_sequence[$sequence] = $output->get('category_srl');
670
				}
671
				$oDocumentController = getController('document');
672
				$oDocumentController->makeCategoryFile($module_srl);
673
			}
674
			FileHandler::removeFile($category_file);
675
		}
676
677
		$category_list = $category_titles = array();
0 ignored issues
show
Unused Code introduced by
$category_list is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
678
		$category_list = $oDocumentModel->getCategoryList($module_srl);
679
		if(count($category_list)) foreach($category_list as $key => $val) $category_titles[$val->title] = $val->category_srl;
680
681
		$ek_args->module_srl = $module_srl;
0 ignored issues
show
Bug introduced by
The variable $ek_args does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
682
		$output = executeQueryArray('document.getDocumentExtraKeys', $ek_args);
683
		if($output->data)
684
		{
685
			foreach($output->data as $key => $val) $extra_keys[$val->eid] = true;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$extra_keys was never initialized. Although not strictly required by PHP, it is generally a good practice to add $extra_keys = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
686
		}
687
688
		if(!$cur) $cur = 0;
689
		// Open an index file
690
		$f = fopen($index_file,"r");
691
		// Pass if already read
692
		for($i=0;$i<$cur;$i++) fgets($f, 1024);
693
		// Read each line until the condition meets
694
		for($idx=$cur;$idx<$cur+$this->unit_count;$idx++)
695
		{
696
			if(feof($f)) break;
697
			// Find a location
698
			$target_file = trim(fgets($f, 1024));
699
700
			if(!file_exists($target_file)) continue;
701
			// Importing data from now on
702
			$fp = fopen($target_file,"r");
703
			if(!$fp) continue;
704
705
			$obj = new stdClass;
706
			$obj->module_srl = $module_srl;
707
			$obj->document_srl = getNextSequence();
708
709
			$files = array();
710
			$extra_vars = array();
711
712
			$started = false;
713
			$buff = array();
714
			// Start from the body data
715
			while(!feof($fp))
716
			{
717
				$str = fgets($fp, 1024);
718
				// Prepare an item
719
				if(trim($str) == '<post>')
720
				{
721
					$started = true;
722
					// Trackback inserted
723
				}
724
				else if(substr($str,0,11) == '<trackbacks')
725
				{
726
					$obj->trackback_count = $this->importTrackbacks($fp, $module_srl, $obj->document_srl);
727
					continue;
728
					// Comments inserted
729
				}
730
				else if(substr($str,0,9) == '<comments')
731
				{
732
					$obj->comment_count = $this->importComments($fp, $module_srl, $obj->document_srl);
733
					continue;
734
					// Attachment inserted
735
				}
736
				else if(substr($str,0,9) == '<attaches')
737
				{
738
					$obj->uploaded_count = $this->importAttaches($fp, $module_srl, $obj->document_srl, $files);
739
					continue;
740
					// When starting extra variabls
741
				}
742
				elseif(trim($str) == '<extra_vars>')
743
				{
744
					$extra_vars = $this->importExtraVars($fp);
745
					continue;
746
				}
747
748
				if($started) $buff[] = $str;
749
			}
750
751
			$xmlDoc = $this->oXmlParser->parse(implode('', $buff));
752
753
			$category = base64_decode($xmlDoc->post->category->body);
754
			if($category_titles[$category]) $obj->category_srl = $category_titles[$category];
755
756
			$obj->member_srl = 0;
757
758
			$obj->is_notice = base64_decode($xmlDoc->post->is_notice->body)=='Y'?'Y':'N';
759
			$obj->status = base64_decode($xmlDoc->post->is_secret->body)=='Y'?$oDocumentModel->getConfigStatus('secret'):$oDocumentModel->getConfigStatus('public');
760
			$obj->title = base64_decode($xmlDoc->post->title->body);
761
			$obj->content = base64_decode($xmlDoc->post->content->body);
762
			$obj->readed_count = base64_decode($xmlDoc->post->readed_count->body);
763
			$obj->voted_count = base64_decode($xmlDoc->post->voted_count->body);
764
			$obj->blamed_count = base64_decode($xmlDoc->post->blamed_count->body);
765
			$obj->password = base64_decode($xmlDoc->post->password->body);
766
			$obj->user_name = base64_decode($xmlDoc->post->user_name->body);
767
			$obj->nick_name = base64_decode($xmlDoc->post->nick_name->body);
768
			if(!$obj->user_name) $obj->user_name = $obj->nick_name;
769
			$obj->user_id = base64_decode($xmlDoc->post->user_id->body);
770
			$obj->email_address = base64_decode($xmlDoc->post->email->body);
771
			$obj->homepage = base64_decode($xmlDoc->post->homepage->body);
772 View Code Duplication
			if($obj->homepage && strncasecmp('http://', $obj->homepage, 7) !== 0 && strncasecmp('https://', $obj->homepage, 8) !== 0) $obj->homepage = 'http://'.$obj->homepage;
773
			$obj->tags = base64_decode($xmlDoc->post->tags->body);
774
			$obj->regdate = base64_decode($xmlDoc->post->regdate->body);
775
			$obj->last_update = base64_decode($xmlDoc->post->update->body);
776
			$obj->last_updater = base64_decode($xmlDoc->post->last_updater->body);
777
			if(!$obj->last_update) $obj->last_update = $obj->regdate;
778
			$obj->ipaddress = base64_decode($xmlDoc->post->ipaddress->body);
779
			$obj->list_order = $obj->update_order = $obj->document_srl*-1;
780
			$obj->commentStatus = base64_decode($xmlDoc->post->allow_comment->body)!='N'?'ALLOW':'DENY';
781
			$obj->allow_trackback = base64_decode($xmlDoc->post->allow_trackback->body)!='N'?'Y':'N';
782
			$obj->notify_message = base64_decode($xmlDoc->post->is_notice->body);
783
			// Check user ID
784 View Code Duplication
			if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
785
			{
786
				$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
787
			}
788
			if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
789
			{
790
				$obj->user_id = 't' . $obj->member_srl;
791
			}
792
			// Check email address
793
			if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
794
			{
795
				$obj->email_address = $obj->user_id . '@example.com';
796
			}
797
			// Change content information (attachment)
798
			if(count($files))
799
			{
800
				foreach($files as $key => $val)
801
				{
802
					$obj->content = preg_replace('/(src|href)\=(["\']?)'.preg_quote($key).'(["\']?)/i','$1="'.$val.'"',$obj->content);
803
					$obj->content = preg_replace('/(["\']?).\/files\/(.+)\/'.preg_quote($key).'([^"\']+)(["\']?)/i','"'.$val.'"',$obj->content);
804
					$obj->content = preg_replace('/(["\']?)files\/(.+)\/'.preg_quote($key).'([^"\']+)(["\']?)/i','"'.$val.'"',$obj->content);
805
				}
806
			}
807
808
			$output = executeQuery('document.insertDocument', $obj);
809
810 View Code Duplication
			if($output->toBool() && $obj->tags)
811
			{
812
				$tag_list = explode(',',$obj->tags);
813
				$tag_count = count($tag_list);
814
				for($i=0;$i<$tag_count;$i++)
815
				{
816
					$args = new stdClass;
817
					$args->tag_srl = getNextSequence();
818
					$args->module_srl = $module_srl;
819
					$args->document_srl = $obj->document_srl;
820
					$args->tag = trim($tag_list[$i]);
821
					$args->regdate = $obj->regdate;
822
					if(!$args->tag) continue;
823
					$output = executeQuery('tag.insertTag', $args);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
824
				}
825
826
			}
827
			// Add extra variables
828
			if(count($extra_vars))
829
			{
830
				foreach($extra_vars as $key => $val)
831
				{
832
					if(!$val->value) continue;
833
					unset($e_args);
834
					$e_args->module_srl = $module_srl;
0 ignored issues
show
Bug introduced by
The variable $e_args does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
835
					$e_args->document_srl = $obj->document_srl;
836
					$e_args->var_idx = $val->var_idx;
837
					$e_args->value = $val->value;
838
					$e_args->lang_code = $val->lang_code;
839
					$e_args->eid = $val->eid;
840
					// Create a key for extra vars if not exists (except vars for title and content)
841
					if(!preg_match('/^(title|content)_(.+)$/i',$e_args->eid) && !$extra_keys[$e_args->eid])
842
					{
843
						unset($ek_args);
844
						$ek_args->module_srl = $module_srl;
845
						$ek_args->var_idx = $val->var_idx;
846
						$ek_args->var_name = $val->eid;
847
						$ek_args->var_type = 'text';
848
						$ek_args->var_is_required = 'N';
849
						$ek_args->var_default = '';
850
						$ek_args->eid = $val->eid;
851
						$output = executeQuery('document.insertDocumentExtraKey', $ek_args);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
852
						$extra_keys[$ek_args->eid] = true;
0 ignored issues
show
Bug introduced by
The variable $extra_keys does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
853
					}
854
855
					$output = executeQuery('document.insertDocumentExtraVar', $e_args);
0 ignored issues
show
Unused Code introduced by
$output is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
856
				}
857
			}
858
859
			fclose($fp);
860
			FileHandler::removeFile($target_file);
861
		}
862
863
		fclose($f);
864
		// Sync category counts
865
		if(count($category_list)) foreach($category_list as $key => $val) $oDocumentController->updateCategoryCount($module_srl, $val->category_srl);
866
867
		return $idx-1;
868
	}
869
870
	/**
871
	 * Trackbacks
872
	 * @param resource $fp
873
	 * @param int $module_srl
874
	 * @param int $document_srl
875
	 * @return int
876
	 */
877
	function importTrackbacks($fp, $module_srl, $document_srl)
878
	{
879
		$started = false;
880
		$buff = null;
881
		$cnt = 0;
882
883
		while(!feof($fp))
884
		{
885
			$str = fgets($fp, 1024);
886
			// If </trackbacks> is, break
887
			if(trim($str) == '</trackbacks>') break;
888
			// If <trackback>, start importing
889
			if(trim($str) == '<trackback>') $started = true;
890
891
			if($started) $buff .= $str;
892
			// If </trackback>, insert to the DB
893
			if(trim($str) == '</trackback>')
894
			{
895
				$xmlDoc = $this->oXmlParser->parse($buff);
896
897
				$obj = new stdClass;
898
				$obj->trackback_srl = getNextSequence();
899
				$obj->module_srl = $module_srl;
900
				$obj->document_srl = $document_srl;
901
				$obj->url = base64_decode($xmlDoc->trackback->url->body);
902
				$obj->title = base64_decode($xmlDoc->trackback->title->body);
903
				$obj->blog_name = base64_decode($xmlDoc->trackback->blog_name->body);
904
				$obj->excerpt = base64_decode($xmlDoc->trackback->excerpt->body);
905
				$obj->regdate = base64_decode($xmlDoc->trackback->regdate->body);
906
				$obj->ipaddress = base64_decode($xmlDoc->trackback->ipaddress->body);
907
				$obj->list_order = -1*$obj->trackback_srl;
908
				$output = executeQuery('trackback.insertTrackback', $obj);
909
				if($output->toBool()) $cnt++;
910
911
				$buff = null;
912
				$started = false;
913
			}
914
		}
915
		return $cnt;
916
	}
917
918
	/**
919
	 * Comments
920
	 * @param resource $fp
921
	 * @param int $module_srl
922
	 * @param int $document_srl
923
	 * @return int
924
	 */
925
	function importComments($fp, $module_srl, $document_srl)
926
	{
927
		$started = false;
928
		$buff = null;
929
		$cnt = 0;
930
931
		$sequences = array();
932
933
		while(!feof($fp))
934
		{
935
			$str = fgets($fp, 1024);
936
			// If </comments> is, break
937
			if(trim($str) == '</comments>') break;
938
			// If <comment> is, start importing
939
			if(trim($str) == '<comment>')
940
			{
941
				$started = true;
942
				$obj = new stdClass;
943
				$obj->comment_srl = getNextSequence();
944
				$files = array();
945
			}
946
			// If <attaches is, start importing attachments
947 View Code Duplication
			if(substr($str,0,9) == '<attaches')
948
			{
949
				$obj->uploaded_count = $this->importAttaches($fp, $module_srl, $obj->comment_srl, $files);
0 ignored issues
show
Bug introduced by
The variable $obj does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
950
				continue;
951
			}
952
953
			if($started) $buff .= $str;
954
			// If </comment> is, insert to the DB
955
			if(trim($str) == '</comment>')
956
			{
957
				$xmlDoc = $this->oXmlParser->parse($buff);
958
959
				$sequence = base64_decode($xmlDoc->comment->sequence->body);
960
				$sequences[$sequence] = $obj->comment_srl;
961
				$parent = base64_decode($xmlDoc->comment->parent->body);
962
963
				$obj->module_srl = $module_srl;
964
965
				if($parent) $obj->parent_srl = $sequences[$parent];
966
				else $obj->parent_srl = 0;
967
968
				$obj->document_srl = $document_srl;
969
				$obj->is_secret = base64_decode($xmlDoc->comment->is_secret->body)=='Y'?'Y':'N';
970
				$obj->notify_message = base64_decode($xmlDoc->comment->notify_message->body)=='Y'?'Y':'N';
971
				$obj->content = base64_decode($xmlDoc->comment->content->body);
972
				$obj->voted_count = base64_decode($xmlDoc->comment->voted_count->body);
973
				$obj->blamed_count = base64_decode($xmlDoc->comment->blamed_count->body);
974
				$obj->password = base64_decode($xmlDoc->comment->password->body);
975
				$obj->user_name =base64_decode($xmlDoc->comment->user_name->body);
976
				$obj->nick_name = base64_decode($xmlDoc->comment->nick_name->body);
977
				if(!$obj->user_name) $obj->user_name = $obj->nick_name;
978
				$obj->user_id = base64_decode($xmlDoc->comment->user_id->body);
979
				$obj->member_srl = 0;
980
				$obj->email_address = base64_decode($xmlDoc->comment->email->body);
981
				$obj->homepage = base64_decode($xmlDoc->comment->homepage->body);
982
				$obj->regdate = base64_decode($xmlDoc->comment->regdate->body);
983
				$obj->last_update = base64_decode($xmlDoc->comment->update->body);
984
				if(!$obj->last_update) $obj->last_update = $obj->regdate;
985
				$obj->ipaddress = base64_decode($xmlDoc->comment->ipaddress->body);
986
				$obj->status = base64_decode($xmlDoc->comment->status->body)==''?'1':base64_decode($xmlDoc->comment->status->body);
987
				$obj->list_order = $obj->comment_srl*-1;
988
				// Check user ID
989 View Code Duplication
				if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
990
				{
991
					$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
992
				}
993
				if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
994
				{
995
					$obj->user_id = 't' . $obj->member_srl;
996
				}
997
				// Check email address
998
				if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
999
				{
1000
					$obj->email_address = $obj->user_id . '@example.com';
1001
				}
1002
				// Change content information (attachment)
1003 View Code Duplication
				if(count($files))
1004
				{
1005
					foreach($files as $key => $val)
0 ignored issues
show
Bug introduced by
The variable $files does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1006
					{
1007
						$obj->content = preg_replace('/(src|href)\=(["\']?)'.preg_quote($key).'(["\']?)/i','$1="'.$val.'"',$obj->content);
1008
					}
1009
				}
1010
				// Comment list first
1011
				$list_args = new stdClass;
1012
				$list_args->comment_srl = $obj->comment_srl;
1013
				$list_args->document_srl = $obj->document_srl;
1014
				$list_args->module_srl = $obj->module_srl;
1015
				$list_args->regdate = $obj->regdate;
1016
				// Set data directly if parent comment doesn't exist
1017 View Code Duplication
				if(!$obj->parent_srl)
1018
				{
1019
					$list_args->head = $list_args->arrange = $obj->comment_srl;
1020
					$list_args->depth = 0;
1021
					// Get parent_srl if parent comment exists
1022
				}
1023
				else
1024
				{
1025
					// Get parent comment infomation
1026
					$parent_args->comment_srl = $obj->parent_srl;
0 ignored issues
show
Bug introduced by
The variable $parent_args does not exist. Did you mean $parent?

This check looks for variables that are accessed but have not been defined. It raises an issue if it finds another variable that has a similar name.

The variable may have been renamed without also renaming all references.

Loading history...
1027
					$parent_output = executeQuery('comment.getCommentListItem', $parent_args);
0 ignored issues
show
Bug introduced by
The variable $parent_args does not exist. Did you mean $parent?

This check looks for variables that are accessed but have not been defined. It raises an issue if it finds another variable that has a similar name.

The variable may have been renamed without also renaming all references.

Loading history...
1028
					// Return if parent comment doesn't exist
1029
					if(!$parent_output->toBool() || !$parent_output->data) continue;
1030
					$parent = $parent_output->data;
1031
1032
					$list_args->head = $parent->head;
1033
					$list_args->depth = $parent->depth+1;
1034
					if($list_args->depth<2) $list_args->arrange = $obj->comment_srl;
1035
					else
1036
					{
1037
						$list_args->arrange = $parent->arrange;
1038
						$output = executeQuery('comment.updateCommentListArrange', $list_args);
1039
						if(!$output->toBool()) return $output;
1040
					}
1041
				}
1042
1043
				$output = executeQuery('comment.insertCommentList', $list_args);
1044
				if($output->toBool())
1045
				{
1046
					$output = executeQuery('comment.insertComment', $obj);
1047
					if($output->toBool()) $cnt++;
1048
				}
1049
1050
				$buff = null;
1051
				$started = false;
1052
			}
1053
		}
1054
		return $cnt;
1055
	}
1056
1057
	/**
1058
	 * Import attachment
1059
	 * @param resource $fp
1060
	 * @param int $module_srl
1061
	 * @param int $upload_target_srl
1062
	 * @param array $files
1063
	 * @return int
1064
	 */
1065
	function importAttaches($fp, $module_srl, $upload_target_srl, &$files)
1066
	{
1067
		$uploaded_count = 0;
1068
1069
		$started = false;
1070
		$buff = null;
1071
1072
		$file_obj = new stdClass;
1073
		while(!feof($fp))
1074
		{
1075
			$str = trim(fgets($fp, 1024));
1076
			// If it ends with </attaches>, break
1077
			if(trim($str) == '</attaches>') break;
1078
			// If it starts with <attach>, collect attachments
1079
			if(trim($str) == '<attach>')
1080
			{
1081
				$file_obj->file_srl = getNextSequence();
1082
				$file_obj->upload_target_srl = $upload_target_srl;
1083
				$file_obj->module_srl = $module_srl;
1084
1085
				$started = true;
1086
				$buff = null;
1087
				// If it starts with <file>, handle the attachement in xml file
1088
			}
1089
			else if(trim($str) == '<file>')
1090
			{
1091
				$file_obj->file = $this->saveTemporaryFile($fp);
1092
				continue;
1093
			}
1094
1095
			if($started) $buff .= $str;
1096
			// If it ends with </attach>, handle attachements
1097
			if(trim($str) == '</attach>')
1098
			{
1099
				$xmlDoc = $this->oXmlParser->parse($buff.$str);
1100
1101
				$file_obj->source_filename = base64_decode($xmlDoc->attach->filename->body);
1102
				$file_obj->download_count = base64_decode($xmlDoc->attach->download_count->body);
1103
1104
				if(!$file_obj->file)
1105
				{
1106
					$url = base64_decode($xmlDoc->attach->url->body);
1107
					$path = base64_decode($xmlDoc->attach->path->body);
1108
					if($path && file_exists($path)) $file_obj->file = $path;
1109
					else
1110
					{
1111
						$file_obj->file = $this->getTmpFilename();
1112
						FileHandler::getRemoteFile($url, $file_obj->file);
1113
					}
1114
				}
1115
1116
				if(file_exists($file_obj->file))
1117
				{
1118
					$random = new Password();
1119
					// Set upload path by checking if the attachement is an image or other kind of file
1120
					if(preg_match("/\.(jpe?g|gif|png|wm[va]|mpe?g|avi|flv|mp[1-4]|as[fx]|wav|midi?|moo?v|qt|r[am]{1,2}|m4v)$/i", $file_obj->source_filename))
1121
					{
1122
						// Immediately remove the direct file if it has any kind of extensions for hacking
1123
						$file_obj->source_filename = preg_replace('/\.(php|phtm|phar|html?|cgi|pl|exe|jsp|asp|inc)/i', '$0-x', $file_obj->source_filename);
1124
						$file_obj->source_filename = str_replace(array('<', '>'), array('%3C', '%3E'), $file_obj->source_filename);
1125
1126
						$path = sprintf("./files/attach/images/%s/%s", $module_srl, getNumberingPath($upload_target_srl, 3));
1127
1128
						$ext = substr(strrchr($file_obj->source_filename,'.'),1);
1129
						$_filename = $random->createSecureSalt(32, 'hex').'.'.$ext;
1130
						$filename  = $path.$_filename;
1131
1132
						$idx = 1;
1133 View Code Duplication
						while(file_exists($filename))
1134
						{
1135
							$filename = $path.preg_replace('/\.([a-z0-9]+)$/i','_'.$idx.'.$1', $_filename);
1136
							$idx++;
1137
						}
1138
1139
						$file_obj->direct_download = 'Y';
1140
					}
1141 View Code Duplication
					else
1142
					{
1143
						$path = sprintf("./files/attach/binaries/%s/%s", $module_srl, getNumberingPath($upload_target_srl,3));
1144
						$filename = $path.$random->createSecureSalt(32, 'hex');
1145
						$file_obj->direct_download = 'N';
1146
					}
1147
					// Create a directory
1148
					if(!FileHandler::makeDir($path)) continue;
0 ignored issues
show
Bug Best Practice introduced by
The expression \FileHandler::makeDir($path) of type boolean|null is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
1149
1150
					if(strncmp('./files/cache/importer/', $file_obj->file, 23) === 0)
1151
					{
1152
						FileHandler::rename($file_obj->file, $filename);
1153
					}
1154
					else
1155
					{
1156
						copy($file_obj->file, $filename);
1157
					}
1158
1159
					// Insert the file to the DB
1160
					unset($file_obj->file);
1161
					if(file_exists($filename))
1162
					{
1163
						$file_obj->uploaded_filename = $filename;
1164
						$file_obj->file_size = filesize($filename);
1165
						$file_obj->comment = NULL;
1166
						$file_obj->member_srl = 0;
1167
						$file_obj->sid = $random->createSecureSalt(32, 'hex');
1168
						$file_obj->isvalid = 'Y';
1169
						$output = executeQuery('file.insertFile', $file_obj);
1170
1171
						if($output->toBool())
1172
						{
1173
							$uploaded_count++;
1174
							$tmp_obj = null;
1175
							$tmp_obj->source_filename = $file_obj->source_filename;
1176 View Code Duplication
							if($file_obj->direct_download == 'Y') $files[$file_obj->source_filename] = $file_obj->uploaded_filename;
1177
							else $files[$file_obj->source_filename] = getUrl('','module','file','act','procFileDownload','file_srl',$file_obj->file_srl,'sid',$file_obj->sid);
1178
						}
1179
					}
1180
				}
1181
			}
1182
		}
1183
		return $uploaded_count;
1184
	}
1185
1186
	/**
1187
	 * Return a filename to temporarily use
1188
	 * @return string
1189
	 */
1190 View Code Duplication
	function getTmpFilename()
0 ignored issues
show
Duplication introduced by
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...
1191
	{
1192
		$path = "./files/cache/importer";
1193
		FileHandler::makeDir($path);
1194
		$filename = sprintf("%s/%d", $path, rand(11111111,99999999));
1195
		if(file_exists($filename)) $filename .= rand(111,999);
1196
		return $filename;
1197
	}
1198
1199
	/**
1200
	 * Read buff until key value comes out from a specific file point
1201
	 * @param resource $fp
1202
	 * @return string
1203
	 */
1204 View Code Duplication
	function saveTemporaryFile($fp)
0 ignored issues
show
Duplication introduced by
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...
1205
	{
1206
		$temp_filename = $this->getTmpFilename();
1207
		$f = fopen($temp_filename, "w");
1208
1209
		$buff = '';
1210
		while(!feof($fp))
1211
		{
1212
			$str = trim(fgets($fp, 1024));
1213
			if(trim($str) == '</file>') break;
1214
1215
			$buff .= $str;
1216
1217
			if(substr($buff,-7)=='</buff>')
1218
			{
1219
				fwrite($f, base64_decode(substr($buff, 6, -7)));
1220
				$buff = '';
1221
			}
1222
		}
1223
		fclose($f);
1224
		return $temp_filename;
1225
	}
1226
1227
1228
	/**
1229
	 * Set extra variables
1230
	 * @param resource $fp
1231
	 * @return array
1232
	 */
1233
	function importExtraVars($fp)
1234
	{
1235
		$buff = null;
1236
		while(!feof($fp))
1237
		{
1238
			$buff .= $str = trim(fgets($fp, 1024));
1239
			if(trim($str) == '</extra_vars>') break;
1240
		}
1241
		if(!$buff) return array();
0 ignored issues
show
Bug Best Practice introduced by
The expression $buff of type null|string is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
1242
1243
		$buff = '<extra_vars>'.$buff;
1244
		$oXmlParser = new XmlParser();
0 ignored issues
show
Unused Code introduced by
$oXmlParser is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1245
		$xmlDoc = $this->oXmlParser->parse($buff);
1246
		if(!count($xmlDoc->extra_vars->key)) return array();
1247
1248
		$index = 1;
1249
		foreach($xmlDoc->extra_vars->key as $k => $v)
1250
		{
1251
			unset($vobj);
1252
			if($v->var_idx)
1253
			{
1254
				$vobj->var_idx = base64_decode($v->var_idx->body);
0 ignored issues
show
Bug introduced by
The variable $vobj does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
1255
				$vobj->lang_code = base64_decode($v->lang_code->body);
1256
				$vobj->value = base64_decode($v->value->body);
1257
				$vobj->eid = base64_decode($v->eid->body);
1258
1259
			}
1260
			else if($v->body)
1261
			{
1262
				$vobj->var_idx = $index;
1263
				$vobj->lang_code = Context::getLangType();
1264
				$vobj->value = base64_decode($v->body);
1265
				$vobj->eid = 'extra_vars'.$index;
1266
			}
1267
			$extra_vars["extra_vars".$index] = $vobj;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$extra_vars was never initialized. Although not strictly required by PHP, it is generally a good practice to add $extra_vars = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
1268
			$index++;
1269
		}
1270
		return $extra_vars;
0 ignored issues
show
Bug introduced by
The variable $extra_vars does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1271
	}
1272
}
1273
/* End of file importer.admin.controller.php */
1274
/* Location: ./modules/importer/importer.admin.controller.php */
1275