Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Recommended Posts

Здравствуйте

OC2.0.3.1

 

При смене в коде модуля mysql_real_escape_string на mysqli_real_escape_string

вылезла ошибка 

Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /www/admin/model/module/pro_megamenu.php on line 39

Вот код указанной строки

$this->db->query("INSERT INTO " . DB_PREFIX . "pro_megamenu SET title = '" . mysqli_real_escape_string($title) . "', url = '" . $data['url'][$key] . "', parent_id = '" . (int)$data['parent_id'][$key] . "', subcontent = '". htmlspecialchars_decode($content) ."', type = '".$data['type'][$key]."', type_id = '" .(int)$data['type_id'][$key]. "', widths = '" .$data['widths'][$key]. "', columns = '" .(int)$data['columns'][$key]. "', activemega = '" .(int)$data['activemega'][$key]. "'");

В документации сказано, что у mysqli_real_escape_string должно быть с параметрами: идентификатором соединения и строкой, которую требуется экранировать. Я пробовал подставлять $db в качестве идентификатора соединения

mysqli_real_escape_string($db, $title)

но вылезает ошибка, что переменная $db не известна.

Подскажите, как сделать, чтобы код заработал без ошибок?

Edited by fofa
Link to comment
Share on other sites


55 минут назад, nikifalex сказал:

зачем все занимаетесь черте чем?

$this->db->escape()

 

Если я вас правильно понял

$this->db->escape("INSERT INTO " . DB_PREFIX . "pro_megamenu SET title = '" . mysqli_real_escape_string($title) . "', url = '" . $data['url'][$key] . "', parent_id = '" . (int)$data['parent_id'][$key] . "', subcontent = '". htmlspecialchars_decode($content) ."', type = '".$data['type'][$key]."', type_id = '" .(int)$data['type_id'][$key]. "', widths = '" .$data['widths'][$key]. "', columns = '" .(int)$data['columns'][$key]. "', activemega = '" .(int)$data['activemega'][$key]. "'");

ошибка осталась

 

Вот весь код файла

<?php
class ModelModuleProMegamenu extends Model {
	protected $preData = array(
		'menu_height'=>'50',
		'submenu_width'=>'200',
		'submenu_height'=>'35',
		'menu_font_style'=>'uppercase',
		'menu_font_size'=>'15',
		'menu_font_color'=>'ffffff',
		'menu_font_color_hover'=>'ffffff',
		'submenu_font_style'=>'capitalize',
		'submenu_font_size'=>'15',
		'submenu_font_color'=>'464646',
		'submenu_font_color_hover'=>'3cb7e7',
		'menu_background'=>'323a45',
		'menu_background_hover'=>'3cb7e7',
		'submenu_background'=>'e6e6e6',
		'submenu_background_hover'=>'d0d0d0',
	);
	public function getOptions(){
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "pro_megamenu_options");
		return $query->rows ? $query->rows : array();
	}
	public function saveOptions($data){
		foreach ($data as $key => $value) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "pro_megamenu_options WHERE name = '" . $key . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "pro_megamenu_options SET name = '" . $key . "', value = '" . $this->db->escape($value) . "'");
		}
	}
	public function insert($data) {
		foreach($data['title'] as $key=>$value){

			$value[1] = iconv("utf-8", "windows-1251", $value[1]);
			$title = array_map("htmlspecialchars", $value);
			$title[1] = iconv("windows-1251", "utf-8", $title[1]);
			$content = array_map("htmlentities", $data['content_submenu'][$key]);
			$title = json_encode($title);
			$content = json_encode($content);
			$this->db->escape("INSERT INTO " . DB_PREFIX . "pro_megamenu SET title = '" . mysqli_real_escape_string($title) . "', url = '" . $data['url'][$key] . "', parent_id = '" . (int)$data['parent_id'][$key] . "', subcontent = '". htmlspecialchars_decode($content) ."', type = '".$data['type'][$key]."', type_id = '" .(int)$data['type_id'][$key]. "', widths = '" .$data['widths'][$key]. "', columns = '" .(int)$data['columns'][$key]. "', activemega = '" .(int)$data['activemega'][$key]. "'");
		}
	}
	public function empty_data() {
			$this->db->query("TRUNCATE " . DB_PREFIX . "pro_megamenu");
	}
	public function getDefaultLanguage(){
		$query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "language WHERE code = '" . $this->config->get('config_language') . "'");
		return $query->row ? $query->row['language_id'] : 0;
	}
	public function getMenuHtml($parent_id){
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "pro_megamenu  WHERE " . DB_PREFIX . "pro_megamenu.parent_id = '".$parent_id."' ORDER BY " . DB_PREFIX . "pro_megamenu.id ASC");
		$result=array();
		foreach ($query->rows as $value) {
			$result[] = $value;
		}
		/* Multi Language */
		$this->load->model('localisation/language');
		$languages = $this->model_localisation_language->getLanguages();
		if($result) :
		if($parent_id!=0) echo "<ol class='dd-list'>";
		foreach($result as $value) : ?>
		<?php
			$title = json_decode($value['title'], true);
			//var_dump($title);
			$content = json_decode($value['subcontent'], true);
		?>
		<li class='dd-item'>
			<div class='dd-handle'>
				<div class='bar'>
					<span class='title'><?php echo html_entity_decode(html_entity_decode($title[$this->getDefaultLanguage()]));?></span>
				</div>
			</div>
			<div class='info hide'>
				<p class="input-item"><span class='type'>Type : <?php echo $value['type'];?></span></p>
				<p class="input-item"><label>Title : </label></p>
				<?php foreach($languages as $language) : ?>
					<div class="input-group">
						<input class="form-control" type="text" name="title[][<?php echo $language['language_id']; ?>]" value="<?php if(isset($title[$language['language_id']])) echo html_entity_decode(html_entity_decode($title[$language['language_id']]));?>"/>
						<div class="input-group-addon"><img src="view/image/flags/<?php echo $language['image']; ?>"/></div>
					</div>
				<?php endforeach;?>
				<?php if($value['type']=='custom') : ?>
				<p class="input-item"><label>Url : </label><input class="form-control" type="text" name="url[]" value="<?php echo $value['url'] ; ?>"/></p>
				<?php endif;?>
				<p class="input-item"><a  href="javascript:void(0);" class="remove" onclick="remove_item(this);">Remove This Menu Item</a></p>
				<?php if($value['activemega']==1) : ?>
					<p class="input-item"><a  href="javascript:void(0);" class="activemega" onclick="activemega(this);" >Deactive Megamenu</a></p>
				<?php else : ?>
					<p class="input-item"><a  href="javascript:void(0);" class="activemega active" onclick="activemega(this);">Active Megamenu</a></p>
				<?php endif;?>
				<div class="hidden-data">
					<input type="hidden" class="type" name="type[]" value="<?php echo $value['type'];?>"/>
					<input type="hidden" class="parent_id" name="parent_id[]" value="<?php echo $value['parent_id'];?>"/>
					<input type="hidden" class="type_id" name="type_id[]" value="<?php echo $value['type_id'];?>"/>
					<?php if($value['type']!='custom') : ?>
					<input type="hidden" class="url" name="url[]" value="<?php echo $value['url'] ; ?>"/>
					<?php endif;?>
					<?php if($value['activemega']==1) : ?>
						<input type="hidden" class="activemega" name="activemega[]" value="1"/>
					<?php else : ?>
						<input type="hidden" class="activemega" name="activemega[]" value="0"/>
					<?php endif;?>
				</div>
				<?php if($value['activemega']==1) : ?>
				<div class="sub-menu-content">
					<div>
						<p class="input-item"><label>Num of Columns : </label>
							<select class="form-control" name="columns[]">
								<option value="1" <?php if($value['columns']==1) echo "selected='selected'";?>>1</option>
								<option value="2" <?php if($value['columns']==2) echo "selected='selected'";?>>2</option>
								<option value="3" <?php if($value['columns']==3) echo "selected='selected'";?>>3</option>
								<option value="4" <?php if($value['columns']==4) echo "selected='selected'";?>>4</option>
							</select>
						</p>
						<p class="input-item"><label>Width(Input number only) : </label>
						<div class="input-group">
							<input class="form-control" name="widths[]" type="text" value="<?php echo $value['widths'] ; ?>"/>
							<div class="input-group-addon">Px</div>
						</div>
						</p>
					</div>
					<p><strong>Content of Sub-menu : </strong></p>
					<?php foreach($languages as $language) : ?>
						<p><img src="view/image/flags/<?php echo $language['image']; ?>" title="<?php echo $language['name']; ?>" /> <?php echo $language['name']; ?></p>
						<textarea class="mega-content-editor" name="content_submenu[][<?php echo $language['language_id']; ?>]" style="width: 695px; height: 213px;"><?php if(isset($content[$language['language_id']])) echo html_entity_decode(html_entity_decode($content[$language['language_id']]));?></textarea>
					<?php endforeach;?>
				</div>
				<?php else : ?>
				<div class="sub-menu-content" style="display:none">
					<div>
						<p class="input-item"><label>Num of Columns : </label>
							<select class="form-control" name="columns[]">
								<option value="1" <?php if($value['columns']==1) echo "selected='selected'";?>>1</option>
								<option value="2" <?php if($value['columns']==2) echo "selected='selected'";?>>2</option>
								<option value="3" <?php if($value['columns']==3) echo "selected='selected'";?>>3</option>
								<option value="4" <?php if($value['columns']==4) echo "selected='selected'";?>>4</option>
							</select>
						</p>
						<p class="input-item"><label>Width(Input number only) : </label>
							<div class="input-group">
								<input class="form-control" name="widths[]" type="text" value="<?php echo $value['widths'] ; ?>"/>
								<div class="input-group-addon">Px</div>
							</div>
						</p>
					</div>
					<p><strong>Content of Sub-menu : </strong></p>
					<?php foreach($languages as $language) : ?>
						<p><img src="view/image/flags/<?php echo $language['image']; ?>" title="<?php echo $language['name']; ?>" /> <?php echo $language['name']; ?></p>
						<textarea class="mega-content-editor" name="content_submenu[][<?php echo $language['language_id']; ?>]" style="width: 695px; height: 213px;"><?php if(isset($content[$language['language_id']])) echo html_entity_decode(html_entity_decode($content[$language['language_id']]));?></textarea>
					<?php endforeach;?>
				</div>
				<?php endif;?>
			</div><a href="javascript:void(0);" class="explane" onclick="explane(this)">Explane</a>
			<?php
				$this->model_module_pro_megamenu->getMenuHtml($value['id']);
			?>
		</li>
		<?php
		endforeach ;
		if($parent_id!=0) echo "</ol>";
		endif;
	}
	public function getlist() {

      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "pro_megamenu  WHERE " . DB_PREFIX . "pro_megamenu.parent_id = '0' ORDER BY " . DB_PREFIX . "pro_megamenu.id ASC");
	  $result=array();
	  foreach ($query->rows as $value) {
				$result[] = $value;
	  }	
	  return $result;		
	}
    public function install() {
		$query = $this->db->query("CREATE TABLE IF NOT EXISTS ".DB_PREFIX."pro_megamenu
		(
			id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
			title VARCHAR(225) NOT NULL,
			url VARCHAR(128) NOT NULL,
			parent_id INTEGER(128) NOT NULL DEFAULT 0,
			subcontent TEXT NOT NULL,
			type VARCHAR(128) NOT NULL,
			type_id INTEGER(128) ,
			widths INTEGER,
			columns INTEGER,
			activemega INTEGER
		) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci");
		$query = $this->db->query("CREATE TABLE IF NOT EXISTS ".DB_PREFIX."pro_megamenu_options
		(
			id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
			name VARCHAR(225) NOT NULL,
			value TEXT NOT NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci");
		foreach ($this->preData as $key => $value) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "pro_megamenu_options WHERE name = '" . $key . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "pro_megamenu_options SET name = '" . $key . "', value = '" . $this->db->escape($value) . "'");
		}
	}
}
?>

 

