1

我数了数,检查了逗号,并再次检查了整个过程,但我仍然找不到导致此错误的原因。它告诉我,我正在尝试输入比我给出的列名更多的信息,但我有 29 列和 29 个值。我可以看到没有缺少的逗号。

有人可以看看这个,看看我是否遗漏了什么?

$query = <<<EOD

insert into roster

 (conference, regtime, participanttype_id, category_id, title, 

  firstname, lastname, badgename, jobtitle, department, 

  organization, address1, address2, address3, city, 

  state, country, postal, email, phone, 

  fax, paytype, feedue, f01, yn01, 

  yn02, yn03, yn04, other) 

 values 

 ('event1023', now(), $sfund_partictype_id, $sfund_category_id, '$title', 

 '$firstname', '$lastname', '$badgename', '$jobtitle', '$deptname', 

 '$organization', '$address1', '$address2', '$address3', '$city', 

 '$state', '$country', '$postal', '$email', '$phone', 

 '$fax', '$paytype', $feedue, '$wedsession', '$yn01', 

 '$yn02', '$yn03', '$yn04', '$other')

  EOD;

ETA:我把这个分开是因为过去对我帖子的批评表明我应该这样做。但在我的代码中不是这样。

ETA #2:这是奇怪的事情。这些值完美地进入数据库。但它仍然返回这个(并且也让我意识到 EEK 我的代码正在显示确切的错误,所以顺便说一句,是的,我会在它上线之前修复它):

查询失败:

insert into roster 

(conference, regtime, participanttype_id, category_id, title, 
firstname, lastname, badgename, jobtitle, department, 
organization, address1, address2, address3, city, 
state, country, postal, email, phone, 
fax, paytype, feedue, f01, yn01, 
yn02, yn03, yn04, other) 

values 

('event1023', now(), 3, 14, 'Ms',
'Jane','Smith','Jane Smith', 'Developer', 'my dept',
'my organization', 'my address', '','','my city',
'NC','United States','55555','me@email.edu','555-555-5555',
'', 'CHECK', 225, '2', '1',
'0', '1', '0', 'n/a')

Column count doesn't match value count at row 1

4

4 回答 4

2

这个问题几乎可以肯定是由于缺少变量转义。我建议有两点:

首先,确保任何可能包含单引号的内容都已通过转义函数运行,或者除此之外,每一个都加倍。不过,我认为这不会导致您的问题,因为有人必须在一个值中准确地具有“','”。

如果 $feedue 中有逗号,则更有可能。这会将值分成两个数字,所以它仍然有效——只是不是你想要的。您的数据库应该自动将字符串转换为数字(但反之亦然),因此最简单的尝试就是在该值周围加上引号。

于 2012-06-19T13:27:36.573 回答
1

您是否检查过任何字符串值中都有 ' (引号)?这将是它..

即 $postal 的值包含一个 ' 这将结束它并让它认为有一个新的值,或者像 O'Neil 这样的姓氏......等等

换句话说......使用 PDO 验证字符串值(无论如何,你应该使用这个我的 ysql_/mysqli_ 命令已经过时并且可能导致各种错误代码和不安全代码)或至少 mysql_real_escape_string 或任何确保单引号的方法不在值中:)

于 2012-06-19T13:22:40.090 回答
0

原始答案:

您在查询文本中包含“不安全”字符串。在赋值之后打印 $query 的内容。到时候你就会看到问题了。

考虑 $query 的内容,例如:

$title = "Courage','Fear";

我建议您使用该mysql_real_escape_string函数来避免 SQL 注入。


编辑:根据 OP 提供的进一步信息

OP 报告 SQL 文本中提供的字符串已正确转义,并且 OP 提供了生成的示例查询文本。

OP报告代码执行后,发现该行已插入数据库。所以,我们可以很确定抛出异常的不是这个语句。它必须是其他一些陈述。

OP 还报告说,在他向表中添加列之前,这是有效的。

鉴于您添加到问题中的 SQL 文本,我运行了一个测试,它对我来说运行得很好。

所以,我很确定这不是您在此处显示的 INSERT 语句,而是引发异常的一些 OTHER 语句。你碰巧AFTER INSERT在这张桌子上有一个触发器吗?

于 2012-06-19T13:27:55.643 回答
0

我本周的教训:去检查 IT 以确保在更全球化的基础上没有发生其他事情……不要只是假设你的代码不正确。

感谢所有试图帮助我解决这个问题的人——下次我会打电话给 IT 人员,而不是花很长时间进行故障排除。

于 2012-06-27T13:23:10.103 回答