データベースMySQL関数(エンコード・エスケープ)
- mysql_client_encoding〔文字セット名を取得〕
- mysql_escape_string〔文字列をエスケープ〕
- mysql_real_escape_string〔SQL文中で用いる文字列の特殊文字をエスケープする〕
mysql_client_encoding
文字セット名を取得
unknown
string mysql_client_encoding ( [ resource 接続ID ] )
MySQLのデフォルトの文字セット名(character_set)を返します。
オプションの第1引数接続IDが指定されていない場合は、mysql_connect()関数により直近に開かれた接続が使用されます。 接続が確立されていない場合は、引数を指定せずmysql_connect()関数がコールされた時と同様に接続を確立します。 それでも接続が確立できない場合は、E_WARNINGレベルのエラーが発生します。
<?
$dbc=mysql_connect('localhost', 'root', '') or die("MySQL接続失敗 :".mysql_error());
/* 文字セット名取得 */
$charset=mysql_client_encoding($dbc);
echo $charset."<br>"; //latin1
?>
mysql_escape_string
文字列をエスケープ
unknown
string mysql_escape_string ( string $エスケープされる文字列 )
SQL文中の特殊文字ををエスケープし、クエリ(mysql_query()関数)で使用できる形式に変換します。
<?
/* SQL文をエスケープ */
$sql = "SELECT * FROM tbl_customer WHERE status LIKE '%aaa%' or status = 'd\"あ#d'";
echo $sql."<br>\n";
echo mysql_escape_string($sql)."<br>\n";
//SELECT * FROM tblname WHERE status LIKE '%aaa%' or status = 'd"あ#d'
//SELECT * FROM tblname WHERE status LIKE \'%aaa%\' or status = \'d\"あ#d\'
?>
<?
function enc($x){
return base64_encode(serialize($x));
}
function dec($x){
return unserialize(base64_decode($x));
}
$sql = "SELECT * FROM tblname WHERE status LIKE '%aaa%' or status = 'd\"あ#d'";
$xx = enc($sql);
echo "sql=".$sql."<br>\n";
echo "enc=".$xx."<br>\n";
echo "dec=".dec($xx)."<br>\n";
//sql=SELECT * FROM tblname WHERE status LIKE '%aaa%' or status = 'd"あ#d'
//enc=czo2ODoiU0VMRUNUICogRlJPTSB0YmxuYW1lIFdIRVJFIHN0YXR1cyBMSUtFICclYWFhJScgb3Igc3RhdHVzID0gJ2QigqAjZCciOw==
//dec=SELECT * FROM tblname WHERE status LIKE '%aaa%' or status = 'd"あ#d'
?>
mysql_real_escape_string
SQL文中で用いる文字列の特殊文字をエスケープする
unknown
string mysql_real_escape_string ( string $エスケープされる文字列[, resource 接続ID ] )
エスケープされる文字列に含まれる特殊文字をエスケープし、mysql_query()関数で安全に利用できる形式に変換します。 成功した場合にエスケープ後の文字列、失敗した場合にFALSEを返します。
この関数は、\x00
、\n
、\r
、'
、"
、\x1a
の先頭にバックスラッシュを付加します(%
、_
はエスケープされません)
データの安全性確保のため、常にこの関数を使用してSQL文をエスケープしてからMySQLへクエリ送信して下さい。 SQL文中にバイナリデータが含まれる場合は必ずこの関数を使用してエスケープしなければなりません。
<?
$sql=sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password)
);
?>
オプションの第1引数接続IDが指定されていない場合は、mysql_connect()関数により直近に開かれた接続が使用されます。 接続が確立されていない場合は、引数を指定せずmysql_connect()関数がコールされた時と同様に接続を確立します。 それでも接続が確立できない場合は、E_WARNINGレベルのエラーが発生します。
<?
/* クウォート用のユーザー定義関数 */
function quote_smart($var){
/* magic_quotesが有効ならクォートされた文字列のクウォート部分を除去 */
if(get_magic_quotes_gpc()){
$var=stripslashes($var);
}
/* 数値あるいは数値形式の文字列以外をクウォート */
if(!is_numeric($var)){
$var="'".mysql_real_escape_string($val)."'";
}
return $var;
}
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
$db_select=mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
/* userとpasswordはフォームからPOST送信されてきた値とする
安全性を確保するためにこれらの値をクウォートする */
user=quote_smart($HTTP_POST_VARS['user']);
$password=quote_smart($HTTP_POST_VARS['password']);
/* SQL文をエスケープし、安全なクエリを生成 */
$sql=sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",$user,$password);
/* クエリ送信 */
$res=mysql_query($sql,$dbc) or ("クエリ失敗: ".mysql_error());
while($dat=mysql_fetch_array($res)){
/* 処理 */
}
?>