2015-04-02 32 views
0

我得到一個錯誤(這樣明顯的錯誤)

調用一個成員函數bind_param()一個非對象...

我想檢查用戶在驗證他的信息時是否提供了他的信息。如果沒有,這是一個成功的回聲,但如果是的話,那麼我得到那個錯誤...我的php代碼:

<?php 

    if(isset($_POST['configured'])){ 

    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 
    $username = $_SESSION['username']; 

    $stmt = $mysqli->prepare("SELECT gender FROM members WHERE username = ?"); 
    $stmt->bind_param('s', $username); 
    $stmt->bind_result($gender); 
    $stmt->execute(); 

    while ($stmt->fetch()){ 
     if(empty($gender)){ 
      echo "<font color='#DB4D4D'>Verification failed! Please provide your information and try again...</font>"; 
     } else { 
      $_POST['configured'] = 1; 
      $sql = " 
      UPDATE members 
      SET configured = ? 
      WHERE username = ? 
      "; 
      $stmt = $mysqli->prepare($sql); 
      $stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']); // This is the error line 
      $ok = $stmt->execute(); 

      if ($ok == TRUE) { 
       echo "<p><font color='#00CC00'>Your information has been verified.</font><p> 
         <form action='index.php'> <input type='submit' class='buttondiv' value='Continue to Home Page'>"; 
      } else { 
       echo "Error: " .$stmt->error; 
      } 
     } 
    } 
} 
?> 

問題在哪裏?

BTW:錯誤線是不是不正確本身..必須有別的事情上......

+1

請修復您的代碼縮進,這將使問題更容易追蹤。 – 2015-04-02 21:21:47

+0

壓痕有什麼問題?你的意思是最後有3個括號? – 2015-04-02 21:24:59

+0

從第一行開始,縮進很糟糕,使代碼難以遵循。 FIFY。 – 2015-04-02 21:25:54

回答

1

您需要添加session_start()到頁面的頂部。因爲沒有$_SESSION['username']

+0

這不是完整的代碼..這只是代碼的一部分...我的完整代碼有300多行... – 2015-04-02 21:31:08

+0

因此,您認爲錯誤存在於您發佈的行中? 300多行以'session_start()'開始? – 2015-04-02 21:32:14

+0

我知道它就在那裏,因爲我只有一個「確認我的信息」的代碼,沒有檢查性別,它正在工作......在我添加檢查性別後,它彈出錯誤 – 2015-04-02 21:33:34

-1

據我就應該更換你的綁定失敗:

$stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']); 
$stmt->bind_param('s', $_POST['configured']); 
$stmt->bind_param('s', $_SESSION['username']); 
+0

我不認爲這可以工作.. bind_param不能在分隔線,而不是在2代碼...相信我..我試過一次,它didn不工作:D必須在一個代碼 – 2015-04-02 21:47:46

+0

爲什麼@DDA? PHP允許['bind_param()'](http://php.net/manual/en/mysqli-stmt.bind-param.php)中的多個元素 – 2015-04-02 21:47:50

+0

你是對的@Jay Blanchard,我只是發現它是可能的。 – DDA 2015-04-02 21:59:11

0

mysqli->準備()返回FALSE因此$ stmt-> bind_param()是有效像假> bind_param (),FALSE不是一個對象,而是一個布爾值(不是PHP中的對象),因此錯誤消息Call to a member function bind_param() on a non-object

mysqli-> prepare()失敗始終是一個選項,因爲各種原因。
因此總是檢查返回值。

$stmt = mysqli_prepare(...); 
if (!$stmt) { 
    trigger_error(__LINE__ . ': '.print_r($mysqli->error_list, true), E_USER_ERROR); 
} 

與大多數其他mysqli函數/方法一樣,bind_param(),execute()...總是檢查返回值。如果它爲FALSE或NULL,則出現問題。
總之:添加錯誤處理!


讓我們凝聚你的腳本一點點:

$stmt->execute(); 

while ($stmt->fetch()){ 
    ... 
    $stmt = $mysqli->prepare($sql); 
    $stmt->bind_param('ss', $_POST['configured'], $_SESSION['username']); 
    $ok = $stmt->execute(); 

你有$語句的(有效)聲明,試圖在循環中以「覆蓋」。
a)while ($stmt->fetch())下一次迭代會做什麼?
b)不適用於mysql;每個連接只有一個活動語句。

相關問題