2017-02-16 41 views
-4

第一:對不起,我知道,這個問題已經被問了萬次。而且我知道這是一個人爲錯誤,我可能在一行中丟失了一個bindStatement。你能幫我找到它嗎?致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [HY093]:無效的參數號:參數沒有被定義的」


我對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

這是錯誤信息。它發生於在同一類兩種方法,它的駕駛我堅果

代碼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搜索來檢查,我沒有任何拼寫錯誤的那些,但一無所獲。

+2

您不需要在PDO中綁定參數。只是將它們作爲一個數組'PDOStatement對象::執行()'' – miken32

+0

是sprintf'不必要的,但除非你傳遞一個字符串,它看起來像一個格式說明,比如'%D'什麼的,不會造成任何傷害。無論如何,最好將其刪除。 – miken32

回答

-2

如果你不能管理,使命名參數匹配,去的位置的佔位符。至少要發現一個錯誤,你只需要計數問號。

+0

結束了做這個有太多manyt令牌。?。它太容易錯過一些錯誤 –

1

錯誤消息爲理由很清楚:綁定變量的數量不匹配的令牌數量。那是你要麼太少或太多的標記。

當仔細觀察第一個代碼片段時,您會看到您錯過了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)")); 

很容易錯過,尤其是因爲查詢是有點長。

+0

謝謝!,解決了第一個問題! ...即時通訊試圖找到第二個類似的錯誤(錯位的冒號(:)或使用分號(;),但還沒有II發現一個¿別的東西我在想念 –

相關問題