我正在使用php代码进行系统处理,但是使用SQL的删除功能无效。我不知道它为什么会发生。
以下是我的代码:
function deleteEmployee($params)
{
$tid = $_SESSION['tmid'];
$data = array();
//print_R($_POST);die;
$sql = "delete from `cusinfo` WHERE TICKET_ID='".$params["id"]."' AND AGENT_CODE_STAFF_ID IN (SELECT id FROM `users` where tm_groupid = '$tid')";
echo $result = mysqli_query($this->conn, $sql) or die("error to delete employee data");
}
答案 0 :(得分:1)
echo $result = mysqli_query($this->conn, $sql) or die("error to delete employee data");
在上面的行中,您是执行查询,echo
它。但如果没有执行,你就是echo
你自己的消息。这样可以防止您收到实际的错误消息。如果您要从TICKET_ID
删除的行不能存在,则无法看到它,您只能看到自己的消息"error to delete employee data"
。
解决这个问题:
echo mysqli_error($this->conn);
这会给你连接错误。
或者:
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if ($result) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $conn->error;
}
许多功能必须处理这些错误。 stackoverflow question,php manual和this。
答案 1 :(得分:1)
问题可能在echo $result = mysqli_query($this->conn, $sql) or die("error to delete employee data");
正如我在一篇评论中所说,用mysqli_error($ this-> conn)替换die
字符串应该会显示错误。
然而,经过一些测试,我发现在回声中分配变量可能会产生奇怪的结果,我测试echo $test = "hello" or die("test");
并发现屏幕上没有显示hello
和test
,显示1
,这可能是布尔值true。
查看查询是否已执行的更好方法可能是:
//other code that stayed the same
$statement = mysqli_prepare($this->conn, "delete from `cusinfo` WHERE TICKET_ID=? AND AGENT_CODE_STAFF_ID IN (SELECT id FROM `users` where tm_groupid = ?)");
$statement = mysqli_stmt_bind_param($this->conn, $params['id'], $tid); //
$sql = msyqli_stmt_execute($statement); // returns either true or false
if ($sql === true) {
echo "Successfull"; // executing successfull code
}
else {
var_dump(mysqli_stmt_error_list($statement)); // handling error
die;
}
这会以预期的方式处理一些sql错误(它们被'转储并死掉')。
使用预准备语句正确的方法意味着可以停止大多数sql注入,并且使用DELETE查询,您需要确保停止sql注入。
注意:我不是sql注射的专家 注2:虽然我会使用PDO作为准备好的陈述,但在我看来,使用PDO更合乎逻辑