微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysqli中的错误,但未显示在mysqli-> error中

如何解决mysqli中的错误,但未显示在mysqli-> error中

我有以下PHP代码作为dabatase.class.PHP的一部分来处理我的MysqLi函数效果很好,我一直在慢慢改进。但是,我注意到当出现错误时,我的脚本会以静方式失败。

database.class.PHP摘录

    class database {

    var $host;              // MysqL host to connect to
    var $user;              // MysqL user name
    var $pass;              // MysqL password
    var $db;                // MysqL database to select
    var $prefix;            // MysqL table prefix
    var $path;              // Path to main directory
    var $stmt;              // Prepared Statement
    
    var $err;               // Set to true in constructor to show errors by default if one occurs.
    var $last_error;        // holds the last error. Usually MysqLi_error() or other MysqLi error.
    var $last_query;        // holds the last query executed.
    var $last_parameters;   // holds the last parameters for the last query
    var $row_count;         // holds the last number of rows from a select
    var $result;            // Holds the result.

    var $conn;              // MysqLi Connection Link
    var $db_link;           // current/last database link identifier
    var $auto_slashes;      // the class will add/strip slashes when it can
    var $queries;           // hold the count of queries used to generate the page

    // class constructor.  Initializations here.
    // Setup your own default values for connecting to the database here.
    public function __construct($data) {
        $this->host = $data["host"];
        $this->user = $data["user"];
        $this->pass = $data["pass"];
        $this->db   = $data["db"];
        $this->prefix = $data["prefix"];
        $this->site_title = $data["site_title"];
        $this->dev_email = $data["dev_email"];
        $this->path = $data["path"];
        
        $this->err  = true;
        $this->conn = @new MysqLi($this->host,$this->user,$this->pass,$this->db); 
        if($this->conn->connect_errno > 0){
            $this->last_error = 'Unable to connect to database [' . $this->conn->connect_error . ']';
            echo $this->error();
            die();
        }
        else {
            $this->conn->set_charset("utf8");
        }

    }
    
    function select($sql,$err=false) {
        $this->last_query = $sql;
        if(!$result = $this->conn->query($sql)){
            $this->last_error = $this->conn->error;
            if($this->conn->error) {
                $sql = trim(preg_replace('/\s+/',' ',$sql));
                $this->log_error("MysqL",$this->last_error." ☼ ".$sql);
            }
        } else {
            return $result;
        }
    }
    
    function prepare($sql) {
        $this->last_query = $sql; //Save query to show later on.
        $this->stmt = $this->conn->prepare($sql);
    }
    function execute($params=array()) {
        
        $action = explode(' ',trim($this->last_query))[0];
        $ident = '';
        $parameters = '';
        $vars = array();

        if($this->stmt!==false) {
            if(!empty($params)  || count($params) == 0) {
                foreach($params as $k => $v) {
                    foreach($v as $a => $b) {
                        $ident  .= $a;
                        $vars[] .= $b;
                        $parameters .= $a.' => '.$b.'<br>'; // For MysqL error reporting
                    }
                }
            
            
                $this->stmt->bind_param( $ident,...$vars );
                $this->parameters = $parameters;
            }
            else { 
                $this->paramaters = '';
            }
            
            $success = $this->stmt->execute();
            
            if($success) {
                if($action=="SELECT") {
                    $this->result = $this->stmt->get_result();
                }
                else {
                    return $success;
                }
            }
            else {
                if($this->conn->error) {
                    $this->last_error = $this->conn->error;
                    //$sql = trim(preg_replace('/\s+/',$this->last_query));
                    //$this->log_error("MysqL",$this->last_error." ☼ ".$this->last_query);
                    //$this->print_last_error(true);
                    echo $this->error();
                }
                echo 'ERRORS: '.$this->error();
                return false;
            }
            
            $this->stmt->close();
            return $this->result;
        }
        else {
            
            if($this->conn->error) {
                /*$this->last_error = $this->conn->error;
                $sql = trim(preg_replace('/\s+/',$this->last_query));
                $this->log_error("MysqL",$this->last_error." ☼ ".$this->last_query);*/
                echo $this->error();
            }
        }
        //$data = $result->fetch_all();
    }
    
    function select_one($sql,$this->last_error." ☼ ".$sql);
            }
        } else {
            return $this->MysqLi_result($result,0);
            //return $result;
        }
    }
    
    function insert_sql($sql,$this->last_error." ☼ ".$sql);
            }
        } else {
            return $result;
        }
    }
    
    function multi_query($sql,$err=false) {
        $this->last_query = $sql;
        if(!$result = $this->conn->multi_query($sql)){
            if ($result) {
                do {
                    // grab the result of the next query
                    if (($result = MysqLi_store_result($this->conn)) === false && MysqLi_error($this->conn) != '') {
                        //echo "Query Failed: " . MysqLi_error($this->conn);
                    }
                } while (MysqLi_more_results($this->conn) && MysqLi_next_result($this->conn)); // while there are more results
            } else {
                //echo "First query Failed..." . MysqLi_error($this->conn);
            }
            
            
            
            $this->last_error = $this->conn->error;
            if($this->conn->error) {
                $sql = trim(preg_replace('/\s+/',$this->last_error." ☼ ".$sql);
            }
        } else {
            return $result;
        }
    }
    
    function update_sql($sql,$this->last_error." ☼ ".$sql);
            }
        } else {
            return $result;
        }
        
    }
    
    function update($sql,$this->last_error." ☼ ".$sql);
            }
        } else {
            return $result;
        }
        
    }
    function num_rows($result=1,$prepared=0) {
        if ( $result === FALSE && $prepared==0) {
            return 0;
        }
        elseif($result === NULL && $prepared==0) {
            return 0;
        }
        elseif($result===1 && $prepared===1) {
            return $this->result->num_rows;
        }
        else {
            return $result->num_rows;
        }

    }
    function fetch($result) {   
        $array = array();
       
        if($result instanceof MysqLi_stmt)
        {
            $result->store_result();
           
            $variables = array();
            $data = array();
            $Meta = $result->result_Metadata();
           
            while($field = $Meta->fetch_field())
                $variables[] = &$data[$field->name]; // pass by reference
           
            call_user_func_array(array($result,'bind_result'),$variables);
           
            $i=0;
            while($result->fetch())
            {
                $array[$i] = array();
                foreach($data as $k=>$v)
                    $array[$i][$k] = $v;
                $i++;
               
                // don't kNow why,but when I tried $array[] = $data,I got the same one result in all rows
            }
        }
        elseif($result instanceof MysqLi_result)
        {
            while($row = $result->fetch_assoc())
                $array[] = $row;
        }
       
        if(count($array) > 0) {
            return $array;
        }
        else {
            $return = array();
            array_walk_recursive($array,function($a) use (&$return) { $return[] = $a; });
            return $return;
        }
        
        
    }
    function get_row($result) {
        if($result) {
            return $result->fetch_assoc();
        }
        else {
            return false;
        }
    }

    function free($result) {
        $result->free();
    }
    
    function last_id() {
        return $this->conn->insert_id;
    }
    
    function MysqLi_result($res,$row,$field=0) {
        $res->data_seek($row);
        $daTarow = $res->fetch_array();
        /*if(!isset($daTarow[$field])) {
            echo $this->error();
            exit();
        }*/
        return $daTarow[$field];
    } 
    
    /* Error Handling */
    /* Function to log all errors. */
    function log_error($type,$error,$notify=false) {
        $msg = date("Y/m/d h:i A").' ☼ '.$type.' ☼ '.$error;
        
        if($notify) {
            error_log($msg,1,$this->dev_email);
        }
        $log_file = $this->path."dsm/logs/$type.log";
        if(file_exists($log_file)) {
        }
        else {
            @touch($log_file);
        }
        // another way to call error_log():
        @error_log($msg."\r\n",3,$log_file);

    }
    
    function print_last_error($show_query=true) {
        // Prints the last error to the screen in a nicely formatted error message.
        // If $show_query is true,then the last query that was executed will
        // be displayed aswell.
        ?>
            <div style="border: 1px solid red; font-size: 9pt; font-family: monospace; color: red; padding: .5em; margin: 8px; background-color: #FFE2E2">
             <span style="font-weight: bold">database.class.PHP Error:</span><br><?PHP echo $this->last_error; ?>
            </div>
        <?PHP
        if ($show_query && (!empty($this->last_query))) {
            $this->print_last_query();
        }
    }
    
    function error() {
        if(!empty($this->parameters)) {
            $params = '<div style="padding-left: 20px;">'.$this->parameters.'</div>';
        }
        if(empty($this->last_error)) {
            $this->last_error = 'There are no errors in the sql Query.';
            return '
            <div style="background-color:#f9f9f9; border: 3px solid #D70000; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">database.class.PHP Error:</span> 
            '.$this->last_error.'
            </div>';
        }
        else {
            return '
            <div style="background-color:#f9f9f9; border: 3px solid #D70000; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">database.class.PHP Error:</span> 
            '.$this->last_error.'
            
            <div style="background-color:#f9f9f9; border: 3px solid #0000D7; padding: 5px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">Last sql Query: </span> 
            <br>
            <span style="padding-left: 20px;font-family: monospace;">'.str_replace("\n",'<br>',$this->last_query).'</span></div>
            <div style="background-color:#f9f9f9; border: 3px solid #00D700; padding: 5px; padding-left: 20px; margin: 5px;"><span style="font-weight: bold; color: #D70000;">Last sql Parameters: </span> 
            <br>
            <span style="font-family: monospace;">'.$params.'</span>
            </div>
            </div>';
        }
        
        
    }
    
    function print_last_query() {
        // Prints the last query that was executed to the screen in a nicely formatted
        // Box.

        ?>
            <div style="border: 1px solid blue; font-size: 9pt; font-family: monospace; color: blue; padding: .5em; margin: 8px; background-color: #E6E5FF">
             <span style="font-weight: bold">Last sql Query:</span><br><span style="padding-left: 20px;"><?PHP echo str_replace("\n",$this->last_query); ?></span>
             <br>
             <?PHP if(!empty($this->parameters)) { ?>
             <span style="font-weight: bold">Last sql Parameters:</span><br><div style="padding-left: 20px;"><?PHP echo $this->parameters; ?></div>
             <?PHP } ?>
            </div>
        <?PHP  
    }
    
}

