另一组眼睛:列计数与第 1 行的值计数不匹配


Another set of eyes: Column count doesn't match value count at row 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:我之所以这样间隔开来,是因为过去对我的帖子的批评表明我应该这样做。不过,在我的代码中并非如此。

预计到达时间#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

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

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

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

您是否检查过任何字符串值中是否包含 '(引号)? 这种情况就这样。.

即$postal的值包含一个 ' 这将结束它并让它认为有一个新的值,或者一个姓氏,比如,奥尼尔......等等

等等

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

原始答案:

您在查询文本中包含"不安全"字符串。在分配后打印$query的内容。 那时你会看到问题。

在以下情况下考虑$query的内容:

$title = "Courage','Fear";

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


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

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

OP 报告在执行代码后,发现该行已插入到数据库中。因此,我们可以非常确定不是这个语句抛出了异常。它一定是其他一些陈述。

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

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

所以,我很确定不是你在这里显示的 INSERT 语句,而是抛出异常的其他语句。你碰巧在这张桌子上有AFTER INSERT触发器吗?

我本周的课程是:去与 IT 部门核实,以确保在更全球化的基础上没有其他事情发生......不要只是假设你的代码不正确。

谢谢大家试图帮助我解决这个问题 - 下次我会打电话给 IT 人员,而不是长时间进行故障排除。