简体   繁体   English

PHP OOP数据库问题

[英]PHP OOP issue with database

I am querying usernames from database using the get() function in the DB class.. its always returning 'No users' even if there are users existing in the database.. here is my DB.php 我正在使用DB类中的get()函数从数据库中查询用户名。即使数据库中存在用户,它也始终返回“ No users”。这是我的DB.php

<?php
class DB{
    private static $_instance = null;
    private $_pdo, 
            $_query, 
            $_error = false, 
            $_results, 
            $_count = 0;

    private function __construct(){
        try {
            $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname='. Config::get('mysql/db'), Config::get('mysql/username'), Config::get('mysql/password'));

        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }

    public static function getInstance() {
        if (!isset(self::$_instance)) {
            self::$_instance = new DB();
        }
        return self::$_instance;
    }

    public function query($sql, $params = array()) {
        $this->_error = false;
        if($this->_query = $this->_pdo->prepare($sql)) {
            $x = 1;
            if (count($params)) {
                foreach ($params as $param) {
                    $this->_query->bindValue($x, $params);
                    $x++;
                }
            }

            if ($this->_query->execute()) {
                $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                $this->_count = $this->_query->rowCount();
            } else {
                $this->_error = true;
            }
        }
        return $this;
    }

    public function action($action, $table, $where = array()) {
        if (count($where) === 3) {
            $operators = array('=','>','<','>=','<=');

            $field    = $where[0];
            $operator = $where[1];
            $value    = $where[2];

            if (in_array($operator, $operators)) {
                $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

                if(!$this->query($sql, array($value))->error()){
                    return $this;
                }
            }
        }
        return false;
    }

    public function get($table, $where) {
        return $this->action('SELECT *', $table, $where);
    }

    public function delete($table, $where) {
        return $this->action('DELETE', $table, $where);
    }

    public function results(){
        return $this->_results;
    }

    public function error(){
        return $this->_error;   
    }

    public function count(){
        return $this->_count;   
    }
}

index.php index.php

<?php
require_once 'core/init.php';

$user = DB::getInstance();
$user->get('users', array('username', '=', 'alex'));

if(!$user->count()) {
    echo 'No user';
} else {
    foreach ($user->results() as $user) {
        echo $user->username, '<br>';
    }
}

Am getting 'No user' even if there is existing user in the the DB if I use this.. 如果我使用此功能,即使数据库中已有用户,也将获得“无用户”信息。

$user = DB::getInstance()->get('users', array('username', '=', 'alex')); $ user = DB :: getInstance()-> get('users',array('username','=','alex'));

but it is returning correct usernames(including 'alex') if I replace get() with query() 但是如果我用query()替换get(),它将返回正确的用户名(包括“ alex”)

$user = DB::getInstance()->query("SELECT * FROM users"); $ user = DB :: getInstance()-> query(“ SELECT * FROM users”);

In your query function when binding you do: 在绑定时在查询函数中执行以下操作:

foreach ($params as $param) {
    $this->_query->bindValue($x, $params);
    $x++;
}

You are binding $params which is an array, not the value. 您绑定$params这是一个数组,而不是值。 Change $params to $param (singular) and it will likely work. $params更改$params $param (单数),可能会起作用。

Please look at this answer Row count with PDO 请查看此答案PDO的行数

PDO has PDOStatement::rowCount(), which apparently does not work in MySql. PDO具有PDOStatement :: rowCount(),显然在MySql中不起作用。 What a pain. 真痛苦

Try changing 尝试改变

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";

to

$sql = "{$action} FROM {$table} WHERE {$field} {$operator} {$value}";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM