我正在编写一个程序,它将通过URL接收值,然后将一个条目添加到MySQL数据库,删除它或者如果其他人已经预订了该插槽,那么它将不允许您删除它。
添加和删除功能如下:
function addBooking($id, $desk, $member, $date){
global $dbconn;
$query = $dbconn -> prepare("INSERT INTO booked (booking_id, desk_id, member_id, date_booked) VALUES (?,?,?,?)");
$query -> bind_param("iiis", $id, $desk, $member, $date);
$query->execute();
print '<div class="yours" title="Your Booking">Your Booking</div>';
$query -> close();
}
function delBooking($id, $desk){
global $dbconn;
$query = $dbconn -> prepare("DELETE FROM booked WHERE booking_id = ? AND desk_id = ?");
$query -> bind_param("ii", $id, $desk);
$query->execute();
print '<div class="free" title="Click To Book">Not Booked</div>';
$query -> close();
}
调用它们的代码就是:
$query = $dbconn -> prepare("SELECT firstname, lastname, booked.member_id, date_booked FROM members, booked WHERE (members.member_id = booked.member_id) AND booking_id = ? AND desk_id=?");
$query -> bind_param("ss", $booking_id, $desk_id);
if($query->execute() == true) {
$query -> bind_result($fname, $lname, $memid, $dbooked);
$query -> fetch();
if($fname){
if ($memid == $member_id)
{
delBooking($booking_id,$desk_id);
}
else
{
print '<div class="taken" title="Booked by <strong>'.$fname.' '.$lname.'</strong><br>On '.$dbooked.'">Booked</div>';
}
}else{
addBooking($booking_id,$desk_id,$member_id,$date);
}
}
它会增加预订罚款并且还会告诉您其他人是否已经预订好了,但是如果您在自己的预订中再次运行它会给您错误:
Fatal error: Call to a member function bind_param() on a non-object in /var/www/new/functions/functions.php on line 80
我不确定为什么。这不是我的删除语句或任何东西,因为我可以将addBooking函数重命名为delBooking,所以它是相同的工作代码,它仍然给我完全相同的错误:/
答案 0 :(得分:3)
使用mysqli时,不能同时在单个连接上激活多个预准备语句。通过激活我的意思是通过至少调用它的execute()一次将其发送到服务器。您可以准备尽可能多的未使用语句,但一次只能执行一个。完成后,您需要在执行另一个语句之前关闭该语句。在调用delBooking()之前,请关闭先前的语句:
$query->fetch();
$query->close();
if($memid == $member_id){
delBooking(....);