Link to comment
Share on other sites


Нет, вы неверно поняли, екранировать надо строку, а запрос отправлять тоже надо, поэтому $this->db->query(...) Must HAVE!

$this->db->escape($title)

Подставлять вместо этого куска

mysqli_real_escape_string($title)

И вместо этого

htmlspecialchars_decode($content)

Зачем вам конвертация туда-сюда HTML сущостей, пусть < остается в бд как &lt;

 

Тоесть, для защиты от SQL-инъекций перед записью в ДБ Используйте "$this->db->escape($string)" $string - ваша строка

  • +1 1
Link to comment
Share on other sites

1 час назад, Eldaeron сказал:

Нет, вы неверно поняли, екранировать надо строку, а запрос отправлять тоже надо, поэтому $this->db->query(...) Must HAVE!


$this->db->escape($title)

Подставлять вместо этого куска


mysqli_real_escape_string($title)

И вместо этого


htmlspecialchars_decode($content)

Зачем вам конвертация туда-сюда HTML сущостей, пусть < остается в бд как &lt;

 

Тоесть, для защиты от SQL-инъекций перед записью в ДБ Используйте "$this->db->escape($string)" $string - ваша строка

 

 

Спасибо, ошибка пропала, только теперь кириллица в базу не сохраняется. Как исправить?

Edited by fofa
Link to comment
Share on other sites


29 минут назад, fofa сказал:

 

 

Спасибо, ошибка пропала, только теперь кириллица в базу не сохраняется. Как исправить?

 

Возможно, из-за этой конвертации:

$value[1] = iconv("utf-8", "windows-1251", $value[1]);
$title = array_map("htmlspecialchars", $value);
$title[1] = iconv("windows-1251", "utf-8", $title[1]);

Хотя нужно смотреть, подключить xdebug.

 

Посмотрите ище эту тему: 

 

  • +1 1
Link to comment
Share on other sites

55 минут назад, Eldaeron сказал:

 

Возможно, из-за этой конвертации:


$value[1] = iconv("utf-8", "windows-1251", $value[1]);
$title = array_map("htmlspecialchars", $value);
$title[1] = iconv("windows-1251", "utf-8", $title[1]);

 

 

Спасибо за посдказку. Причина была в несовпадении кодировки вводимой строки с кодировкой с базы.

Поменял местами входящую и выходящую кодировку тут

$value[1] = iconv("utf-8", "windows-1251", $value[1]);

на 

$value[1] = iconv("windows-1251", "utf-8", $value[1]);

и заработало

Edited by fofa
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.