IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Codeigniter4.0.4的一些Bug -> 正文阅读

[PHP知识库]Codeigniter4.0.4的一些Bug

1.部分方法存在可选参数后面跟必要参数的问题,不兼容PHP8。这个发现的比较早,只记得分布比较散,不清楚最新版有没有解决(主要是因为我懒得去翻了)。后面的问题比较好找,所以会持续关注最新版的,只要文中没说明那就依然存在。写这篇文章时最新版是4.1.4。
2.system/HTTP/IncomingRequest.php : getFiles方法
根据文档风格推断此处应当返回\CodeIgniter\HTTP\Files\FileCollection对象,而非array。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.system/Controller.php中initController应为__construct,同时system/CodeIgniter.php中createController方法内调用initController改为将参数传递给构造函数。搞不懂为什么放着构造函数不用偏要另搞一个initController。
Controller.php:
在这里插入图片描述
在这里插入图片描述
CodeIgniter.php:
在这里插入图片描述
在这里插入图片描述
4. \Config\Database::utils似乎是太监了,我自作主张已从CI3中复制了mysqli的backup方法。当然了,这个方法相当吃内存,所以只适用于少量数据的备份,量大的还是mysqldump更香。system/Database/MySQLi/Utils.php:

public function _backup(array $params = null)
{
	if (count($params) === 0)
	{
		return FALSE;
	}

	// Extract the prefs for simplicity
	extract($params);

	// Build the output
	$output = '';

	// Do we need to include a statement to disable foreign key checks?
	if ($foreign_key_checks === FALSE)
	{
		$output .= 'SET foreign_key_checks = 0;'.$newline;
	}

	foreach ( (array) $tables as $table)
	{
		// Is the table in the "ignore" list?
		if (in_array($table, (array) $ignore, TRUE))
		{
			continue;
		}

		// Get the table schema
		$query = $this->db->query('SHOW CREATE TABLE '.$this->db->escapeIdentifiers($this->db->database.'.'.$table));

		// No result means the table name was invalid
		if ($query === FALSE)
		{
			continue;
		}

		// Write out the table schema
		$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;

		if ($add_drop === TRUE)
		{
			$output .= 'DROP TABLE IF EXISTS '.$this->db->protectIdentifiers($table).';'.$newline.$newline;
		}

		$i = 0;
		$result = $query->getResultArray();
		foreach ($result[0] as $val)
		{
			if ($i++ % 2)
			{
				$output .= $val.';'.$newline.$newline;
			}
		}

		// If inserts are not needed we're done...
		if ($add_insert === FALSE)
		{
			continue;
		}

		// Grab all the data from the current table
		$query = $this->db->query('SELECT * FROM '.$this->db->protectIdentifiers($table));

		if ($query->numRows === 0)
		{
			continue;
		}

		// Fetch the field names and determine if the field is an
		// integer type. We use this info to decide whether to
		// surround the data with quotes or not

		$i = 0;
		$field_str = '';
		$is_int = array();
		while ($field = $query->resultID->fetch_field())
		{
			// Most versions of MySQL store timestamp as a string
			$is_int[$i] = in_array(strtolower($field->type),
						array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
						TRUE);

			// Create a string of field names
			$field_str .= $this->db->escapeIdentifiers($field->name).', ';
			$i++;
		}

		// Trim off the end comma
		$field_str = preg_replace('/, $/' , '', $field_str);

		// Build the insert string
		foreach ($query->getResultArray() as $row)
		{
			$val_str = '';

			$i = 0;
			foreach ($row as $v)
			{
				// Is the value NULL?
				if ($v === NULL)
				{
					$val_str .= 'NULL';
				}
				else
				{
					// Escape the data if it's not an integer
					$val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v;
				}

				// Append a comma
				$val_str .= ', ';
				$i++;
			}

			// Remove the comma at the end of the string
			$val_str = preg_replace('/, $/' , '', $val_str);

			// Build the INSERT string
			$output .= 'INSERT INTO '.$this->db->protectIdentifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline;
		}

		$output .= $newline.$newline;
	}

	// Do we need to include a statement to re-enable foreign key checks?
	if ($foreign_key_checks === FALSE)
	{
		$output .= 'SET foreign_key_checks = 1;'.$newline;
	}

	return $output;
}

5.CURLRequest中请求发送后返回的Response是同一个实例!作为小白也不知道这么干到底能节省多少开销,姑且跟着大神们的步子走吧。可好歹每次请求后把该重置的东西给清干净啊!body是每次都重置了,可是开发组似乎遗忘了headers???在某些需要从headers中读取数据的API中,这种不干净的处理会导致后面的请求读了前面的数据,比如阿里云的OSS相关API。我的办法是先修改Message类,在system/HTTP/Message.php中新增一个clearHeaders方法,然后修改system/HTTP/CURLRequest.php中的setResponseHeaders方法,在开头先清一下,然后再存入新的headers。
在这里插入图片描述
在这里插入图片描述
6.还是CURLRequest类,发起请求时,CI把客户端的headers直接转过去了,但是开发组似乎认为所有客户端请求都不会携带Content-Length,然而我今天却真真实实地遇上了:nginx代理fpm的时候,如果客户端请求类型是multipart/form-data,headers会带有Content-Length,把这玩意也转过去,API一不留神就把数据处理错了(比如支付宝的转账接口),然后请求就无法识别,然后就报错了。。。解决办法倒是很简单,在applyRequestHeaders方法中删除Host、Accept-Encoding那里加一行移除Content-Length就行。
在这里插入图片描述
暂时就发现这么些,后续如果有新发现还会在这里更新。写这个主要是自己记个笔记,同时也是分享踩坑经验,欢迎收藏,但请勿转载,谢谢!

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:03:46  更:2021-09-13 09:05:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 15:49:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码