PHP PDO准备删除。为什么这会失败?

时间:2011-12-27 03:14:21

标签: php mysql pdo prepared-statement

我正在尝试通过ajax响应执行一小段代码。我有ID传递,但由于某种原因我的删除语句失败(不删除记录,因此添加到$ 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
    }
?>

UPDATE 我已经改变了db错误模式,可以显示它。所以它必须与我的数据库的设计方式有关。

  

致命错误:未捕获的异常'PDOException'   消息'SQLSTATE [23000]:完整性约束违规:1451不能   删除或更新父行:外键约束失败   (loginthrives,CONSTRAINT thrives_ibfk_1外键(n_emp)   参考文献employeesID))'in   /Applications/XAMPP/xamppfiles/htdocs/jen/maintabs/Employees/delete.php:23   堆栈跟踪:   #0 /Applications/XAMPP/xamppfiles/htdocs/jen/maintabs/Employees/delete.php(23):   PDOStatement-&GT;执行()    /Applications/XAMPP/xamppfiles/htdocs/jen/maintabs/Employees/delete.php 中抛出#1 {main}   在线 23

2 个答案:

答案 0 :(得分:6)

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

...

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

is_numeric返回布尔值$id的值为truefalse,而不是数字。

答案 1 :(得分:4)

我认为你的问题就在这一行:

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

is_numeric将返回一个bool。我想你想要使用像 intval (int)$_POST['id']这样的东西。 (编辑:@zerkms正确指出显式强制转换优于intval()。在这种情况下,它们在功能上相同,但是the cast is faster.