将数据导出为.sql格式。怎么逃避?

时间:2011-04-17 20:50:34

标签: php mysql sql sqlite escaping

我正在编写一个将输入json数据转换为sql语句的导出工具。

这个工具是(并且不应该)知道数据库连接,它应该只输出一个可以与其他工具一起使用的.sql进行实际导入。

大多数mysqli-> *和PDO相关的函数都依赖于开放连接(以确定像characterset这样的东西)。有什么好办法可以解决这个问题?

4 个答案:

答案 0 :(得分:2)

MySQL函数为了转义字符串而需要连接的原因是所有mysql_real_escape_string()都会调用MySQL的内置转义函数。

但是,如果您阅读the manual page for it,您会看到他们确实列出了转义的字符:

  

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,该函数将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

您不想使用addslashes(),因为它只会逃避几个字符,并且不会提供安全的解决方案。但您应该能够使用给定的字符列表重新实现mysql_real_escape_string()完成的转义,只需简单调用strtr()或类似内容:

$replacements = array("\x00"=>'\x00',
                      "\n"=>'\n',
                      "\r"=>'\r',
                      "\\"=>'\\\\',
                      "'"=>"\'",
                      '"'=>'\"',
                      "\x1a"=>'\x1a');
$escaped = strtr($unescaped,$replacements);

答案 1 :(得分:0)

对于转义,mysql_real_escape_string函数是此任务的常用选项,但它确实需要连接。另一种选择是addslashes

我会检查一个使用所需参数(字符集,删除表等)定制的mysqldump文件,并从那里作为起点。

答案 2 :(得分:0)

@stefgosselin: mysql_real_escape_string确实需要连接。

我会以最小阻力去排队。意味着使用系统调用来执行mysqldumper> TMPFILE

答案 3 :(得分:0)

只是一个想法,你的应用程序可能生成和sql像

INSERT INTO table1 (id, name) VALUES (?, ?);

并将sql的一组参数作为数组传递

$parms = array('value1', 'value2');

然后让你的应用程序中做数据库工作的部分在那时进行转义

function writeToDb($sql, $parms) {
// do escaping here
}