-4

こんにちは、私はこの問題に対する他の応答を確認しましたが、何らかの理由で問題を解決できません.これは私が作成しようとしているログインシステムですが、致命的なエラーが発生し続けています:非メンバー関数の準備()の呼び出し-object in... エラーによると、問題は db.php ファイルにあります。

<?php
require "config.php";


function DBconnect($config) {
    try {
        $conn = new PDO('mysql:host=localhost;dbname=' . $config['database'],
                        $config['username'],
                        $config['password']);

        $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        return $conn;
    } catch(Exception $e) {
        echo $e->getmessage();
    }
}

function query($query, $bindings, $conn) {
    $stmt = $conn->prepare($query);
    $stmt->execute($bindings);

    return $stmt;
}

そして、これがログインページを作成するための私のindex.phpファイルです。

<?php

// include the necessary files
require "db.php";
require "functions.php";
include "index.view.php";

// Allow sessions to be passed so we can see if the user is logged in
session_start();

//conect to the database so we can check, edit or ,data to our users table
DBconnect($config);

// if the user has submitted the form
if( $_SERVER["REQUEST_METHOD"] === "POST") {
    global $conn;
    //protect the posted value then store them to variables
    $username = protect($_POST["username"]);
    $password = protect($_POST["password"]);

    //Check if the username or password boxes were not filled in
    if ( !$username || !$password ){
        // if not display an error message.
        echo "You need to fill in a username and password!";
    }else
        // if correct continue cheking

        //select all the rows where the username and password match

        query(  "SELECT * FROM users WHERE username = :username",
            array("username" => $username),
            $conn);
        $num = ( $stmt->rowcount() ); 


        //check if there was not a match
        if( $num == 0) {
            //if not display an error message
            echo "The username you entered does not exist!";
        }else{
            //if there was a mactch continue chekcing

            //select all rows where the username and password match the ones submitted by the user
            query( "SELECT * FROM users WHERE username =:username && password = :pasword",
                    array("username" => $username, "password" => $password ),
                    $conn);
            $num = ( $stmt->rowcount() );   

            //check if there was not a match
            if( $num == 0) {
                //if not display error message
                echo "Username and password do not mactch";
            }else {
                //if there was continue checking

                //split all the fields from the correct row into an associative array
                $row = $stmt->fetch(PDO::FETCH_ASSOC);
                //check to see if the user has not activated their account
                if($row["active"] != 1) {
                    //if not display an error message
                    echo "You hav not yet activated your account!";
                }else {
                    //if so then log them in

                    // set the login session storing their id. We use this to
                    // see if they are logged in or not.
                    $_SESSION["uid"] = $row["id"];
                    //show message confirming that they are loggd in
                    echo "You have succesfully logged in!";
                    //update the online field to 50 seconds in the future
                    $time = date("u")+50;
                    query( "UPDATE users SET online = :time WHERE id = :id",
                            array("time" => $time, "id" => $_SESSION["uid"]),  
                            $conn);
                    //redirect them to the usersonline page
                    header("Location: usersOnline.php");
            }
        }


    }
}
4

2 に答える 2

1

$connの戻り値から に値を代入するのを忘れましたDBConnect()。たとえば、

これ

DBconnect($config);

する必要があります

$conn = DBConnect($config);

global $connスコープ内にあるため、スクリプトで使用する必要もありません。

PDOまた、コンストラクターから例外をキャッチしないことをお勧めします。何かがうまくいかなかったことを他にどのように知ることができますか? echo-ing 例外メッセージはエラーを処理しません。

さらにもう 1 つsession_start()、スクリプトの先頭、または少なくともincludeステートメントの上に配置します。それらのいずれかがブラウザにデータを出力すると、古い「ヘッダーは既に送信されました」というエラーが表示されます。

アップデート

あなたの質問をもう少し詳しく見てきたので、なぜPDOメソッドを のようなユーザー関数でラップするのquery()ですか? ここには何も追加していないので、PDOオブジェクトを直接使用しないのはなぜですか?

于 2013-03-05T00:17:22.390 に答える
0

グローバル $conn を DBConnect 関数内に配置する必要があります

function DBconnect($config) {
    global $conn;
    //...
}

またはDBConnectの戻り値を割り当てます$conn

于 2013-03-05T00:16:19.580 に答える