Po pierwsze: Nie wiem, to pytanie zostało zadane na milion razy. I wiem, że jest to błąd ludzki, że prawdopodobnie brakuje ich wiązania gdzieś w dół linii. Czy możesz mi pomóc?


Mam następujący problem z PDO i przygotowanymi wypowiedziami.

Fatal Error: Niepudiony Wyjątek "PDOException" z wiadomością "Sqlstate [HY093]: Nieprawidłowy numer parametru: Liczba zmiennych związanych nie pasuje do liczby tokenów" in /home/midelive/public_html/creapizza/model/temahelper.php:64 ślad stosu : # 0.

To jest komunikat o błędzie. Dzieje się to dla dwóch metod na tej samej klasie, a jego napędza mnie orzechami

Kod 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];
}

Kod 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];
}

Idę do szalonego liczącym i nad wypowiedziami i zapytaniem. Zrobiłem ctrl + f szukaj, aby sprawdzić, czy nie znalazłem żadnego z tych, ale nic nie znalazł.

-4
Bruno Gutierrez 17 luty 2017, 00:36

2 odpowiedzi

Najlepsza odpowiedź

Jeśli nie możesz udać się, aby wymyślić nazwane parametry, przejdź do pozycyjnych symboli zastępczych. Przynajmniej na to, aby uzyskać błąd, musisz liczyć tylko znaki zapytania.

-2
Your Common Sense 16 luty 2017, 21:53

Komunikat o błędzie jest dość wyraźny o powodzie: liczba zmiennych związanych nie pasuje do liczby żetonów. To ty albo masz za mało lub za dużo żetonów.

Patrząc bliżej na fragment pierwszego kodu, zobaczysz, że przegapiłeś okrężnicę (:) przed simbolo2, ma zatem jeden token zbyt mało. Więc zamiast

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)"));

Powinieneś umieścić

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)"));

Dość łatwe do pominięcia, zwłaszcza, że zapytanie jest nieco dłużej.

1
Striezel 16 luty 2017, 21:47