在我建立的工人班次监控/会计系统中,有一个删除员工的选项。这样可以正常工作,但我想将已删除的工作人员的班次存档。
我调查了它,似乎最好的方法是在删除之前将我的班次表更新到另一个表中。我通过另一个Stack Overflow post查找了如何执行此操作但是我收到了错误:fatal error call to member function on a non-object
。
基于我能找到的内容,当您尝试传递空值时会导致此错误,这让我感到困惑,因为我尝试传递的值是GET并且在我测试它时工作正常。 / p>
$sql = "
UPDATE table_archive
SET table_shift.shift_date = table_archive.shift_date,
table_shift.start_time = table_archive.start_time,
table_shift.end_time = table_archive.end_time,
table_shift.total_hours = table_archive.total_hours,
table_shift.rate_of_pay = table_archive.rate_of_pay,
table_shift.uniqueid = table_archive.uniqueid,
table_shift.addedBy = table_archive.addedBy,
table_shift.paidRate = table_archive.paidRate,
table_shift.totalPaid = table_archive.totalPaid
FROM table_shift, table_archive
WHERE table_shift.uniqueid = ?
";
$stmt = $connection->prepare($sql);
$deleteid = htmlentities($_GET['id']);
$stmt->bind_param('s', $deleteid);
$stmt->execute();
我不知道为什么这不会通过,GET不能是一个空值,因为我正在使用的测试删除传递相同的变量并且工作正常。 mysqli_query($connection,"DELETE FROM table_staff WHERE uniqueid='$deleteid'")
可能是我错误地使用了SQL代码,或者我忘记了一些愚蠢的事情,但这让我很难过。如果没有修复此代码,欢迎任何其他有关如何实现预期功能的建议。
答案 0 :(得分:1)
你不能更新。你的语法错了。
相反,请使用:
INSERT INTO table_archive
SELECT * FROM table_shift WHERE table_shift.uniqueid = ?
答案 1 :(得分:0)
bindParam的使用是否正确?
如果您使用?
,它应如下所示:
SELECT ...
WHERE column_name = ?
$sth->bindParam(1, $value_in_php, PDO::PARAM_INT);
如果不是?
,:param_name
请使用此项:
SELECT ...
WHERE column_name = :param
$sth->bindParam(':param', $value_in_php, PDO::PARAM_INT);
您的错误听起来不像是SQL错误,而是PHP错误。
如果要更新table_archive
表,则SQL看起来不正确。它应该是这样的:
UPDATE table_archive
SET table_archive.shift_date = table_shift.shift_date
, to_table_that_should_be_updated = from_table_with_value_to_update
FROM table_shift
WHERE table_shift.uniqueid = ?