【问题标题】:PHP & MySQL OOP - Why am I not getting a result back?PHP & MySQL OOP - 为什么我没有得到结果?
【发布时间】:2016-05-17 09:16:17
【问题描述】:

我不确定为什么没有在浏览器中返回/输出全名。任何人都可以帮忙吗?我有一个包含特定类的类文件,只是为了更有条理的文件结构。数据库类包含与数据库有关的所有当前方法,用户类包含用户的方法,我在用户类中调用数据库中的一些方法,但我确定方法和属性的范围是设置正确吗?

classes.php:

include 'database.php';
include 'user.php';
$user = User::getUserId(1);
echo $user->getName();

数据库.php

<?php
require_once("../core/config.php");

class Database {
    private $connection;

    function __construct() {
        $this->connect();
    }

    public function connect() {
        $this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
        if(mysqli_connect_errno()) {
            die("Database connection failed: " . 
               mysqli_connect_error() . 
               " (" . mysqli_connect_errno() . ")"
            );
        }
    }

    public function disconnect() {
        if(isset($this->connection)) {
            mysqli_close($this->connection);
            unset($this->connection);
        }
    }

    public function query($sql) {
        $result = mysqli_query($this->connection, $sql);
        if (!$result) {
            die("Database query failed.");
        } 
        return $result;
    }

    public function prepare($data) {
        $escString = mysqli_real_escape_string($this->connection, $data);
        return $escString;
    }

    public function fetchArray($results) {
        return mysqli_fetch_array($results);
    }
}

$db = new Database();

?>

用户.php

<?php

class User {

    public $userId;
    public $username;
    public $password;
    public $email;
    public $firstname;
    public $lastname;
    public $access;
    public $active;

    public static function getUsers() {
        return self::getBySQL("SELECT * FROM users");
    }

    public static function getUserId($id=0) {
        global $db;
        $result = self::getBySQL("SELECT * FROM users WHERE userId={$id} LIMIT 1");
        return !empty($result) ? array_shift($result) : false;
    }

    public static function getBySQL($sql) {
        global $db;
        $result = $db->query($sql);
        $objArray = array();
        while ($row = $db->fetchArray($result)) {
            $objArray[] = self::instantiate($row);
        }
        return $objArray;
    }

    public function getName() {
        if (isset($this->firstname) && isset($this->lastname)) {
            return $this->firstname . " " . $this->lastname;
        } else {
            return "";
        }
    }

    private static function instantiate($record) {
        $object = new self;

        foreach($record as $attr=>$value){
            if($object->hasAttr($attr)) {
                $object->$attr = $value;
            }
        }
        return $object;
    }

    private function hasAttr($attr) {
        $objectVars = get_object_vars($this);
        return array_key_exists($attr, $objectVars);
    }
}

?>

【问题讨论】:

  • var_dump($user); 的结果是什么
  • @RaviHirani object(User)#4 (8) { ["userId"]=> string(1) "1" ["username"]=> NULL ["password"]=> NULL ["email"]=> NULL ["firstname"]=> NULL ["lastname"]=> NULL ["access"]=> NULL ["active"]=> NULL }
  • 您是否正确检查了数据库中是否存在用户?如果是,那么 DB 中的所有字段都为 NULL?
  • @RaviHirani 是的,用户以 userId 1 存在,什么值必须为空?每个字段都有值,我自己的详细信息,因为我刚刚在数据库中输入了我的第一条记录。
  • @RaviHirani 我刚刚在 phpmyadmin 中使用了查询,它返回 userId 为 1 的记录,但转储为其他值返回 NULL,所以实际方法中的问题是什么?

标签: php mysql class oop object


【解决方案1】:

好吧,您的代码有效。这是一个独立的示例:

<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "sotest_users");

function query($mysqli, $text) {
    print 'Query: ' . $text . PHP_EOL;
    $result = $mysqli->query($text);
    if ($result === false) {
        print 'Query error: ' . $mysqli->error . PHP_EOL;
        die();
    }
    return $result;
}

$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS);
query($mysqli, 'drop database if exists ' . DB_NAME);
query($mysqli, 'create database ' . DB_NAME);
$mysqli->select_db(DB_NAME);
query($mysqli, 'create table users (userId integer, username text, password text)');
query($mysqli, 'insert into users (userId, username, password) values (1, "test", "test")');

$result = query($mysqli, 'select * from users where userId=1');
while ($row = $result->fetch_assoc()) {
    print json_encode($row) . PHP_EOL;
}
$result->close();


// Your code here

class Database {
    //...
}

$db = new Database();

class User {
    //...
}

print 'Start' . PHP_EOL;
$user = User::getUserId(1);
var_dump($user);
//echo $user->getName();

输出:

Query: drop database if exists sotest_users
Query: create database sotest_users
Query: create table users (userId integer, username text, password text)
Query: insert into users (userId, username, password) values (1, "test", "test")
Query: select * from users where userId=1
{"userId":"1","username":"test","password":"test"}
Start
class User#6 (8) {
  public $userId =>
  string(1) "1"
  public $username =>
  string(4) "test"
  public $password =>
  string(4) "test"
  public $email =>
  NULL
  public $firstname =>
  NULL
  public $lastname =>
  NULL
  public $access =>
  NULL
  public $active =>
  NULL
}

完整代码是herepassword 之后的字段是空的,只是因为我没有将它们添加到 users 表中。

但我必须说,你所做的一般都是错误的,无论是在 OOP(全局变量、静态方法、公共属性等)方面还是在数据库处理方面(缺乏错误处理、直接变量注入)进入 sql)。

如果这是一个真正的项目 - 最好切换到某个框架,例如 Yii

如果您正在学习 - 查找并阅读有关正确使用 OOP 和 php 中的最佳数据库实践的内容。 PHP The Right Way 是一个很好的起点。

【讨论】:

  • 谢谢!我肯定会考虑正确地做所有事情,也会考虑 yii!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-10-02
  • 2018-02-25
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多