PHP PDO подготовил удаление. Почему это не удается?

У меня есть небольшой фрагмент кода, который я пытаюсь выполнить с помощью ответа ajax. У меня есть идентификатор, но по какой-то причине мой оператор удаления не работает (не удаляет запись, поэтому добавляется в массив $ err). Я уверен, что это что-то глупое, но сейчас это не прыгает на меня.

КОД PHP

<?php
define('INCLUDE_CHECK',true);

require '../../connect.php';
require '../../functions.php';
// Those two files can be included only if INCLUDE_CHECK is defined
// sets site to require https
echo redirectToHTTPS();
session_name('tzLogin');
session_set_cookie_params(2*7*24*60*60);
session_start();



if (isset($_POST['id']) && $_SESSION['id'] && $_SESSION['permlvl']==3 )
{
    $id = is_numeric($_POST['id']);
    $err = array();
            $query = "DELETE FROM employees WHERE id = :id";
            $statement = $db -> prepare($query);
            $statement -> BindParam('id', $id, PDO::PARAM_INT);
            $result = $statement -> execute();
            $statement -> closecursor();
            if ($result === true){
            }
                else{
                    $err[] = "error";
            }
}   
//check for error messages
if(!count($err))
{
   echo 'success';
}
    else{
        //on failure, future will include logging either by sending email or writing to a log file
    }
?>

ОБНОВЛЕНИЕ Я изменил режим ошибки БД и могу его отобразить. Так что это должно быть связано с тем, как спроектирована моя база данных.

Неустранимая ошибка: неперехваченное исключение 'PDOException' с сообщением 'SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (_2 _._ 3_, CONSTRAINT thrives_ibfk_1 FOREIGN KEY (n_emp) ССЫЛКИ employees (ID)) 'в /Applications/XAMPP/xamppfiles/htdocs/jen/maintabs/Employees/delete.php:23 Трассировка стека: # 0 / Applications / XAMPP / xamppfiles / htdocs / jen / maintabs / Employees /delete.php(23): PDOStatement- ›execute () # 1 {main} добавлен в /Applications/XAMPP/xamppfiles/htdocs/jen/maintabs/Employees/delete.php в строке 23


person atrueresistance    schedule 27.12.2011    source источник
comment
Что значит fails? Только 6 строк представленного кода относятся к проблеме, остальные не имеют смысла для вопроса   -  person zerkms    schedule 27.12.2011
comment
Не делайте этого: $db -> prepare(), пробелы глупые и, возможно, сбивают с толку. Просто: $db->prepare(). (В основном.)   -  person Jared Farrish    schedule 27.12.2011
comment
Строки связаны, потому что, если подготовленный оператор не работает, он добавляется в массив $ err. Если оператор выполняется успешно без ошибок, «успех» передается в ajax html var.   -  person atrueresistance    schedule 27.12.2011
comment
@atrueresistance: нам нужен echo redirectToHTTPS() ?? Нам нужен if (isset($_POST['id']) && $_SESSION['id'] && $_SESSION['permlvl']==3 ) ?? Просто удалите все бессмысленные строки и дайте нам определение fail. Мы понятия не имеем, в чем вы застряли. Вот как обрабатывать ошибки с помощью PDO: php.net/manual/en/pdo .errorinfo.php   -  person zerkms    schedule 27.12.2011
comment
Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails --- это недостаточно информативно?   -  person zerkms    schedule 27.12.2011


Ответы (2)


Думаю, ваша проблема в этой строке:

$id = is_numeric($_POST['id']);

is_numeric вернет логическое значение. Я думаю, что вы хотите использовать вместо этого что-то вроде intval (int)$_POST['id']. (Изменить: @zerkms правильно указывает, что явное приведение лучше, чем intval(). В этом случае они эквивалентны по функциональности, но приведение выполняется быстрее.)

person AgentConundrum    schedule 27.12.2011
comment
@atrueresistance - Что в этом ответе было более привлекательным, чем ответ обмана? Ссылка intval? - person Jared Farrish; 27.12.2011
comment
@ Джаред Фарриш: очевидно, меньше слов для чтения. Читать скучно ;-) - person zerkms; 27.12.2011
comment
@atrueresistance Я согласен с Джаредом. Я подумал об удалении этого ответа, когда увидел, что этот обман сильно меня избил, но оставил его, потому что подумал, что intval может дать некоторый дополнительный контекст. - person AgentConundrum; 27.12.2011
comment
@zerkms - deceze на самом деле короче. :o - person Jared Farrish; 27.12.2011
comment
@zerkms Краткость - это то, в чем меня редко обвиняют. - person AgentConundrum; 27.12.2011
comment
@AgentConundrum - Без обид, мне просто было интересно, почему один ответ, за который проголосовали, был полностью передан другому, который почти идентичен. - person Jared Farrish; 27.12.2011
comment
@AgentConundrum: на самом деле (int) каст лучше, чем intval() - person zerkms; 27.12.2011
comment
@JaredFarrish Ничего не найдено. Как я уже сказал, я подумал об удалении ответа, когда увидел ответ deceze. - person AgentConundrum; 27.12.2011
comment
@zerkms По иронии судьбы, мой ответ был запоздалым именно потому, что я обсуждал, на какой из двух ссылаться. В конце концов я решил, что в данном случае они эквивалентны, но, очевидно, (int) быстрее, так что ... да. Ой. - person AgentConundrum; 27.12.2011

$id = is_numeric($_POST['id']);

...

$statement -> BindParam('id', $id, PDO::PARAM_INT);

is_numeric возвращает логическое. Значение $id - true или false, а не число.

person deceze♦    schedule 27.12.2011
comment
Значение $id в этот момент - true или false, а не число. - person Jared Farrish; 27.12.2011
comment
Конечно, но поскольку другого использования _1 _... нет :) - person deceze♦; 27.12.2011
comment
Да, только мой собственный комментарий. :) - person Jared Farrish; 27.12.2011