Ошибка PDO: неверный номер параметра: параметр не определен

Я пытаюсь использовать простой запрос на вставку MySQL с параметрами в виде массива. Он продолжает говорить мне, что количество параметров неверно. Я пробовал следующее, все выдавало ту же ошибку:

$stmt3 = $link->prepare('INSERT INTO messages VALUES(null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

и

$stmt3 = $link->prepare('INSERT INTO messages VALUES(:null, :room, :name, :message, :time, :color)');
$stmt3->execute(array(':null' => null, ':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

а также объявление столбцов специально, чтобы избежать нулевой вставки:

$stmt3 = $link->prepare('INSERT INTO messages (room, name, message, time, color) VALUES(:room, :name, :message, :time, :color)');
$stmt3->execute(array(':room' => $Clean['room'],':name' => $Clean['name'],':message' => $Clean['message'],':time' => $time,':color:' => $Clean['color']));

Это мой первый раз, когда я использую PDO (обычно я использую mysqli, но мой текущий общий хост не имеет подключаемого модуля mysqlnd, что не позволяет мне использовать prepare(), поэтому любое понимание с этой точки зрения приветствуется.


person Morgan    schedule 15.06.2012    source источник


Ответы (2)


Проблема - и вы себя пинайте - с :color.

Ключ массива для значения, которое вы передаете для этого маркера при вызове execute(), называется :color:. Удалите конечный : (в любом случае я предполагаю, что это была просто опечатка).

$stmt3->execute(array(
    ':room' => $Clean['room'],
    ':name' => $Clean['name'],
    ':message' => $Clean['message'],
    ':time' => $time,
    ':color' => $Clean['color'],
    ));
person DaveRandom    schedule 15.06.2012
comment
О МОЙ БОГ. Я ненавижу себя прямо сейчас. Не могу поверить, что смотрел на это полтора часа и не видел... - person Morgan; 15.06.2012
comment
Это заняло у меня пару минут. Иногда вам просто нужен свежий взгляд, для этого мы здесь ;-) - person DaveRandom; 15.06.2012
comment
хехехе +1 за свежий взгляд! Хороший улов, Дэйв - person Adi; 15.06.2012
comment
@ Дэйв, ты совершенно прав. Я был слишком сосредоточен на этом, чтобы поймать что-то настолько маленькое. Большое спасибо! - person Morgan; 15.06.2012
comment
Просто мои 5 центов. У меня была такая же проблема с этой общей ошибкой. Нашел решение почти через 1 час в соглашении об именах. В именах параметров не должно быть дефиса (-). После удаления дефисов все работает как положено! - person metamagikum; 06.11.2013

Я могу ошибаться здесь, но, насколько я знаю, вам нужно сделать это:

$stmt3->bindParam(':room', $Clean['room']);
$stmt3->bindParam(':name', $Clean['name']);
//and so on

Но как личное предпочтение, я всегда делал это так

$stmt3 = $link->prepare('INSERT INTO messages VALUES(null, ?, ?, ?, ?, ?)');
$stmt3->execute(array($Clean['room'], $Clean['name'], $Clean['message'], $time, $Clean['color']))
person Adi    schedule 15.06.2012
comment
Это необязательный способ сделать это, согласно php.net/manual/en. /pdostatement.execute.php метод массива, который я использую, должен работать. - person Morgan; 15.06.2012
comment
Ваш второй пример - это то, как я делал это с mysqli, но мне бы очень хотелось сделать это так для удобочитаемости, и я так увлечен ошибкой, что мне действительно хотелось бы знать, что ее вызывает сейчас. - person Morgan; 15.06.2012