2016-10-20 5 views
-1

ヘルパー関数を作成しましたが、これをコード全体で多く使用すると、次のエラーが発生します。mysqli num rowsはサーバーでローカルホストではなくエラーを返します

しかし、私は理解できませんが、私はサーバーをzendしていると私のコードは、ローカルホスト上で正常に実行されます。なぜ生きているサーバーで悲しんでいるのですか?

警告:mysqli_のNUM_ROWS()パラメータ1 mysqli_resultされることを想定し、ライン上のブール26

これは、ログインコード

function login_user($email, $password){ 

    $active = 1; 

    $connection = dbconnect(); 
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?'); 
    $stmt->bind_param('ss', $email, $active); 
    $stmt->execute(); 
    $result = $stmt->fetch();  

    if (row_count($result) == 1) { 

     $row = fetch_array($result); 

     $db_password = $row['user_pwd']; 

     if (password_verify($password, $db_password)) { 

      $_SESSION['email'] = $email; 
      $_SESSION['user_id'] = $row['user_id']; 
      $_SESSION['username'] = $row['username']; 

      return true; 

     } else { 

      return false; 
     } 

     return true; 

    } else { 

     return false; 
    } 
} 
ライン26

function row_count($result){ 
    global $connection; 
    return mysqli_num_rows($result); 
} 

あります

+0

DB接続が失敗している可能性が高いため、クエリが失敗している可能性があります。 – WillardSolutions

+0

@Mike私はあなたのpingを得る前に私のコメントを知り、削除しました。 –

答えて

2

mysqli_stmt::fetchのドキュメントから、ここでは、この文を見て、

$result = $stmt->fetch(); 

        Return Values 
    Value Description 
    TRUE  Success. Data has been fetched 
    FALSE Error occurred 
    NULL  No more rows/data exists or data truncation occurred 

まず、->fetch()が成功した場合に設定されたすべての結果を返しません。次に、このメソッドは、準備されたステートメントの結果をバインドされた変数にフェッチするために使用されます。

ソリューションは、SELECTクエリによって返される行の合計数を取得するために->num_rows続く最初の使用->store_result()です。そして、準備されたステートメントからの結果をバインドされた変数にフェッチし、後でこれらのバインドされた変数をコード内で使用できるようにします。だからあなたのコードは次のようにする必要があります:

また
function login_user($email, $password){ 
    $active = 1; 

    $connection = dbconnect(); 
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?'); 
    $stmt->bind_param('ss', $email, $active); 
    $stmt->execute(); 
    $stmt->store_result();  

    if ($stmt->num_rows == 1) { 
     $stmt->bind_result($db_password, $user_id, $username); 
     $stmt->fetch(); 

     if (password_verify($password, $db_password)) { 
      $_SESSION['email'] = $email; 
      $_SESSION['user_id'] = $user_id; 
      $_SESSION['username'] = $username; 
      return true; 
     } else { 
      return false; 
     } 
     return true; 
    } else { 
     return false; 
    } 
} 

あなたはまた、所望の結果を達成するために->get_result()メソッドを使用することができます。あなたのコードは次のようにする必要があります:

function login_user($email, $password){ 
    $active = 1; 

    $connection = dbconnect(); 
    $stmt = $connection->prepare('SELECT user_pwd, user_id, username FROM users WHERE user_email = ? AND active= ?'); 
    $stmt->bind_param('ss', $email, $active); 
    $stmt->execute(); 
    $result = $stmt->get_result();  

    if ($result->num_rows == 1) { 
     $row = $result->fetch_array(); 
     $db_password = $row['user_pwd']; 

     if (password_verify($password, $db_password)) { 
      $_SESSION['email'] = $email; 
      $_SESSION['user_id'] = $row['user_id']; 
      $_SESSION['username'] = $row['username']; 
      return true; 
     } else { 
      return false; 
     } 
     return true; 
    } else { 
     return false; 
    } 
} 

注:->get_result()方法が唯一のMySQLネイティブドライバ(mysqlnd)で提供されていますので、あなたは特定のドライバがインストールされていることをを持っていない場合、それは動作しません。


また、あなたの質問から:

が、私はZendのサーバーを持っているし、私のコードは、ローカルホスト上で正常に動作が何であるかを私は理解していません。なぜ生きているサーバーで悲しんでいるのですか?

これは、おそらくローカルサーバーでエラー報告がオフになっているからです。これらの行をPHPスクリプトの一番上に追加して、エラー報告を有効にしてください。ini_set('display_errors', 1); error_reporting(E_ALL);。また、mysqli::$errorを使用してください。

+0

@ rajdeep-paulif上に戻ると、$ row = fetch_array($ result)という行が表示されます。私の質問は、なぜローカルではなくライブでもエラーが出ないのですか? – Case

+1

@エラー報告はおそらくあなたのローカルサーバーではオフになっています。これらの行をPHPスクリプトの一番上に追加して、エラー報告を有効にします。 'ini_set( 'display_errors'、1); error_reporting(E_ALL); '。 –

+1

@ケース回答を更新しました。私はあなたの問題を解決するために、より多くの説明(およびコード)と1つの代替アプローチを追加しました。これがあなたを助けることを願っています。 –

関連する問題