doutuo7815 2019-01-03 08:39
浏览 60
已采纳

如何在我的数据库类中解决错误计数php

I can not solve this problem, help me.

Warning: count(): Parameter must be an array or an object that implements Countable in /home/cabox/workspace/Datingmash/app/Classes/Database.php on line 74

The line 74:

public function bind($para, $value)
{   
    $this->parameters[count($this->parameters)] = ":" . $para . "\x7F" . utf8_encode($value);
}

This is the array

array(1) { [0]=> string(29) ":user_api_id1634508113362112" }

Full Code:

<?php

namespace App\Classes;
use PDO;

class Database extends DatabaseLogs {
    private $pdo;
    private $sQuery;
    private $bConnected = false;
    private $parameters;

    public function __construct(){
        $this->Connect();
        $this->parameters = array();
    }

    private function Connect(){
        $dsn = 'mysql:dbname='.APP_DATABASE_NAME.';host='.APP_DATABASE_HOSTNAME.'';
        try {
            $this->pdo = new PDO($dsn, APP_DATABASE_USERNAME, APP_DATABASE_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->bConnected = true;
        }
        catch (PDOException $e) {
            echo $this->ExceptionLog($e->getMessage());
            die();
        }
    }

    public function CloseConnection(){
        $this->pdo = null;
    }

    private function Init($query,$parameters = "")
        {
        # Connect to database
        if(!$this->bConnected) { $this->Connect(); }
        try {
                # Prepare query
                $this->sQuery = $this->pdo->prepare($query);

                # Add parameters to the parameter array 
                $this->bindMore($parameters);
                # Bind parameters
                if(!empty($this->parameters)) {
                    foreach($this->parameters as $param)
                    {
                        $parameters = explode("\x7F",$param);
                        $this->sQuery->bindParam($parameters[0],$parameters[1]);
                    }       
                }
                # Execute SQL 
                $this->success = $this->sQuery->execute();      
            }
            catch(PDOException $e)
            {
                    # Write into log and display Exception
                    $this->ExceptionLog($e->getMessage(), $query );
            }
            # Reset the parameters
            $this->parameters = array();
        }

       /**
    *   @void 
    *
    *   Add the parameter to the parameter array
    *   @param string $para  
    *   @param string $value 
    */  
        public function bind($para, $value)
        {   
            $this->parameters[count($this->parameters)] = ":" . $para . "\x7F" . utf8_encode($value);
        }
       /**
    *   @void
    *   
    *   Add more parameters to the parameter array
    *   @param array $parray
    */  
        public function bindMore($parray)
        {
            if(empty($this->parameters) && is_array($parray)) {
                $columns = array_keys($parray);
                foreach($columns as $i => &$column) {
                    $this->bind($column, $parray[$column]);
                }
            }
        }
       /**
    *       If the SQL query  contains a SELECT or SHOW statement it returns an array containing all of the result set row
    *   If the SQL statement is a DELETE, INSERT, or UPDATE statement it returns the number of affected rows
    *
    *       @param  string $query
    *   @param  array  $params
    *   @param  int    $fetchmode
    *   @return mixed
    */          
        public function query($query,$params = null, $fetchmode = PDO::FETCH_ASSOC)
        {
            $query = trim($query);
            $this->Init($query,$params);
            $rawStatement = explode(" ", $query);

            # Which SQL statement is used 
            $statement = strtolower($rawStatement[0]);

            if ($statement === 'select' || $statement === 'show') {
                return $this->sQuery->fetchAll($fetchmode);
            }
            elseif ( $statement === 'insert' ||  $statement === 'update' || $statement === 'delete' ) {
                return $this->sQuery->rowCount();   
            }   
            else {
                return NULL;
            }
        }

      /**
       *  Returns the last inserted id.
       *  @return string
       */   
        public function lastInsertId() {
            return $this->pdo->lastInsertId();
        }   

       /**
    *   Returns an array which represents a column from the result set 
    *
    *   @param  string $query
    *   @param  array  $params
    *   @return array
    */  
        public function column($query,$params = null)
        {
            $this->Init($query,$params);
            $Columns = $this->sQuery->fetchAll(PDO::FETCH_NUM);     

            $column = null;
            foreach($Columns as $cells) {
                $column[] = $cells[0];
            }
            return $column;

        }   
       /**
    *   Returns an array which represents a row from the result set 
    *
    *   @param  string $query
    *   @param  array  $params
    *       @param  int    $fetchmode
    *   @return array
    */  
        public function row($query,$params = null,$fetchmode = PDO::FETCH_ASSOC)
        {               
            $this->Init($query,$params);
            return $this->sQuery->fetch($fetchmode);            
        }
       /**
    *   Returns the value of one single field/column
    *
    *   @param  string $query
    *   @param  array  $params
    *   @return string
    */  
        public function single($query,$params = null)
        {
            $this->Init($query,$params);
            return $this->sQuery->fetchColumn();
        }
       /**  
    * Writes the log and returns the exception
    *
    * @param  string $message
    * @param  string $sql
    * @return string
    */
    private function ExceptionLog($message , $sql = "")
    {
        $exception  = 'Unhandled Exception. <br />';
        $exception .= $message;
        $exception .= "<br /> You can find the error back in the log.";
        if(!empty($sql)) {
            # Add the Raw SQL to the Log
            $message .= "
Raw SQL : "  . $sql;
        }
            # Write into log
            $this->log->write($message);
        throw new Exception($message);
        #return $exception;
    }           
}
?>
  • 写回答

1条回答 默认 最新

  • dre26973 2019-01-03 09:14
    关注

    First of all, you don't need to pass count($this->paramters) as index,

    The following code would just work if $this->paramters is an array

    public function bind($para, $value)
    {   
        $this->parameters[] = ":" . $para . "\x7F" . utf8_encode($value);
    }
    

    If you want to use it anyway, make sure $this->parameters is always an array or just fix it on the fly, use something like

    public function bind($para, $value)
    {   
        if(!is_array($this->parameters)){ $this->parameters = array(); }
    
        $this->parameters[ count($this->parameters) ] = ":" . $para . "\x7F" . utf8_encode($value);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误