1 避免一個預定義變量賦給多處。如果是string類型,會過濾掉所有錯誤的過濾條件。
見以下代碼的輸出
public function testSql()
{
$fileID = array("dbc", null);
$loginID = "";
$result = M("user")->where("userID='%s' or email='%s'", $loginID)->find();
echo M()->getLastSql() . "<br>";
$resutl2 = M("file")->where("filekey=%d or fileID=%d", $fileID)->find();
echo M()->getLastSql() . "<br>";
$data['fileID'] = array("in", $fileID);
$result = D("File")->where($data)->find();
echo M()->getLastSql() . "<br>";
}
輸出
SELECT * FROM `user` LIMIT 1
SELECT * FROM `file` WHERE ( filekey=0 or fileID=0 ) LIMIT 1
SELECT * FROM `file` WHERE ( `fileID` IN ('dbc',null) ) LIMIT 1
如果是%s,則會把where條件都過濾掉了,可能造成很驗證的後果。
2 數組遍歷的引用問題
若數組遍歷使用了引用,當再次遍歷該數組的時候,不要用同樣的變量名。否則最後一個數組的值會被倒數第二個覆蓋掉。
解決辦法:變量名不要重複,換一個新的變量。
foreach ($issueData as $p => &$issue) {
if (!$issue['hidden'] && $issue['price'] && (int)($issue['price']) === 0) {
$issue['access'] = TRUE;
} elseif ($userData) {
$issueID = $issue['issueID'];
$issue["access"] = $userData[$issueID] ? true : false;
} else {
$issue["access"] = FALSE;
}
}
$responseData = array();
foreach ($issueData as $i => $issue) {
if ($issue['hidden']) {
if ($userToken && $issue['access']) {
$responseData[] = $issue;
}
} else {
$responseData[] = $issue;
}
}
修改後的code
foreach ($issueData as $p => &$issue) {
if (!$issue['hidden'] && $issue['price'] && (int)($issue['price']) === 0) {
$issue['access'] = TRUE;
} elseif ($userData) {
$issueID = $issue['issueID'];
$issue["access"] = $userData[$issueID] ? true : false;
} else {
$issue["access"] = FALSE;
}
}
$responseData = array();
foreach ($issueData as $i => $item) {
if ($item['hidden']) {
if ($userToken && $item['access']) {
$responseData[] = $item;
}
} else {
$responseData[] = $item;
}
}
測試代碼
$data=array();
$arr=array("abc","efg");
$arr2=array("rtrt","yyy");
foreach ($arr as $k => &$v) {
$v=$v.$k;
}
print_r($arr);
foreach ($arr2 as $k => $v) {
$data[]=$v;
}
print_r($data);
print_r($arr);
輸出
Array ( [0] => abc0 [1] => efg1 ) Array ( [0] => abc0 [1] => abc0 ) Array ( [0] => abc0 [1] => abc0 )
分享到:
相关推荐
【标题】:“TP6使用RabbitMQ” 在PHP框架ThinkPHP6(简称TP6)中集成RabbitMQ是一项常见的任务,用于实现异步处理、消息队列和分布式系统的通信。RabbitMQ是一个开源的消息代理和队列服务器,它遵循AMQP(Advanced...
在PHP开发中,尤其是使用了Laravel或ThinkPHP5(TP5)这样的现代框架时,`namespace` ...在压缩包中的`demo` 文件可能包含了一些关于如何在TP5中使用`namespace` 和 `use` 的示例代码,你可以参考这些例子来加深理解。
同时,避免在命令中包含敏感信息,因为它们可能会被记录在日志中。如果可能,使用环境变量来存储这些信息。 6. **错误处理与日志记录**: 在命令行模式下运行脚本时,错误通常不会自动显示,因此需要在代码中添加...
- **安全编码**:避免SQL注入、XSS攻击等,使用预编译语句,过滤或转义用户输入。 8. **测试与文档** - **自动化测试**:使用PHPUnit等工具编写单元测试和集成测试,确保接口的正确性。 - **API文档**:使用...
同时,合理规划数据库的使用,避免频繁的跨数据库操作,以提高系统的性能。 在实际项目中,可能还会涉及到数据库读写分离、分布式数据库等复杂情况。在这种情况下,可以利用ThinkPHP3提供的数据库路由规则或者...
7. **使用方法**: 在ThinkPHP项目中,开发者可以先通过Composer安装PHPMailer,然后在控制器或服务类中实例化PHPMailer对象,设置发件人、收件人、主题、正文等参数,并调用相应的发送方法。如果使用OAuth,还需要...
【描述】中的"tp5.1+swoole+redis实战直播平台 (学习版)-tp5live"进一步确认了这个项目是用于教学目的,旨在帮助开发者理解如何在实际项目中应用这些先进的PHP技术和工具。 **ThinkPHP5.1** ThinkPHP5.1是ThinkPHP...
3. **添加内容**:添加文本、段落、标题等可以使用`addSection()`方法创建新段落,然后使用`addText()`方法添加文本。 ```php $section = $phpWord->addSection(); $section->addText('这是一段测试文本'); ```...
5. 使用Writer对象的`writeFile()`或`save()`方法将内容保存到本地或在线存储。 在开发过程中,可能还会遇到网上的教程或示例代码中存在的bug。这些bug可能源于版本差异、环境配置不一致或错误的理解。遇到问题时,...
在描述中提到,“使用方法是将方法添加到Image类中,直接调用使用”,这暗示了这个解决方案可能涉及到对ThinkPHP内置的`Image`类进行扩展,添加一个新的方法来生成透明圆角的图片。这种做法通常是为了避免对原框架的...
标题 "tp5.1消息队列 think-queue" 指的是使用ThinkPHP5.1框架集成的消息队列组件——think-queue。消息队列在软件开发中扮演着重要角色...理解其安装、配置、使用方法以及应用场景,对于优化ThinkPHP5.1项目至关重要。
### gmars/tp5-rbac拓展包使用方法 在安装并配置好拓展包之后,你可以按照以下步骤使用gmars/tp5-rbac拓展包来实现权限管理: 1. **创建和初始化Rbac所需数据库表** 使用拓展包提供的方法来创建和初始化所需的...
标题“文件批量上传 tp+layui”表明我们要讨论的是一个基于ThinkPHP(简称tp)框架和Layui前端组件库实现的文件批量上传功能。Layui是一个轻量级的前端框架,提供了丰富的UI组件,而ThinkPHP则是一个流行的PHP开发...
在进行单元测试时,还可以考虑使用模拟(Mock)对象来隔离被测试的代码,避免外部依赖对测试的影响。ThinkPHP的单元测试支持使用`Mockery`库来创建和配置模拟对象。通过模拟对象,可以控制方法的返回值或行为,以...
标题 "TP5 上传文件" 指的是使用 ThinkPHP5 (TP5) 框架进行文件上传操作。在 PHP 开发中,ThinkPHP5 是一个广泛应用的 MVC 框架,它提供了丰富的功能和良好的文档支持,使得开发者能够快速、高效地构建 Web 应用。...
本示例"tp3.2 -webuploader较大视频文件分段上传方法"正是针对大体积视频文件,采用分段上传策略来解决上传速度和服务器压力的问题。 首先,我们需要了解ThinkPHP 3.2框架。这是一个MVC(Model-View-Controller)...
在PHP开发中,ThinkPHP5(简称TP5)是一个广泛使用的框架,它极大地简化了Web应用程序的开发过程。本篇文章将深入探讨TP5中的面向对象编程(OOP)概念以及命名空间的使用。 **面向对象编程(OOP)** 面向对象编程...
此外,避免在查询中使用`$where`操作符,因为它会导致全表扫描,效率低下。利用TP6的`raw()`方法,可以直接执行MongoDB的原生查询,以利用其高级查询功能。 最后,关于事务支持,虽然MongoDB4.0版本开始引入了多...
在TP中,你可以使用`curl_init`、`curl_setopt`等函数,或者直接使用TP提供的`curl_request`方法。 6. **安全注意事项** - 保护好你的AppKey和MasterSecret,不要暴露在客户端或者公开的代码中。 - 使用HTTPS协议...
- **性能优化**:避免在分页查询中使用`JOIN`操作,因为这会导致全表扫描,影响性能。尽量只查询必要的字段。 - **安全考虑**:确保用户输入的页码经过验证,防止非法请求。 - **用户体验**:合理设定每页显示的记录...