现在,我知道有一个错误(我故意在选择命令的数据库名称中间添加一个反斜线以测试该错误。但是,当我var_dump $this->conn-error时没有错误,并且是NULL;尽管在MySQL查询中是明显的致命错误

为什么我没有收到错误?我试过移动$ stmt-close();函数(如我在另一个答案中读到的,但这会阻止许多其他查询成功完成并返回其信息。

编辑:添加了完整的database.class.PHP脚本。

编辑:回复@mickmackusa。

  1. 我已从脚本中删除了$ err变量。

  2. 以下是一些有关如何使用准备好的语句来调用脚本的示例。

    $get = $db->prepare("SELECT * FROM `".$db->prefix."pw_water_meters` ORDER BY `id` DESC");
    $get = $db->execute();
    

    以上没有发送任何参数给类,因为没有要发送的信息。
    如果查询正确,则可以正常工作。

    $get = $db->prepare("UPDATE `".$db->prefix."pw_water_meters` SET `old_serial` ?,`new_serial` = ? WHERE `id` = ?");
    $params = array(
            array('s' => $_POST["old"]),array('s' => $_POST["new"]),array('i' => $_POST["id"])
            );
    $get = $db->execute($params);
    
    
    $get = $db->prepare("SELECT * FROM `".$db->prefix."pw_water_meters` WHERE `id` = ?");
    $params = array(
        array('i' => $_POST["id"])
    );
    $get = $db->execute($params);
    while($row = $db->get_row($get)) {
        /* Echo row or do whatever with it */
    }
    

    但是,如果我不接受任何用户输入,我也只能调用一个选择。

    $select = $db->select("SELECT * FROM `".$db->prefix."pw_water_meters` WHERE id`='3'");
    if($db->num_rows($select) > 0) {
        $meter = $db->get_row($select);
    }
    
  3. 我已将其认更改为一个空数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。