【PHP ThinkPHP框架】小bug汇总[更新]
目录结构 1.函数调用 2.绑定select下拉框数据 3.PHP查询功能 4.格式化时间和价钱 7.新增信息或者修改信息的自动验证和自动填充 8.验证码 9.NotFound 10.字符串处理函数 11.单引号和双引号 最近开始接触PHP编程语言,遇到各种小问题,不断总结,不断进步。由
目录结构
1.函数调用
2.绑定select下拉框数据
3.PHP查询功能
4.格式化时间和价钱
7.新增信息或者修改信息的自动验证和自动填充
8.验证码
9.NotFound
10.字符串处理函数
11.单引号和双引号
最近开始接触PHP编程语言,遇到各种小问题,不断总结,不断进步。由于一开始就用上了ThinkPHP框架,所以不知道和一般的PHP项目有什么区别。有待研究。
1.函数调用
可能是因为我比较菜鸟,刚开始学习编写PHP页面,还没有写控制器,在页面中调试的时候调用了dump()函数,我是这么写的:$dump($pageCount);结果报错了,错误是:php function name must be a string.
大神们别喷,实在是太菜了有木有。然后我改成了dump($pageCount);,错误解决了,原来是调用函数的时候不加'$'符号,看来不能盲目使用编程语言的特殊符号啊。
2.绑定select下拉框的数据
之前想了好久该怎么绑定,想着应该和C#差不多,可就是找不到好的办法,都差点用js写了,后来发现了更加简便的方法。
代码是这样的:
<span>1</span> <select name="select1" id="select1"> <span>2</span> <volist name="selectitems" id="row"> <span>3</span> <option value="{<span>$row</span>.id}">{<span>$row</span>.title}</option> <span>4</span> </volist> <span>5</span> </select>
3.PHP查询功能
终于能成功查询了,费了不少劲儿。发现其实比较简单,只是刚开始接触,不懂很多语法规则之类的,光写一个sql语句解析都写了半天。具体功能很简单,就是在首页做一个查询功能,一个下拉列表选择模块,一个文本框输入关键字,一个按钮进行查询:
这块就不用再详细分析了,上面都说了,接下来就是写一个控制器,控制器中的代码如下:
<span>public</span> <span>function</span><span> index() { </span><span>$searchs</span>=<span>$_POST</span>['search'];<span>//</span><span>接收post传来的参数</span> <span>$selectedID</span>=<span>$_POST</span>['selectedID'];<span>//</span><span>同传参数</span> <span>$condition</span>['category_id']=<span>array</span>('eq',<span>$selectedID</span>);<span>//</span><span>定义查询规则</span> <span>$condition</span>['title']=<span>array</span>('like','%'.<span>$searchs</span>.'%'<span>); </span><span>$resultList</span>=<span>$this</span>->dao->where(<span>$condition</span>)->select();<span>//</span><span>查询数据集</span> <span>$this</span>->assign('searchResultList',<span>$resultList</span>);<span>//</span><span>赋值</span> <span>$this</span>-><span>display(); }</span>
控制器查询出数据并且已经保存好了,接下来就是视图显示了,视图只需要将保存好的查询结果数据集显示出来就好了:
<volist name="searchResultList" id="row"> <li> <span>{<span>$row</span>.create_time|<span>date</span>="Y-m-d",<span>#</span><span>##}</span></span> <a href="%7B<span>%24row</span>.link_url%7D" target="_blank">{<span>$row</span>.title}</a> </li> </volist>
好了,纠结了一整天的查询功能就分分钟做好了。
4.格式化时间和价钱
价钱格式化:{$p.sale|number_format=###, 2, '.', ''} 两位有效数字
时间格式化:{$p.time|date='Y-m-d H:i:s',###} 年月日时分秒
if condition="<span>$row</span>.name eq <span>$col</span>['name']"> ==需要的操作== <span>if</span>>
<eq name="”item.group_id”" value="”<span">$one.group_id”> 这里注意name不带$,value带$.</eq>
7.新增信息或者修改信息的自动验证和自动填充
自动验证部分是框架自带的验证,需要在项目的lib目录下Model文件夹里创建一个和需要验证的数据所在数据表同名的类文件,说简单了就是这个类的名字需要和我们添加或者修改数据的表的名字一致,比如,表的名字是think_user,类的名字就是UserModel.class.php。这里需要说一句题外话,如果表的名字和Model类名字不一致,需要在类里面声明表名:
<span>protected</span> <span>$tableName</span> = 'think_user'; //这里的think_user就是数据表的名称
这个类里面写验证信息,当Action类当中调用了create()方法的时候就会进行自动验证了,具体验证的写法如下:
<span>php </span><span>class</span> UserModel <span>extends</span><span> Model {</span><span><br> //自动验证 </span><span>protected</span> <span>$_validate</span> = <span>array</span><span>( </span><span>array</span>('username','require','请输入用户名'), //用户名必须输入 <span>array</span>('username', '', '用户已存在', 0,'unique',1), //用户名唯一性验证 <span>array</span>('password', 'require', '登录密码必填', 1), //密码必须 <span>array</span>('PID','^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$','请填入正确的身份证号',1), //身份证号验证 <span>array</span>('address','require','地址必须填',1), //地址必须 <span>array</span>('cellphone','number','手机号为11位数字',1), //手机号 <span>array</span>('email','email','Email格式不符合',1), //Email格式 <span>array</span>('telephone','\d{3}-\d{8}|\d{4}-\{7,8}','电话格式不正确',1), //国内电话号 <span>array</span>('repassword','password','确认密码不正确',0,'confirm'), //确认密码是否正确 <span> );<br> //自动填充<br> protected $_auto=array(<br> array('create_time','time','doRegist','function'), //在增加时自动将时间擢填入表中<br> );</span><span> } </span>?>
这里有一点需要注意,官方文档中有这么一句话:如果定义了字段映射的话,这里的验证字段名称应该是实际的数据表字段而不是表单字段。
Action中要这样写:
<span>$user</span>=D('User'<span>); //实例化Model类 </span><span>$daoCreate</span>=<span>$user</span>-><span>create(); //创建新增数据的model 验证在这时候就起作用了</span> <span>if</span>(<span>$daoCreate</span><span>) { </span><span>$daoAdd</span> = <span>$user</span>-><span>add(); </span><span>if</span>(<span>false</span> != <span>$daoAdd</span><span>){ </span><span>.... //成功</span><span> } </span><span>else</span><span>{ .... //失败</span><span> } }</span><span>else</span><span>{ </span><span>exit</span>(<span>$user</span>-><span>getError()); //输出验证结果 }</span>
View当中就写需要添加的数据就行了,这样:
8.验证码
我现在用的是3.1.3版本的TP,框架不是完整版,所以我又从完整版里面拷贝了一个Extend文件夹替换了现在这个,因为所有扩展包都在完整版里面有。
要实现验证码功能,只需要在控制器内添加一个生成验证码的方法即可:
<span>public</span> <span>function</span><span> verify() { import(</span>'ORG.Util.Image'<span>); </span><span>ob_end_clean</span><span>(); //<span>很关键,如果Image.class.php文件里的output方法中没有调用ob_clean();方法,那么这里需要写,可以防止出现“载入指定URL失败”的错误</span></span><span> Image</span>::<span>buildImageVerify(); }</span>
import 方法是 ThinkPHP 内置的类库和文件导入方法,上例导入的文件为 ThinkPHP 系统目录下 Lib/ORG/Util/Image.class.php 文件。所以要保证这个目录下的文件存在,如果没有这个目录,创建一个,并且将完整版里面的Image.class.php文件拷贝到该目录下就可以使用了。
视图文件中只需要调用方法就能正常显示验证码了:
<span><span>img </span><span>src</span><span>="{:U('Public/verify')}"</span><span> align</span><span>="absmiddle"</span><span> title</span><span>="如果您无法识别验证码,请点图片更换"</span><span> id</span><span>="verifyImage"</span><span> onclick</span><span>=resetVerifyCode() </span><span>/></span> <span><span>input </span><span>type</span><span>="text"</span><span> name</span><span>="verifyCode"</span><span> id</span><span>="verifyCode"</span><span> size</span><span>="8"</span><span> maxlength</span><span>="4"</span> <span>/></span></span></span>
同时要写一个js脚本来实现点击图片刷新验证码的功能:
<script type="text/javascript"> <span>function<span> resetVerifyCode(){ $("#verifyImage").attr('src', "{:U('Public/verify/',0,0,0)}/__"+<span> Math.random()); } </script>
这里注意一个细节:路径里面在“{:U('Public/verify/',0,0,0)}/__”里,verify后面必须有一个“/”,或者写在"__"前面,这样"/__",而我这里为什么两个地方都写了呢,因为这里只在verify后面添加"/"出现一个问题,就是F5刷新界面的时候可以显示验证码无误,可是点击的时候刷新不出验证码,使用了页面调试发现错误是“加载指定URL失败”,问题就出在解析后的验证码路径中verify后面没有“/”,于是我就在“__”前面添加,这样问题就解决了。
9.ThinkPHP "NotFound"错误
刚部署PHP项目的时候不太了解URL生成和重写之类的知识,总是会出现如下错误:
Not Found
The requested URL /Public/login was not found on this server.
后来发现是URL_MODEL设置问题,一般设置成1就不会有问题,设置为其他会出现问题,这个不知道是为什么,有待解决,先记录在这。
10.字符串处理的一些常用函数
.trim():将字符串末尾的逗号去掉
trim($string,',');
.strstr():返回字符串中,逗号出现的位移量,如果没有出现逗号则返回false
$index=strstr($string,',');
.explode():将字符串用‘-’分开返回一个数组,类似于split()
explode("-",$string);
.array_intersect($array1,$array2):返回两个数组中相同的部分,求交集
$sameitems=array_intersect($array1,$array2);
.array_diff():返回两个数组的差集
$different=array_diff($array1,$array2);
.str_replace('a','b',$str):将字符串$str中的a换成b
$str=str_replace('a','b',$str);
11.单引号和双引号
在PHP中,单引号和双引号的处理是不相同的,双引号中的内容可以被解释和替换,而单引号中的内容总被认为是普通字符。
比如:
$str = 7;
echo "str is $str"; // 打印结果: str is 7
echo 'str is $str'; // 打印结果: str is $str
echo "str is $str\n"; // 打印结果: str is 7 (同时换行)
echo 'str is $str\n'; // 打印结果: str is $str\n
所以在某些函数,比如str_replace()中需要使用双引号,这样才能正确替换字符串。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。
