Windows上的PHP / MySQLi:插入MySQL innoDB表将AUTO_INCREMENT
发布时间:2020-12-14 05:38:22 所属栏目:Windows 来源:网络整理
导读:当我在 PHP过程中通过 PHP mysqli API在Windows上使用预准备语句进行简单插入时,定义的AUTO_INCREMENT列增加2而不是1: INSERT INTO `table` (`name`) VALUES (?) 在一个PHP进程中进行多次插入(在单独的事务中逐个进行)时,它会增加1. 当我通过phpmyadmin使用
当我在
PHP过程中通过
PHP mysqli API在Windows上使用预准备语句进行简单插入时,定义的AUTO_INCREMENT列增加2而不是1:
INSERT INTO `table` (`name`) VALUES (?) 在一个PHP进程中进行多次插入(在单独的事务中逐个进行)时,它会增加1. 当我通过phpmyadmin使用相同的SQL查询时,它总是增加1. 在提到的INSERT之前或之后没有其他INSERT或UPDATE语句.之前只有一个SHOW和一些SELECT语句. 我找不到这个问题的原因.造成这种行为的原因是什么? 这里主要代码部分: <?php class DB { private function __construct($host,$username,$password,$schema,$port,$socket) { if(is_null(self::$DB)) { self::$DB = new MySQLi((string) $host,(string) $username,(string) $password,(string) $schema,(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 = '',$schema = '',$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 `schema` 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 `schema` 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 nanooserver可以在Linux docker中运行吗
- windows-7 – 是否可以在不重启的情况下卸载内核
- windows-phone-7 – 如何在Windows Phone 7中调用
- windows-server-2016 – 启用存储空间Direct Ser
- Windows上的路由信息??是否有C/C++ API?
- windows – 将exec’d批处理文件中的退出代码传播
- .net – 如何使用AutoIt或Windows UI Automation
- 如何判断Windows内核事件对象是自动重置还是手动
- windows – 我可以调整远程桌面会话的屏幕分辨率
- windows-server-2003 – 更换W2K3域控制器 – 我
热点阅读