PHP 的 addslashes() 不适用于 MySQL 插入
PHP's addslashes() not working for MySQL insert
我正在 PHP 中编写一个导入脚本,以将表从 SQL 服务器导入 MySQL,并且我将所有 char/varchar 值包装在单个-插入报价。在脚本遇到其中包含单引号的值之前,此方法工作正常。显而易见的解决方案是使用 addslashes()
,但这对我不起作用。我也尝试了 htmlspecialchars()
和 mysqli_real_escape_string
,但都没有用。我什至尝试使用 str_replace("'", "", $value)
完全删除有问题的字符,但没有成功。最后,我尝试将值用双引号而不是单引号括起来,但是在遇到无法转义值的双引号的行时,这给了我同样的错误。
在出现错误之前,脚本成功插入了多个块,每个块有 1,000 行,所以我知道 INSERT 语句的格式没有错误。我记录了整个查询并确认单引号没有被转义,尽管我可以 运行 手动插入一个有问题的行并在必要时包含一个反斜杠。
我在这里被难住了。我是否遗漏了任何故障排除提示?
我已经检查了重复或类似的问题,但我没有发现任何适用于我的情况但我还没有尝试过的问题。如果我忽略了之前对此的回答,请告诉我。
代码如下:
// Chunk size
$Insert_Max = 1000;
// Array to hold all rows for the insert
$Insert_Rows = [];
while($row = mssql_fetch_row($result)) {
$Insert_Vals = [];
// Instead of building up a tedious string for each insert, let's do it programmatically
$offset = 0;
while ($offset < mssql_num_fields($result)) {
$field_type = mssql_field_type($result, $offset);
if (empty($row[$offset])) {
$Insert_Vals[] = "NULL";
} else {
if ($field_type == "int" || $field_type == "bit") {
$Insert_Vals[] = $row[$offset];
} else if (strpos($field_type, "char") !== false) { // Covers char, varchar, nvarchar
$Insert_Vals[] = "'" . addslashes($row[$offset]) . "'";
} else {
$Insert_Vals[] = "'" . $row[$offset] . "'";
}
}
$offset++;
}
$Insert_String = "(" . implode(",", $Insert_Vals) . ")";
$Insert_Rows[] = $Insert_String;
$count++;
if ($count >= $Insert_Max) {
// $Insert_Header = "INSERT INTO tablename (col1, etc.) VALUES "
$internal_connection_object->Perform_The_Insert($Insert_Header, $Insert_Rows);
$count = 0;
}
}
结果证明解决方案很简单:虽然 SQL 服务器上的值是 VARCHAR(255),但它以文本形式传到 MySQL。我通过将 (data type: $field_type)
附加到插入中的每个值来看到这一点。在 VARCHAR 条件中考虑 TEXT 解决了这个问题。
if ($field_type == "int" || $field_type == "bit") {
$Insert_Vals[] = $row[$offset];
} else if (strpos($field_type, "char") !== false || $field_type == "text") {
// Covers char, varchar, nvarchar, and now text
$Insert_Vals[] = "'" . addslashes($row[$offset]) . "'";
} else {
$Insert_Vals[] = "'" . $row[$offset] . "'";
}
我正在 PHP 中编写一个导入脚本,以将表从 SQL 服务器导入 MySQL,并且我将所有 char/varchar 值包装在单个-插入报价。在脚本遇到其中包含单引号的值之前,此方法工作正常。显而易见的解决方案是使用 addslashes()
,但这对我不起作用。我也尝试了 htmlspecialchars()
和 mysqli_real_escape_string
,但都没有用。我什至尝试使用 str_replace("'", "", $value)
完全删除有问题的字符,但没有成功。最后,我尝试将值用双引号而不是单引号括起来,但是在遇到无法转义值的双引号的行时,这给了我同样的错误。
在出现错误之前,脚本成功插入了多个块,每个块有 1,000 行,所以我知道 INSERT 语句的格式没有错误。我记录了整个查询并确认单引号没有被转义,尽管我可以 运行 手动插入一个有问题的行并在必要时包含一个反斜杠。
我在这里被难住了。我是否遗漏了任何故障排除提示?
我已经检查了重复或类似的问题,但我没有发现任何适用于我的情况但我还没有尝试过的问题。如果我忽略了之前对此的回答,请告诉我。
代码如下:
// Chunk size
$Insert_Max = 1000;
// Array to hold all rows for the insert
$Insert_Rows = [];
while($row = mssql_fetch_row($result)) {
$Insert_Vals = [];
// Instead of building up a tedious string for each insert, let's do it programmatically
$offset = 0;
while ($offset < mssql_num_fields($result)) {
$field_type = mssql_field_type($result, $offset);
if (empty($row[$offset])) {
$Insert_Vals[] = "NULL";
} else {
if ($field_type == "int" || $field_type == "bit") {
$Insert_Vals[] = $row[$offset];
} else if (strpos($field_type, "char") !== false) { // Covers char, varchar, nvarchar
$Insert_Vals[] = "'" . addslashes($row[$offset]) . "'";
} else {
$Insert_Vals[] = "'" . $row[$offset] . "'";
}
}
$offset++;
}
$Insert_String = "(" . implode(",", $Insert_Vals) . ")";
$Insert_Rows[] = $Insert_String;
$count++;
if ($count >= $Insert_Max) {
// $Insert_Header = "INSERT INTO tablename (col1, etc.) VALUES "
$internal_connection_object->Perform_The_Insert($Insert_Header, $Insert_Rows);
$count = 0;
}
}
结果证明解决方案很简单:虽然 SQL 服务器上的值是 VARCHAR(255),但它以文本形式传到 MySQL。我通过将 (data type: $field_type)
附加到插入中的每个值来看到这一点。在 VARCHAR 条件中考虑 TEXT 解决了这个问题。
if ($field_type == "int" || $field_type == "bit") {
$Insert_Vals[] = $row[$offset];
} else if (strpos($field_type, "char") !== false || $field_type == "text") {
// Covers char, varchar, nvarchar, and now text
$Insert_Vals[] = "'" . addslashes($row[$offset]) . "'";
} else {
$Insert_Vals[] = "'" . $row[$offset] . "'";
}