Magic quote and mysql_real_escape_string
这里是原始代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | if (($handle = fopen($source_file,"r")) !== FALSE) { $columns = fgetcsv($handle, $max_line_length,","); foreach ($columns as &$column) { $column = str_replace(".","",$column); } while (($data = fgetcsv($handle, $max_line_length,",")) !== FALSE) { while(count($data) < count($columns)) { array_push($data, NULL); } $c = count($data); for($i = 0; $i < $c; $i++) { $data[$i] ="'{$data[$i]}'"; } $sql[] = '(' . implode(',', $data) .", '" . $_POST['custgroup'] ."'," . $_POST['user_id'] . ')'; } $query ="INSERT INTO $target_table (" . implode(',', $columns) . ',custgroup,user_id) VALUES ' . implode(',', $sql); //mysql_query($query) or trigger_error(mysql_error()); echo $query; fclose($handle); } |
但是一旦我添加了 mysql_real_escape_string:
1 2 |
查询将变为:
我检查了我的 php.ini 和 get_magic_quotes_gpc(),魔术报价被禁用了。
magic_quotes_gpc = 关闭
magic_quotes_runtime = 关闭
magic_quotes_sybase = 关闭
应该是什么问题?或者我应该只应用 stripslashes()?但我认为它只会在启用魔术引号时使用。
您应该遵循以下原则:
-
对所有字符串值使用
mysql_real_escape_string - 将所有中间人转换为 (int)
- 之后应用周围的单引号( ' )
mysql_real_escape_string 的目的是转义测试内容中的特殊字符,因此使用带斜线可以消除它。
解决这个问题的另一种方法是查看
请记住,这样做的全部目的是防止 SQL 注入并采取相应措施 :)