@yourfriendyorick

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'ID' at row 1. Как решить ошибку?

Во время обновления данных, через сайт выдаёт ошибку: Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'ID' at row 1 in E:\Ampps\www\Kursach\app\database\db.php:119 Stack trace: #0 E:\Ampps\www\Kursach\app\database\db.php(119): PDOStatement->execute() #1 E:\Ampps\www\Kursach\app\controllers\Gener.php(62): update() #2 E:\Ampps\www\Kursach\admin\categories\edit.php(3): include('E:\\Ampps\\www\\Ku...') #3 {main} thrown in E:\Ampps\www\Kursach\app\database\db.php on line 119

Вот код для Обновления:
function update($table, $id, $params){
    global $pdo;

    $i = 0;
    $str = '';
    foreach ($params as $key => $value) {
        if ($i === 0){
            $str = $str . $key . " = '" . $value . "'";
        } else {
            $str = $str .", " . $key . " = '" . $value . "'";
        }
        $i++;
    }

    $sql = "UPDATE $table SET $str WHERE `ID` = ". $id;
    $query = $pdo->prepare($sql);
    $query -> execute($params);

    dbCheckErr($query);
}


// Update
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id'])) {
    $ID = $_GET['id'];
    $Gener = selectOne('geners', ['ID' => $ID]);
    $ID = $Gener['ID'];
    $Name = $Gener['Name'];
    $Description = $Gener['Description'];
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['GnrUpdt'])) {
//    tt($_POST);
    $Name = trim($_POST['GnrName']);
    $Description = trim($_POST['GnrDescription']);

    if ($Name === '' || $Description === '') {
        $stmMsg = "Не все поля заполнены!";
    } elseif (mb_strlen($Name, 'utf8') < 2) {
        $stmMsg = "Название жанра должно быть более двух символов!";
    } else {
        $Gener = [
            'ID' => $ID,
            'Name' => $Name,
            'Description' => $Description
        ];
        $ID = $_POST['ID'];
        $GnrID = update('geners', $ID, $Gener);
        header('location: ' . BASE_URL . 'admin/categories/index.php');
    }
}
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
На момент формирования массива $Gener переменная $ID не определена. Да и вообще колонка ID не должна присутствовать в изменяемых полях.
А вообще, код на выброс. В нём нет защиты от инъекций. Передаём в $_POST['ID'] строку '0 or 1 = 1' и меняем сразу все записи в таблице.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
1) Читаем текст ошибки
2) В меру способностей переводим, в случае клинического английского пользуемся онлайн переводчиками.
3) Сравниваем текст ошибки с реальной ситуацией в коде, находим 10 отличий от желаемого
4) Чиним
5) Профит, пиво, радость, дофамин...
Подходит для всех ошибок, не только для этой конкретной...

Так же рекомендуется:
Проверять данные перед вставкой/апдейтом, например тупо проверив что пришло в $_GET/$_POST
Использовать подготовленные выражения, так как сейчас у вас там дыра в безопасности (ну хоть что-то в безопасности)) )
По возможности изучить стандарты нейминга и PSR в целом.

ЗЫ: делать препэйр и при этом вставлять данные прям строкой - особый вид искусства...
ЗЫ2:
1) Видна попытка сделать нормальные подготовленные выражения, но так как учились плохо, то и получилось плохо... В цикле надо задать не значения из массива, а плейсхолдеры, после чего передать соответствующий массив.
2) mb_strlen($Name, 'utf8') - кодировка называется UTF-8.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы