【问题标题】:Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined'致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [HY093]:无效的参数号:未定义参数”
【发布时间】:2017-07-06 05:22:00
【问题描述】:

首先:对不起,我知道,这个问题已经被问了一百万次了。而且我知道这是一个人为错误,我可能在某个地方错过了一个 bindStatement。你能帮我找到吗?


我在使用 PDO 和准备好的语句时遇到以下问题。

致命错误:未捕获的异常“PDOException”和消息“SQLSTATE[HY093]:无效的参数编号:绑定变量的数量与 /home/midelive/public_html/creapizza/model/temaHelper.php 中的令牌数量不匹配”: 64 堆栈跟踪:#0

这是错误信息。它发生在同一个类上的两种方法上,这让我发疯了

代码 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 搜索以检查我没有拼错任何一个,但什么也没找到。

【问题讨论】:

  • PDO中不需要绑定参数。只需将它们作为数组传递给PDOStatement::execute()
  • sprintf 是不必要的,但不会造成任何伤害,除非您传递一个看起来像 %d 之类的格式说明符的字符串。最好还是删除它。

标签: php mysql pdo bindparam


【解决方案1】:

错误信息很清楚原因:绑定变量的数量与标记的数量不匹配。那就是您的令牌太少或太多。

当仔细查看第一个代码 sn-p 时,您会发现您错过了 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)"));

很容易错过,尤其是查询有点长。

【讨论】:

  • 谢谢!,解决了第一个问题! ...我试图在第二个错误上找到类似的错误(冒号 (:) 错位或使用分号 (;),但我还没有找到。¿我还缺少什么?
【解决方案2】:

如果您无法使命名参数匹配,请使用位置占位符。至少要发现错误,您只需计算问号即可。

【讨论】:

  • 最终这样做了。使用太多的标记很容易错过一些拼写错误
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多