2

我正在从 ebay 抓取 xml 数据并将结果放入 MySQL,抓取数据工作正常,但是由于几个 xml 标记值的整数值不正确,输入到数据库失败。

xml 标记值是单词“true”(不带引号),这是 db sql:

CREATE TABLE ebay_categories (
CategoryID int(10) NOT NULL default '0',
CategoryLevel int(5) NOT NULL default '0',
CategoryName varchar(120) NOT NULL default '',
CategoryParentID int(10) NOT NULL default '0',
LeafCategory int(1) NOT NULL default '0',
AutoPayEnabled int(1) NOT NULL default '0',
Expired int(1) NOT NULL default '0',
IntlAutosFixedCat int(1) NOT NULL default '0',
Virtual int(1) NOT NULL default '0',
LSD int(1) NOT NULL default '0',
ORPA int(1) NOT NULL default '0',
PRIMARY KEY  (CategoryID),
KEY catlevel (CategoryLevel),
KEY parent (CategoryParentID),
KEY ape (AutoPayEnabled),
KEY expired (Expired),
KEY IAFC (IntlAutosFixedCat),
KEY virtual (Virtual),
KEY lsd (LSD),
KEY orpa (ORPA),
KEY leaf (LeafCategory)
) TYPE=MyISAM; 

我尝试过 int、tinyint、Boolean(诉诸 tinyint)无济于事,但仍然遇到这个问题。数据库连接没有任何问题,因为我使用 varchar 作为 LeafCategory 和其他的 int 类型进行了测试,一切正常。

在插入数据库之前,我可以做些什么而不通过正则表达式进行搜索和替换?

编辑:

    $query = "INSERT INTO `ebay_categories` (`CategoryID`, `LeafCategory`)VALUES           ('$xmlCategoryID', '$xmlLeafCategory')";

    if (mysqli_query($link, $query)) {
    echo "Successfully inserted " . mysqli_affected_rows($link) . " row";
} else {
    echo "Error occurred: " . mysqli_error($link);
}

从客户端代码展开的 SQL 语句是:

    INSERT INTO `ebay_categories` 
                (`CategoryID`, `LeafCategory`)
         VALUES 
                ('$xmlCategoryID', '$xmlLeafCategory')";
4

1 回答 1

2

您遇到的错误是告诉您 XML 中的至少一条记录除了 $xmlCategoryID 或 $xmlLeafCategory 的有效整数之外还有其他内容。

该怎么办?

A. 您可以让错误消息显示有问题的数据,如下所示:

  echo "Error occurred: " . mysqli_error($link);
  echo "Bad data was either ##$xmlCategoryID## or ##$xmlLeafCategory##.";

请注意,我使用了##$value##,因此您可以检测错误消息中的空字符串。你可能应该这样做。

B. 您可以尝试更改这些列的列定义以删除 NOT NULL 声明。如果实际上这些值之一为空,这可能会解决您的问题。

C. 您可能需要bigint此信息的值。也就是说,它们可能是非常大的数字。

D. 如果您对空值或错误值不够关心而无法检测它们,您可以试试这个。

INSERT INTO `ebay_categories` 
             (`CategoryID`, `LeafCategory`)
      VALUES 
             (CAST(IFNULL('$xmlCategoryID',-1) AS INT)
            (CAST(IFNULL('$xmlLeafCategory',-1) AS INT)

这会将空值转换为 -1,将非整数值转换为 0。

编辑:哦,我现在明白了。您的 leafCategory 项目不是 XML 中的数字,而是真/假/空值。大概 false 和 empty 是同一个意思。

试试这个,使用 SQL case 语句将 true/other 转换为 1/0。

INSERT INTO `ebay_categories` 
             (`CategoryID`, `LeafCategory`)
      VALUES (
              '$xmlCategoryID',
              CASE '$xmlLeafCategory' WHEN 'true' THEN 1 ELSE 0 END
              )

最后,危险!您需要使用准备好的语句,并且需要清理从 XML 文件中提取的这些值。如果您不这样做,那么有人将能够通过向您的软件提供有毒的 XML 文件来欺骗您的软件破坏您的数据库。请阅读 SQL 注入。

于 2012-11-15T14:28:14.843 回答