3

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 に変更できるので、delete ステートメントなどではありません。同じ作業コードであり、まったく同じエラーが発生します:/

4

1 に答える 1

3

mysqli を使用する場合、1 つの接続で同時に複数の準備済みステートメントをアクティブにすることはできません。アクティブとは、execute() を少なくとも 1 回呼び出すことによってサーバーに送信されたことを意味します。未使用のステートメントはいくつでも準備できますが、一度に実行できるのは 1 つだけです。完了したら、別のステートメントを実行する前にステートメントを閉じる必要があります。delBooking() を呼び出す前に、前のステートメントを閉じます。

$query->fetch();
$query->close();
if($memid == $member_id){
    delBooking(....);
于 2013-01-13T02:01:36.790 に答える