0

テスト目的で2つのレコードを持つデータベースがあります...データベース列(user_id、username、password、およびrole)...

PHPPDOを使用してデータベースと通信しています。以下のPDOを拡張するクラスファイルを作成しました。

<?php
    require_once('constants.php');
    class PDOConfig extends PDO{

        private $real_escape_string;
        private $mageic_quote_active;


        public function __construct(){
            $dsn = DBENGINE .':dbname='. DBNAME.";host=".DBHOST; 
            parent::__construct($dsn, DBUSER, DBPW);
            $mageic_quote_active = get_magic_quotes_gpc();
            $real_escape_string = function_exists("mysql_real_escape_string");
        }


        public function escapeValue($value){
            //PHP >= 4.3.0 or greater
            if($this->real_escape_string){
                if($this->mageic_quote_active){
                    //if new version exists turn magic quotes off
                    $value = stripslashes($value);
                }
                $value = mysql_real_escape_string($value);
            }
            return $value;
        }

    }//end of class

    $connection = new PDOConfig();
    $database =& $connection;

私は次のコードを持っている私のログインページでこのファイルを使用しています

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Sign In</title>
        <link rel="stylesheet" href="css/bootstrap.css">
        <link rel="stylesheet" href="css/singin-form.css">

        <?php require_once('includes/PDOConfig-class.php'); ?>
        <?php //require_once('includes/utility-functions.php'); ?>
        <?php
            $errors = "";
            if(isset($_POST['submit'])){

                $username = trim($_POST['username']);
                $password = trim($_POST['password']);

                if(!empty($username) && !empty($password)){
                    $sql = "SELECT * FROM user WHERE user_name = '" . $database->escapeValue($username) . "'";
                    $prestmt = $database->prepare($sql);
                    $prestmt->execute();
                    $result = $prestmt->fetch($database::FETCH_ASSOC);
                    //print_r($result);
                    echo $result['role'];


                    echo "<br /> Query :  " . $sql;
                }
                //echo '<div class="alert alert-error">something wrong<button type="button" class="close" data-dismiss="alert">&times;</button></div>';
            }

        ?>


    </head>
    <body>

        <div class="container">

            <form class="form-signin" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
                <h2>Please sign in</h2>
                <input type="text" name="username" class="input-block-level" placeholder="User Name" />
                <input type="password" name="password" class="input-block-level" placeholder="Password" />
                <button name="submit" class="btn btn-primary btn-large" type="submit">Login</button>
            </form>
        </div>

    </body>
</html>

しかし、データベースにデータがありますが、印刷したクエリ以外にページに何も表示されません...

「FETCH_OBJ」を使用しようとすると、次のエラーが発生します。

trying to get property of non-object in C:\wamp\www\testPHP\login.php on line 30

上記のエラーを生成するコードは以下のとおりです

if(!empty($username) && !empty($password)){
    $sql = "SELECT * FROM user WHERE user_name = '" . $database->escapeValue($username) . "'";
    $prestmt = $database->prepare($sql);
    $prestmt->execute();
    $result = $prestmt->fetch($database::FETCH_OBJ);
    echo $result->role;
}

私はPHPPDOを使用したことがなく、phpがあまり得意ではないので、助けてください...ありがとうございました

4

1 に答える 1

1

このリンクには、必要なものがすべて含まれています

  • そこに記載されている方法でdbに接続します(PDOにエラーを通知させるため)
  • そこに記述されている方法で変数をクエリに割り当てます(クエリを安全で賢明なものにするため)
  • PDOConfigはまったく役に立たないので、削除してください。そこからコンストラクターだけが必要なので、コンストラクターコード自体をPDOConfig-class.phpに入れるだけです。

次に、コードを実行して、何が問題になっているのかを確認します

于 2013-03-08T17:19:27.530 に答える