将行插入mysql时忽略错误和不匹配类型

时间:2012-03-18 17:33:22

标签: php mysql

MYSQL TABLE

我有一个如上所述的MySQL数据库,除了UID之外,所有Null都设置为Yes。数据将从调查中收集,并且当所有条目都符合MySQL定义的“类型”时,它将起作用。

虽然这是一个问题,但有时用户可能会输入一些不符合标准的内容,例如:“年龄中的用户输入varchar(4)而不是int(3)”。

现在发生的事情是,由于单个错误而不会插入整行。我想做的是有办法,这样只会忽略年龄的条目。我认为将Null设置为Yes可以解决问题,但显然它不能。请帮助:)

2 个答案:

答案 0 :(得分:3)

ALLOW NULL并不意味着“如果无效,则插入NULL”。您应该在插入之前验证数据。

插入时可以使用IGNORE关键字:

INSERT IGNORE INTO tbl

提供以下功能:

  

如果发生错误,将触发错误的数据转换会中止语句   未指定IGNORE。使用IGNORE时,无效值将调整为   最接近的值并插入;警告产生但是   声明不会中止。您可以使用mysql_info()C来确定   API函数实际插入表中的行数。

因此数据转换错误不会中止,但约束错误将像重复的唯一键或主键一样中止。

答案 1 :(得分:0)

在大多数情况下,您应该自己验证数据,以确保它是正确的类型,如果输入的内容无效,可能会向用户提供错误消息。使用简单函数is_numeric($age)查看年龄是否为有效数字。如果是,您可以继续使用$age = intval($age)来阻止某些智能手机进入18.1667岁。如果$ age不是数字,您可以手动将其设置为null,然后以这种方式将其输入数据库。

稍微快一点的方法就是将代码(int)$age作为插入查询的一部分。但是,将字符串转换为int会给出0,对于某些字段,0也可能是有效的响应!所以不要这样做。