[Codeigniter-users] SQLのエスケープ処理について

Back to archive index

Kenji Suzuki kenji****@gmail*****
2011年 7月 1日 (金) 13:42:23 JST


Kenji です。


On Fri, 1 Jul 2011 13:15:12 +0900
lain_gmail <masao****@gmail*****> wrote:

> ガレリアといいます。
> 
> SQLでのエスケープでまだ理解できていない部分があるのですが
> 
> *$this->db->escape()*
>> mysql_real_escape_string()
> 
> は同等の処理と考えていいのでしょうか?*

データベースドライバが mysql であるなら、部分的にはそうですね。
http://codeigniter.jp/user_guide_ja/database/queries.html


実際には、以下のようなコードになっています。

system/database/DB_driver.php:

	/**
	 * "Smart" Escape String
	 *
	 * Escapes data based on type
	 * Sets boolean and null types
	 *
	 * @access	public
	 * @param	string
	 * @return	mixed
	 */
	function escape($str)
	{
		if (is_string($str))
		{
			$str = "'".$this->escape_str($str)."'";
		}
		elseif (is_bool($str))
		{
			$str = ($str === FALSE) ? 0 : 1;
		}
		elseif (is_null($str))
		{
			$str = 'NULL';
		}

		return $str;
	}


system/database/drivers/mysql/mysql_driver.php:

	/**
	 * Escape String
	 *
	 * @access	public
	 * @param	string
	 * @param	bool	whether or not the string will be used in a LIKE condition
	 * @return	string
	 */
	function escape_str($str, $like = FALSE)
	{
		if (is_array($str))
		{
			foreach ($str as $key => $val)
	  		{
				$str[$key] = $this->escape_str($val, $like);
	  		}

	  		return $str;
	  	}

		if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
		{
			$str = mysql_real_escape_string($str, $this->conn_id);
		}
		elseif (function_exists('mysql_escape_string'))
		{
			$str = mysql_escape_string($str);
		}
		else
		{
			$str = addslashes($str);
		}

		// escape LIKE condition wildcards
		if ($like === TRUE)
		{
			$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
		}

		return $str;
	}


// Kenji




Codeigniter-users メーリングリストの案内
Back to archive index