wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

当我在 php过程中通过 php mysqli API在Windows上使用预准备语句进行简单插入时,定义的AUTO_INCREMENT列增加2而不是1: INSERT INTO `table` (`name`) VALUES (?) 在一个php进程中进行多次插入(在单独的事务中逐个进行)时,它会增加1. 当我通过phpR_402_11845@yadmin使用相同的SQL查询时,它总是增加1. 在提到的INSERT之
当我在 PHP过程中通过 PHP MysqLi API在Windows上使用预准备语句进行简单插入时,定义的AUTO_INCREMENT列增加2而不是1:

INSERT INTO `table` (`name`) VALUES (?)

一个PHP进程中进行多次插入(在单独的事务中逐个进行)时,它会增加1.

当我通过@L_840_5@myadmin使用相同的SQL查询时,它总是增加1.

在提到的INSERT之前或之后没有其他INSERT或updatE语句.之前只有一个SHOW和一些SELECT语句.

我找不到这个问题的原因.造成这种行为的原因是什么?

这里主要代码部分:

<?PHP

class DB
{
    private function __construct($host,$username,$password,$scheR_402_11845@a,$port,$socket)
    {
        if(is_null(self::$DB))
        {
            self::$DB = new \MysqLi((String) $host,(String) $username,(String) $password,(String) $scheR_402_11845@a,(int) $port,(String) $socket);
            self::$DB->set_charset('utf8');

        }
    }
    // [...]
    public function __destruct()
    {
        if(!is_null(self::$DB))
            self::$DB->close();
    }
    // [...]
    public static function connect($host = '',$username = '',$password = '',$scheR_402_11845@a = '',$port = 0,$socket = '')
    {
        if(is_null(self::$instancE))
        {
            $MD = new \MysqLi_driver();
            $MD->report_mode = MysqLI_REPORT_ERROR | MysqLI_REPORT_StriCT;
            // [...]
            self::$instance = new self($host,$socket);
        }

        return self::$instance;
    }
    // [...]
    public static function __callStatic($name,$args)
    {
        self::connect();

        switch(true)
        {
            case in_array($name,array('insert','SELEct','update','delete','show','describe','explain')):

            $query = isset($args[0]) ? (String) $args[0] : '';
            $vals = isset($args[1]) ? $args[1] : array();
            $SELEct = isset($args[2]) ? trim((String) $args[2]) : 'array';
            $empty = isset($args[3]) ? $args[3] : array();
            $types = isset($args[4]) ? trim((String) $args[4]) : '';

            return self::dml(in_array($name,array('show','explain')) ? 'SELEct' : $name,$query,$vals,$SELEct,$empty,$types);

            break;
        }
    //[...]
    }

    // [...]
    public static function dml($type,$vals = array(),$SELEct = 'array',$empty = array(),$types = '')
    {
        // [...]
        if(!empty($vals) || mb_strpos($query,'?') !== falsE)
        {
            if(!$stmt = self::$DB->prepare($query))
                throw new DBException('Failed to prepare statement '.htmlspecialchars($query).PHP_EOl.self::$DB->error.' ('.self::$DB->sqlstate.').');

            $args = array();

            if(empty($types))
            {
                foreach($vals as &$val)
                {
                    $t = gettype($val);

                    if($t == 'String' || $t == 'NULL')
                        $types.= 's';
                    elseif($t == 'Integer' || $t == 'Boolean')
                        $types.= 'i';
                    elseif($t == 'double' || $t == 'float')
                        $types.= 'd';
                    else
                        throw new DBException('Its not possible to automatically assign a value of type '.$t.'. Please specify the corresponding types manually.');
                    $args[] = $val;
                }
            }
            else
            {
                foreach($vals as &$val)
                    $args[] = $val;
            }

            array_unshift($args,$types);

            $RC = new \ReflectionClass($stmt);

            $RM = $RC->getmethod('bind_param');

            if(!$RM->invokeArgs($stmt,$args))
                throw new DBException('Failed to bind params.'.PHP_EOl.self::$DB->error.' ('.self::$DB->sqlstate.').');

            if(!$stmt->execute())
                throw new DBException('Failed to execute Statement.'.PHP_EOl.self::$DB->error.' ('.self::$DB->sqlstate.').');

            if($type == 'SELEct')
            {
                // [...]
            }
            else
            {
                $return = $type == 'insert' && self::$DB->insert_id > 0 ? self::$DB->insert_id : self::$DB->affected_rows;
                $stmt->close();
                return $return;
            }
        }
        else
        {
            // [...]
        }
    }
}
?>

和:

echo DB::insert("INSERT INTO `table` (`name`) VALUES (?)",["test"]);

Query-Log显示2个插入.这会导致额外的增量.但是,当我将回声放入相应的DB :: dml() – 方法时,它只输出一次,因此调用一次. MysqL-query-log:

151026 12:54:49     3 Connect   XXX@localhost on XXX
 3 Query    SET NAMES utf8
        3 Query SELECT DATABASE() AS `scheR_402_11845@a`
        3 Query SHOW GRANTS FOR CURRENT_USER
        3 Prepare   INSERT INTO `table` (`name`) VALUES (?)
        3 Execute   INSERT INTO `table` (`name`) VALUES ('tesTinsert22')
        3 Close stmt    
        3 Quit  
        4 Connect   XXX@localhost on XXX
        4 Query SET NAMES utf8
        4 Query SELECT DATABASE() AS `scheR_402_11845@a`
        4 Query SHOW GRANTS FOR CURRENT_USER
        4 Prepare   INSERT INTO `table` (`name`) VALUES (?)
        4 Execute   INSERT INTO `table` (`name`) VALUES ('tesTinsert22')
        4 Close stmt    
        4 Quit

解决方法

好.我终于明白了.
问题是:我将所有请求重定向到我的index.PHP并使用PHP完成所有其他请求.我用简单的输出测试了一些类行为.其中一项测试导致了上述问题.
我检查了apache访问日志,发现重复的favicon.ico请求.这些请求 – 由主流浏览器自动生成(另请参见 How to prevent favicon.ico requests?) – 也可以访问index.PHP – 看起来有些重定向到浏览器? 通常这都是在我的应用程序框架中处理的,但我在测试时禁用了它.

大佬总结

以上是大佬教程为你收集整理的Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2全部内容,希望文章能够帮你解决Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。