大佬教程收集整理的这篇文章主要介绍了Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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
以上是大佬教程为你收集整理的Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2全部内容,希望文章能够帮你解决Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT列增加2所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。