Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'
首先:对不起,我知道,这个问题已经被问了一百万次了。我知道这是一个人为错误,我可能在某处遗漏了一个 bindStatement。你能帮我找到吗?
我在使用 PDO 和准备好的语句时遇到以下问题。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/midelive/public_html/creapizza/model/temaHelper.php:64 Stack trace: #0
这是错误信息。它发生在同一个 class 上的两种方法上,这让我抓狂
代码 N1:
public function create(tema $t, $idUser){
$pdo_options[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION; ///username, Pass, DB
$conn= new PDO($this->connection,$this->admin,$this->pass,$pdo_options);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$tipo=$t->tipo;
$nombreEmpresa=$t->titulo;
$logo=$t->logo;
$subtitulo=$t->subtitulo;
$simbolo1=$t->simbolo1;
$simbolo2=$t->simbolo2;
$simbolo3=$t->simbolo3;
$texto1=$t->txt1;
$texto2=$t->txt2;
$texto3=$t->txt3;
$linkSitio=$t->link;
$linkFacebook=$t->linkfb;
$descripcion=$t->descripcion;
$stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
$stmt->bindParam(':idUsuario', $idUser);
$stmt->bindParam(':tipoTema', $tipo);
$stmt->bindParam(':nombreEmpresa',$nombreEmpresa);
$stmt->bindParam(':logo',$logo);
$stmt->bindParam(':subtitulo', $subtitulo);
$stmt->bindParam(':simbolo1',$simbolo1);
$stmt->bindParam(':simbolo2',$simbolo2);
$stmt->bindParam(':simbolo3',$simbolo3);
$stmt->bindParam(':texto1',$texto1);
$stmt->bindParam(':texto2',$texto2);
$stmt->bindParam(':texto3',$texto3);
$stmt->bindParam(':linkFacebook',$linkFacebook);
$stmt->bindParam(':Descripcion',$descripcion);
$stmt->execute();
$statement=$conn->query("SELECT LAST_INSERT_ID()");
$lastID=$statement->fetch(PDO::FETCH_NUM);
return $lastID[0];
}
代码 N2:
public function create(tema $t, $idUser){
$pdo_options[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION; ///username, Pass, DB
$conn= new PDO($this->connection,$this->admin,$this->pass,$pdo_options);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$tipo=$t->tipo;
$nombreEmpresa=$t->titulo;
$logo=$t->logo;
$subtitulo=$t->subtitulo;
$simbolo1=$t->simbolo1;
$simbolo2=$t->simbolo2;
$simbolo3=$t->simbolo3;
$texto1=$t->txt1;
$texto2=$t->txt2;
$texto3=$t->txt3;
$linkSitio=$t->link;
$linkFacebook=$t->linkfb;
$descripcion=$t->descripcion;
$stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo, subtitulo,simbolo1, simbolo2, simbolo3,
texto1, texto2, texto3, linkFacebook, Descripcion) VALUES (:idUsuario , :tipoTema , :nombreEmpresa , :logo , :subtitulo ,
:simbolo1 , :simbolo2 , :simbolo3 , :texto1 , :texto2 , :texto3 , :linkFacebook , :Descripcion)"));
$stmt->bindParam(':idUsuario', $idUser);
$stmt->bindParam(':tipoTema', $tipo);
$stmt->bindParam(':nombreEmpresa',$nombreEmpresa);
$stmt->bindParam(':logo',$logo);
$stmt->bindParam(':subtitulo', $subtitulo);
$stmt->bindParam(':simbolo1',$simbolo1);
$stmt->bindParam(':simbolo2',$simbolo2);
$stmt->bindParam(':simbolo3',$simbolo3);
$stmt->bindParam(':texto1',$texto1);
$stmt->bindParam(':texto2',$texto2);
$stmt->bindParam(':texto3',$texto3);
$stmt->bindParam(':linkFacebook',$linkFacebook);
$stmt->bindParam(':Descripcion',$descripcion);
$stmt->execute();
$statement=$conn->query("SELECT LAST_INSERT_ID()");
$lastID=$statement->fetch(PDO::FETCH_NUM);
return $lastID[0];
}
我一遍又一遍地计算语句和查询,有点发疯了。我做了 ctrl+F 搜索以检查我没有拼错任何一个,但什么也没找到。
报错信息很清楚原因:绑定变量个数与token个数不匹配。那就是你的代币太少或太多。
当仔细查看第一个代码片段时,您会发现您错过了 simbolo2
前面的冒号 (:
),因此一个标记太少了。所以而不是
stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
你应该把
stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, :simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
很容易遗漏,尤其是查询有点长。
如果您无法使命名参数匹配,请使用位置占位符。至少要发现错误,您只需要数问号即可。
首先:对不起,我知道,这个问题已经被问了一百万次了。我知道这是一个人为错误,我可能在某处遗漏了一个 bindStatement。你能帮我找到吗?
我在使用 PDO 和准备好的语句时遇到以下问题。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/midelive/public_html/creapizza/model/temaHelper.php:64 Stack trace: #0
这是错误信息。它发生在同一个 class 上的两种方法上,这让我抓狂
代码 N1:
public function create(tema $t, $idUser){
$pdo_options[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION; ///username, Pass, DB
$conn= new PDO($this->connection,$this->admin,$this->pass,$pdo_options);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$tipo=$t->tipo;
$nombreEmpresa=$t->titulo;
$logo=$t->logo;
$subtitulo=$t->subtitulo;
$simbolo1=$t->simbolo1;
$simbolo2=$t->simbolo2;
$simbolo3=$t->simbolo3;
$texto1=$t->txt1;
$texto2=$t->txt2;
$texto3=$t->txt3;
$linkSitio=$t->link;
$linkFacebook=$t->linkfb;
$descripcion=$t->descripcion;
$stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
$stmt->bindParam(':idUsuario', $idUser);
$stmt->bindParam(':tipoTema', $tipo);
$stmt->bindParam(':nombreEmpresa',$nombreEmpresa);
$stmt->bindParam(':logo',$logo);
$stmt->bindParam(':subtitulo', $subtitulo);
$stmt->bindParam(':simbolo1',$simbolo1);
$stmt->bindParam(':simbolo2',$simbolo2);
$stmt->bindParam(':simbolo3',$simbolo3);
$stmt->bindParam(':texto1',$texto1);
$stmt->bindParam(':texto2',$texto2);
$stmt->bindParam(':texto3',$texto3);
$stmt->bindParam(':linkFacebook',$linkFacebook);
$stmt->bindParam(':Descripcion',$descripcion);
$stmt->execute();
$statement=$conn->query("SELECT LAST_INSERT_ID()");
$lastID=$statement->fetch(PDO::FETCH_NUM);
return $lastID[0];
}
代码 N2:
public function create(tema $t, $idUser){
$pdo_options[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION; ///username, Pass, DB
$conn= new PDO($this->connection,$this->admin,$this->pass,$pdo_options);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$tipo=$t->tipo;
$nombreEmpresa=$t->titulo;
$logo=$t->logo;
$subtitulo=$t->subtitulo;
$simbolo1=$t->simbolo1;
$simbolo2=$t->simbolo2;
$simbolo3=$t->simbolo3;
$texto1=$t->txt1;
$texto2=$t->txt2;
$texto3=$t->txt3;
$linkSitio=$t->link;
$linkFacebook=$t->linkfb;
$descripcion=$t->descripcion;
$stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo, subtitulo,simbolo1, simbolo2, simbolo3,
texto1, texto2, texto3, linkFacebook, Descripcion) VALUES (:idUsuario , :tipoTema , :nombreEmpresa , :logo , :subtitulo ,
:simbolo1 , :simbolo2 , :simbolo3 , :texto1 , :texto2 , :texto3 , :linkFacebook , :Descripcion)"));
$stmt->bindParam(':idUsuario', $idUser);
$stmt->bindParam(':tipoTema', $tipo);
$stmt->bindParam(':nombreEmpresa',$nombreEmpresa);
$stmt->bindParam(':logo',$logo);
$stmt->bindParam(':subtitulo', $subtitulo);
$stmt->bindParam(':simbolo1',$simbolo1);
$stmt->bindParam(':simbolo2',$simbolo2);
$stmt->bindParam(':simbolo3',$simbolo3);
$stmt->bindParam(':texto1',$texto1);
$stmt->bindParam(':texto2',$texto2);
$stmt->bindParam(':texto3',$texto3);
$stmt->bindParam(':linkFacebook',$linkFacebook);
$stmt->bindParam(':Descripcion',$descripcion);
$stmt->execute();
$statement=$conn->query("SELECT LAST_INSERT_ID()");
$lastID=$statement->fetch(PDO::FETCH_NUM);
return $lastID[0];
}
我一遍又一遍地计算语句和查询,有点发疯了。我做了 ctrl+F 搜索以检查我没有拼错任何一个,但什么也没找到。
报错信息很清楚原因:绑定变量个数与token个数不匹配。那就是你的代币太少或太多。
当仔细查看第一个代码片段时,您会发现您错过了 simbolo2
前面的冒号 (:
),因此一个标记太少了。所以而不是
stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
你应该把
stmt=$conn->prepare(sprintf("INSERT INTO tema (idUsuario, tipoTema, nombreEmpresa, logo,
subtitulo,simbolo1, simbolo2, simbolo3, texto1, texto2, texto3, linkFacebook, Descripcion)
VALUES (:idUsuario,:tipoTema,:nombreEmpresa,:logo,:subtitulo, :simbolo1, :simbolo2, :simbolo3,
:texto1, :texto2, :texto3,:linkFacebook,:Descripcion)"));
很容易遗漏,尤其是查询有点长。
如果您无法使命名参数匹配,请使用位置占位符。至少要发现错误,您只需要数问号即可。