Php PDO查询未插入-HY093错误消息,但绑定变量数正确 代码 输出 概述
Php PDO查询未插入-HY093错误消息,但绑定变量数正确 代码 输出 概述,php,mysql,pdo,Php,Mysql,Pdo,$fullStmt是一个值数组,我有一个查询,如下所示: Array ( [competition_code] => EN_PR [competition_id] => 8 [competition_name] => English Barclays Premier League [season_id] => 2013 [season_name] => Season 2013/2014 [timestamp] =>
$fullStmt
是一个值数组,我有一个查询,如下所示:
Array
(
[competition_code] => EN_PR
[competition_id] => 8
[competition_name] => English Barclays Premier League
[season_id] => 2013
[season_name] => Season 2013/2014
[timestamp] => 2013-10-30 09-03-49
[uid] => g695281
[last_modified] => 2013-10-15T12:35:58+00:00
[matchday] => 1
[period] => FullTime
[matchwinner] => t7
[date] => 2013-08-17 15:00:00 BST
[team1] => t3
[team1_halfscore] => 1
[team1_score] => 1
[team1_goals] => p44346/#/Goal
[team1_side] => Home
[team2] => t7
[team2_halfscore] => 1
[team2_score] => 3
[team2_goals] => p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty
[team2_side] => Away
)
Array
(
[0] => HY093
[1] =>
[2] =>
)
INSERT INTO `fixtures` (competition_code,competition_id,competition_name,season_id,season_name,
timestamp,uid,last_modified,matchday,period,matchwinner,date,team1,team1_halfscore,team1_score,team1_goals,
team1_side,team2,team2_halfscore,team2_score,team2_goals,team2_side) VALUES ('EN_PR', '8', 'English Barclays Premier League', '2013', 'Season 2013/2014', '2013-10-30 09-03-49', 'g695281', '2013-10-15T12:35:58+00:00', '1', 'FullTime', 't7', '2013-08-17 15:00:00 BST', 't3', '1', '1', 'p44346/#/Goal', 'Home', 't7', '1', '3', 'p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty', 'Away');
但是,当尝试执行时,它返回FALSE
。我输出结果查询,当直接将其插入phpMyAdmin时,它将成功插入
为什么当我在phpMyAdmin的SQL字段中运行代码时,而不是在PHP中执行时,它会毫无问题地插入?在我自己测试之前,我不确定PDO中的这种行为,但是由于
$fullStmt
中的值数组是一个关联数组,PDO实际上正在尝试根据其数组键绑定命名参数。您最初准备的语句使用位置占位符?
,因此命名参数不存在(并且不能与?
混合)
因此,您需要消除PDO的数组键,以便将数组值与其位置占位符正确绑定。当数组被传递到execute()
时,通过调用数组最容易做到这一点
请注意,PDO对数组顺序的正确解释取决于其值的顺序是否完全正确。无论以何种方式生成的
$fullStmt
数组的顺序都是正确的。但是,如果该过程发生更改,则去掉数组键可能会导致INSERT
语句将值放入错误的列中。可能值得努力重构语句生成,以便在值()
列表中使用命名参数,如:competition\u code
,并继续使用关联数组来防止此潜在的触发点。您设置了警告-您是否有错误报告(E\u ALL)代码>立即打开并显示错误
?我很好奇,在尝试prepare()
以了解语句是否首先成功准备之后,是否在execute()
之前填充了errorInfo()
。在prepare()
之后检查errorInfo()
(或者暂时打开ERRMODE\u异常
,这样如果失败,代码永远不会超过prepare()
)@MichaelBerkowski打开提供的PHP错误:PDOStatement::execute():SQLSTATE[HY093]:无效参数编号:未定义指向execute()
函数的参数。现在还不清楚哪个参数没有绑定,因为它在phpMyAdmin中工作正常,我找不到任何未绑定的参数?如果我记得,当使用?
占位符而不是命名占位符时,PDO会自动丢弃execute()
中的数组键,但如果不是这样,您也应该尝试执行(数组值($fullStmt))
在绑定之前去掉关联键。这很有效-将其设置为答案,我会接受。干杯!是的,我也测试了它,以发现这是PDO的行为。答案即将出现。实际上,如果此数组的顺序发生变化,即在HTML中移动一个字段,您可能会试图将数据放在错误的列中。我会建议t动态生成列列表和数据列表,这样以后就不会被发现。@riggsfully我同意这一评估。我将为此添加一个注释。@riggsfully在这种情况下,数据是从其他几个数组动态创建的-它们将始终按此顺序排列,无论值是填充的、空的还是空的,b但是你提出了一个很好的观点。@BenPearlKahan他们将永远按照这个顺序来讲述著名的溺水者的遗言。泰坦尼克号是不会沉没的。埃斯勒的工作是什么?修改代码???@BenPearlKahan没有侵略性,只是试图传递多年来被假设绊倒的经验。在改变之前的几天/几个月/几年呃,当时,就是宾在那里,做出了不正确的假设,付出了代价,双脚都被射过,不止一次。
Array
(
[competition_code] => EN_PR
[competition_id] => 8
[competition_name] => English Barclays Premier League
[season_id] => 2013
[season_name] => Season 2013/2014
[timestamp] => 2013-10-30 09-03-49
[uid] => g695281
[last_modified] => 2013-10-15T12:35:58+00:00
[matchday] => 1
[period] => FullTime
[matchwinner] => t7
[date] => 2013-08-17 15:00:00 BST
[team1] => t3
[team1_halfscore] => 1
[team1_score] => 1
[team1_goals] => p44346/#/Goal
[team1_side] => Home
[team2] => t7
[team2_halfscore] => 1
[team2_score] => 3
[team2_goals] => p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty
[team2_side] => Away
)
Array
(
[0] => HY093
[1] =>
[2] =>
)
INSERT INTO `fixtures` (competition_code,competition_id,competition_name,season_id,season_name,
timestamp,uid,last_modified,matchday,period,matchwinner,date,team1,team1_halfscore,team1_score,team1_goals,
team1_side,team2,team2_halfscore,team2_score,team2_goals,team2_side) VALUES ('EN_PR', '8', 'English Barclays Premier League', '2013', 'Season 2013/2014', '2013-10-30 09-03-49', 'g695281', '2013-10-15T12:35:58+00:00', '1', 'FullTime', 't7', '2013-08-17 15:00:00 BST', 't3', '1', '1', 'p44346/#/Goal', 'Home', 't7', '1', '3', 'p54861/#/Goal//p83564/#/Goal//p54861/#/Penalty', 'Away');
$query = "INSERT INTO `fixtures` (
competition_code,
competition_id,
competition_name,
season_id,
season_name,
timestamp,
uid,
last_modified,
matchday,
period,
matchwinner,
date,
team1,
team1_halfscore,
team1_score,
team1_goals,
team1_side,
team2,
team2_halfscore,
team2_score,
team2_goals,
team2_side
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
// Strip off the associative array keys...
if(!$stmt->execute(array_values($fullStmt))) {
// etc
}