MySQL、XML 布尔值和整数:不正确的整数值:

Posted

技术标签:

【中文标题】MySQL、XML 布尔值和整数:不正确的整数值:【英文标题】:MySQL, XML boolean values, and integers: Incorrect integer value: 【发布时间】:2012-11-04 03:22:08 【问题描述】:

我正在从 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 类型进行了测试,一切正常。

在插入 db 之前,如果不通过正则表达式进行搜索和替换,我可以做些什么吗?

编辑:

    $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')";

【问题讨论】:

不清楚问题出在哪里,因为您不知道您从 xml 数据生成了什么 SQL 插入语句。我最初的猜测是您尝试将 TRUE 作为文字插入,它等于整数值 1。但如果是这种情况,它应该可以正常工作,即使您将其粘贴到 varchar 列中也是如此。所以我现在认为您正在尝试将“TRUE”(带引号的字符串)插入整数列。如需更好的帮助,请发布更好的信息(INSERT 语句) 抱歉,已编辑原始帖子以显示查询,谢谢 我不明白这个NOT NULL default '0' 不是'0'的默认值是假的,'true'应该返回为1吗?..这就是我从我所读到的理解它 【参考方案1】:

您遇到的错误是告诉您 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.如果您不太关心 null 或错误值来检测它们,您可以试试这个。

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 注入。

【讨论】:

首先感谢您的宝贵时间。 A点返回此错误“Bad data was either ##353## or ####”,注意引用LeafCategory的空字符串,数值是CategoryID,xml仅包含使用的节点并且可以不同对于每个类别,我还得到“错误数据是 ##96766## 或 ##true##”,其中包含叶类别并包含“真”的单词值。删除 NOT NULL 仍然有相同的结果,这就是为什么我在想也许我必须使用正则表达式循环并在插入之前将 'true' 更改为 '1'。 C点和D点都失败了。 我知道注入风险和对 mysqli_real_escape_string 的需求,但在我这样做之前,我想让代码工作,当涉及到 MySQL 时,我非常绿色,需要让我的代码在我之前轻松运行开始迷惑自己在不工作的代码中添加更多代码, 优秀的 Ollie,这是一种享受,当然让我免于使用 regxp,你的方式似乎更干净.. 已标记为已回答.. 非常感谢

以上是关于MySQL、XML 布尔值和整数:不正确的整数值:的主要内容,如果未能解决你的问题,请参考以下文章

获取 DatabaseError [SequelizeDatabaseError],不正确的整数值

对于整数为整数且允许为空的MySQL列,错误的整数值''

MYSQL 触发器:JSON_SEARCH 整数 json 数组中的整数值

不正确的整数值:''对于第1行的列'id'

类型值和变量

不断收到此错误-不正确的整数值:第 1 行的列 'poi_id' 的'')[关闭]