我正在编写一个将输入json数据转换为sql语句的导出工具。
这个工具是(并且不应该)知道数据库连接,它应该只输出一个可以与其他工具一起使用的.sql进行实际导入。
大多数mysqli-> *和PDO相关的函数都依赖于开放连接(以确定像characterset这样的东西)。有什么好办法可以解决这个问题?
答案 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
}