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, он показывает запрос с подставленными переменными
Из-за чего может быть?
<?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;
?>