Php 如何按id查询数据库中的所有条目?

Php 如何按id查询数据库中的所有条目?,php,mysql,sql,Php,Mysql,Sql,我一直在关注关于构建登录表单的教程。一切都很顺利 现在我正在尝试重用代码。我遇到的问题是,当我试图查询数据库中的所有条目以获得网站总数时。你能给我个建议吗 这是我的count函数(这是我在获取数据库中用于分页的条目总数时遇到的问题): 如果我用这个,我会列出所有的ID function get_all_websites(){ $all = array(); $db = DB::getInstance(); $all = $db->query("SELECT *

我一直在关注关于构建登录表单的教程。一切都很顺利

现在我正在尝试重用代码。我遇到的问题是,当我试图查询数据库中的所有条目以获得网站总数时。你能给我个建议吗

这是我的count函数(这是我在获取数据库中用于分页的条目总数时遇到的问题):

如果我用这个,我会列出所有的ID

function get_all_websites(){

    $all = array();

    $db = DB::getInstance();
    $all = $db->query("SELECT * FROM website");

    if(!$all->count()){
        echo 'No Websites available. Please check back later.';
    } else {
        foreach($all->results() as $all){
            echo $all->id;
        }
    }

}
数据库类

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;

            // Check if query has been prepared properly

            if($this->_query = $this->_pdo->prepare($sql)){

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

            // If the query has been prepared successfuly, store the result
                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;
        }

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

        // DELETING DATA FROM DATABASE
        public function delete($table, $where){
            return $this->action('DELETE', $table, $where);
        }

        // INSERTING DATA INTO DATABASE
        public function insert($table, $fields = array()){
                $keys = array_keys($fields);
                $values = '';
                $x = 1;

                foreach($fields as $field){
                    $values .= "?";

                    if($x < count($fields)){
                        $values .= ', ';
                    }
                    $x++;
                }

                $sql = "INSERT INTO {$table} (`" . implode('`, `', $keys) . "`) VALUES({$values})";

                if(!$this->query($sql, $fields)->error()){
                    return true;
                }

            return false;
        }

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

        public function update($table, $id, $fields){
            $set = '';
            $x = 1;

            foreach($fields as $name => $value){
                $set .= "{$name} = ?";

                if($x < count($fields)){
                    $set .= ', ';
                }
                $x++;
            }


            $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";

            if(!$this->query($sql, $fields)->error()){
                return true;
            }

            return false;
        }

        public function first(){
            return $this->results()[0];
        }

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

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

    }
classdb{
私有静态$\u实例=null;
私人$(pdo),
$\u查询,
$\u错误=false,
$\u结果,
$\计数=0;
私有函数_u构造(){
试一试{
$this->_pdo=new pdo('mysql:host=')。
Config::get('mysql/host')。;dbname='。
Config::get('mysql/db'),
Config::get('mysql/username'),
Config::get('mysql/password');
}捕获(PDO$e){
死亡($e->getMessage());
}
}
公共静态函数getInstance(){
if(!isset(self:$\实例)){
self::$_instance=new DB();
}
返回self::$\u实例;
}
公共函数查询($sql,$params=array()){
$this->_error=false;
//检查查询是否已正确准备
如果($this->_query=$this->_pdo->prepare($sql)){
$x=1;
如果(计数($params)){
foreach($params作为$param){
$this->_query->bindValue($x,$param);
$x++;
}
}
//如果查询准备成功,请存储结果
如果($this->\u query->execute()){
$this->\u results=$this->\u query->fetchAll(PDO::FETCH\u OBJ);
$this->_count=$this->_query->rowCount();
}否则{
$this->_error=true;
}
}
退还$this;
}
公共函数action($action,$table,$where=array()){
如果(计数($where)==3){

$operators=array(“=”、“>”、“=”、“此部分似乎不正确:

    } else {
        foreach($all->results() as $all){
            $all->id = $all;
        }
    }
    return $all;
但我不确定你想要什么

我们可以将每个id附加到名为$AllWebsiteID的数组中:

    } else {
        foreach($all->results() as $all){
            $allWebsiteIds[] = $all->id;
        }
    }
    return $allWebsiteIds;

这可能会满足您的需要。

为什么不使用select来计算行数


从网站中选择COUNT(1);

SQL为计算表中的行提供内置支持

SELECT COUNT(*) FROM ...
这是高度优化的,避免了将每一行加载到PHP内存中

此外,请密切注意循环的构造;特别是它的含义:

foreach($foo as $foo)
作为你研究的一部分,你应该能够说出为什么这个表达几乎从来都不是你想要的


有一条更广泛的规则:永远不要改变你正在迭代的内容。

你不会说问题出在哪里。你会收到错误消息吗?空白页吗?总数错误吗?问题出在get_all_网站()中的我的foreach循环中函数。我不知道如何只检索数据库中的一些总条目。我们是否会错过询问为什么不使用
SELECT COUNT(*)的要点从…
?您的代码中的技术是非常过分的。关于您的循环,您正在将$all变量重新分配给它的每个成员,然后将每个成员作为id属性分配给它自己……我怀疑这不是您的意图。我仍然是一名大学生,正在学习PHP,因为这是我选择的语言。我不是php pro@ctraheyIt只列出数据库中的所有ID。好的,这应该将它们放入一个数组中。然后如何计算数组中的项目?使用php count()?如果我听从您的建议,我会得到以下错误:未定义属性:DB:$ID in/Users/web/Sites/classes/Websites.php第30行:$allWebsiteIds[]=$all->id;是的,这很有意义。但是我是否仍然必须在foreach look after中使用SELECT COUNT(*)FROM…?否。将聚合一个
COUNT
查询,并且(默认情况下)只有一个结果行。
foreach($foo as $foo)