我已经数了数,检查了我的逗号,然后再次检查了整个事情,但我仍然找不到导致此错误的原因。它告诉我,我正在尝试输入比我给出的列名称更多的信息,但我有 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 人员,而不是长时间进行故障排除。