2017-02-16 3 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 :: execute()' – miken32

+0

'sprintf' не нужно, но не наносит никакого вреда, если вы не передадите строку, которая выглядит как спецификатор формата, например'% d' или что-то еще. Лучше всего его удалить. – miken32

ответ

-2

Если вам не удается совместить именованные параметры, перейдите к позиционным заполнителям. По крайней мере, чтобы обнаружить ошибку, вам нужно будет только подсчитать вопросительные знаки.

+0

Закончено, делая это. С слишком большим количеством токенов его слишком легко упустить некоторые ошибки –

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

спасибо !, что решил первый! ... im пытается найти похожую ошибку на втором (неправильно установленный двоеточие (:) или используя точку с запятой (;), но ii havent found. ¿Что-то еще не пропало? –

Смежные вопросы

 Смежные вопросы