2017-03-06 68 views
0
<?php 
require_once 'functions.php'; 
try{ 
    $stmt=$connection->prepare(" 
    SELECT ACT_ID, NAME, COST, DESCRIPTION, EXTRA_DETAILS, REFID,IMAGE 
    FROM ACTIVITIES 
    WHERE ACT_ID = ? 
    "); 
    $stmt->bind_param("i",$_GET['id']); 
    $stmt->execute(); 
    $result=$stmt->get_result(); 
    $actData=getAllData($result); 

    if (isset($_SESSION["user_id"]) && $_SESSION["user_id"] != ""){ 

     $stmt=$connection->prepare(" 
     SELECT id 
     FROM google_users 
     WHERE id=? AND gender IS NOT NULL 
     "); 
     $stmt->bind_param("i",$_SESSION['user_id']); 
     $stmt->execute(); 
     if ($stmt->fetch()){ 
     $actData[0]["HAS_USER_INFO"]=TRUE; 
     } 

     //PROBLEM STATEMENT1############################## 
     $stmt=$connection->prepare("   
     SELECT `REG_ID` 
     FROM `ACTIVITY_REGISTRATION` 
     WHERE `USER_ID` = ? AND `ACTIVITY` =? 
     "); 
     $stmt->bind_param("ii",$_SESSION['user_id'],$_GET['id']); 
     $stmt->execute(); 
     if ($stmt->fetch()) { 
     $actData[0]["REGISTERED"]=TRUE; 
     } 
    } 

    //PROBLEM STATEMENT2#########################3 
    $stmt=$connection->prepare("   
     SELECT O.`COST`, O.`DESCRIPTION`, O.`OPTION_ID` 
     FROM `ACTIVITIES` A, `ADD_OPTIONS` O 
     WHERE `ACT_REF` = `REFID` AND `ACT_REF` = ? 
    "); 
    $stmt->bind_param("s",$actData[0]["REFID"]); 
    $stmt->execute(); 
    $result=$stmt->get_result(); 
    $opData=getAllData($result); 
    }catch(Exception $e){ 
     echo $e->getMessage(); 
    } 

    $stmt->close(); 
?> 

我已經越來越致命錯誤運行正常被拋出一個致命錯誤:調用布爾成員函數bind_param()上的「問題語句2」爲什麼當陳述自己

我已經完成:

1)檢查SQL的錯誤:我運行它在phpmyadmin以及在PHP(自己)有和沒有``引號,並沒有任何問題陳述的錯誤。我也嘗試將它們減少到非簡單的SELECT *語句而沒有綁定,它仍然失敗。

2)分配的唯一變量,而不是覆蓋$語句:錯誤

3)沒有變化檢查列名,數據類型和限制的話:他們都檢查出

4)檢查界變量的值:它們都存在

我發現了什麼:

奇怪的是,如果我刪除問題語句1,問題的聲明2將運行沒有錯誤,同樣的,如果我除去對ROBLEM STATEMENT2代碼的其餘部分功能正常,如果我在代碼中交換他們的位置,錯誤總是會發送到前導語句。

有誰知道爲什麼會發生這種情況?

+1

基於其他線程,使用'$ db-> errorInfo()'和'$ db-> errorCode()'來獲得錯誤原因。 – Swellar

+0

mysqli(在我的情況下爲$ connection) - > errno和error分別在失敗點返回0和「」 –

回答

0

解決方案在這裏找到:MySQLi failing to prepare a statement

聲明報價:

you probably bumped into the problem that you can't create an other statement while there are still results/result sets pending for the previous statement. see http://docs.php.net/mysqli-stmt.close :

關閉的發言,並打開一個新的解決了這個問題。對於任何可能遇到此問題的人來說,一個好的做法可能不是一個接一個地運行過多的準備好的語句,而是爲處理它自己的執行和關閉的每個語句創建一個函數。這應該防止潛在的結果集結。