Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Не могу обновить таблицы phpmyadmin

Алеша Коволь Ученик (159), на голосовании 3 года назад
Пишет ошибку - Ошибка при обновлении записи в базе данных: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens.

Из-за чего может быть?


<?php
$db_server = "localhost";
$db_user = "root";
$db_password = "root";
$db_name = "clb";
try {

$db = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user, $db_password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
// Устанавливаем атрибут сообщений об ошибках (выбрасывать исключения).
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Переносим данные из полей формы в переменные.
$ID_equip = $_POST['ID_equip'];
$Name_equip = $_POST['Name_equip'];
$Сheck_interval_Equip = $_POST['Сheck_interval_Equip'];
$Date_repair_Equip = $_POST['Date_repair_Equip'];
$Date_rel_Equip = $_POST['Date_rel_Equip'];

// Если пользователь не указал (номер Id) какую запись будем редактировать,
// то прерываем выполнение кода.
if(empty($ID_equip)){
echo "Вы не задали ID строки для обновления данных!";
return;
}

// Составвлям массив колонок для запроса обновления.
// Если поле формы не пустое, то его значение будет добавлено в запрос.
$update_columns = array();
if(trim($Name_equip) !== "") { $update_columns[] = "Name_equip = :Name_equip"; }
if(trim($Сheck_interval_Equip) !== "") { $update_columns[] = "Сheck_interval_Equip = :Сheck_interval_Equip"; }
if(trim($Date_repair_Equip) !== "") { $update_columns[] = "Date_repair_Equip = :Date_repair_Equip"; }
if(trim($Date_rel_Equip) !== "") { $update_columns[] = "Date_rel_Equip = :Date_rel_Equip"; }

// Если есть хоть одно заполненное поле формы,
// то составляем запрос.
if(sizeof($update_columns > 0)){
// Запрос на создание записи в таблице
$sql = "UPDATE equip SET " . implode(", ", $update_columns) . " WHERE ID_equip=:ID_equip";

// Подготовка запроса.
$statement = $db->prepare($sql);

// Привязываем к псевдо переменным реальные данные,
// если они существуют (пользователь заполнил поле в форме).
$statement->bindParam(":ID_equip", $ID_equip);
if(trim($Name_equip) !== ""){
$statement->bindParam(":Name_equip", $Name_equip);
}
if(trim($Сheck_interval_Equip) !== ""){
$statement->bindParam(":Сheck_interval_Equip", $Сheck_interval_Equip);
}
if(trim($Date_repair_Equip) !== ""){
$statement->bindParam(":Date_repair_Equip", $Date_repair_Equip);
}
if(trim($Date_rel_Equip) !== ""){
$statement->bindParam(":Date_rel_Equip", $Date_rel_Equip);
}
// Выполняем запрос.
$statement->execute();

echo "Запись c ID: " . $ID_equip . " успешно обновлена!";
}
}
catch(PDOException $e) {
echo "Ошибка при обновлении записи в базе данных: " . $e->getMessage();
}
// Закрываем соединение.
$db = null;
?>
Голосование за лучший ответ
Оракул Оракул (62095) 3 года назад
Ответ в комментарии.
Вы блин вообще не гуглите перед тем как задавать вопрос?
Никто вашу портянку целиком читать не будет)
dim565 Искусственный Интеллект (424764) 3 года назад
Ошибка означает, что количество параметров в запросе не совпадает с количеством параметров, переданных через bindParam.

Я не нашел причины в коде, нужно проверять правильно ли составляется SQL-запрос.
Перед строкой
$statement = $db->prepare($sql);
Добавьте echo $sql;

Если не увидите проблемы есть более детальная отладка, которая покажет запрос с подставленными параметрами, но не знаю, сработает ли она в вашем случае (или ошибка помешает), попробуйте добавить функцию
function pdo_debugStrParams($stmt) {
ob_start();
$stmt->debugDumpParams();
$r = ob_get_contents();
ob_end_clean();
return $r;
}
Затем после
$statement->execute();
напишите
echo pdo_debugStrParams($statement);

P.S Нашел две других ошибки:
1) Незаконченная строка? $db = new PDO("mysql:host=$db_server;dbname=$db_name", $db_user,
2) Не в том месте закрыли скобку if(sizeof($update_columns > 0))
ШумахерG-7Мастер (1778) 3 года назад
UPDATE equip SET Name_equip = :Name_equip, Сheck_interval_Equip = :Сheck_interval_Equip, Date_repair_Equip = :Date_repair_Equip, Date_rel_Equip = :Date_rel_Equip WHERE ID_equip=:ID_equipОшибка при обновлении записи в базе данных: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens вот такое пишет, я думаю может Name_equip должен Equip быть?
dim565Искусственный Интеллект (424764) 3 года назад
С Name_equip все правильно, имя совпадает с полем в таблице. Тогда нужно пробовать код с debugDumpParams, он показывает запрос с подставленными переменными
Лайт Ягами Искусственный Интеллект (309890) 3 года назад
Немножко не по самому вопросу, но в PDO кодировку можно задать параметром в dsn, не нужно отдельно SET NAMES вызывать:
$db = new PDO("mysql:host=$db_server;dbname=$db_name;charset=utf8mb4", $db_user, $db_password);
Похожие вопросы