【前言】
本文主要记录下PHP练习过程中踩过的坑,随着学习的深入不断补充积累
【主体】
这里记录下最近PHP踩过的坑,很多都是语法性错误
(1)函数结尾忘记加;
例如匿名函数
<?php $show = function($value){ echo $value."你好"; } $show("Tony"); ?>
写了个匿名函数,正常情况应该输出Tony 你好。但是这里报错,显示
解析错误:语法错误,在第13行的C:\ PHPTutorial \ WWW \ index.php中出现意外的'$ show'(T_VARIABLE)
找了半天才测试出是函数没有加;,而错误提示不能精准地定位到出错行
【总结】①函数先写好形势,加上;②在报错行附近找错误源
(2)函数忘记传参
函数规定了参数后就必须传参,除非参数设定了默认值
(3)提交form表单时,如果action为空,那么就会提交到当前页面
(4)①global后可以跟多个变量,例如global $a,$b,$c等等;②global只能传递变量,不能将其变为全局变量
(5)超全局变量$GLOBALS()不仅可以把变量转为全局变量,还可以进行修改
(6)JAVA,JS,PHP等代码都是从上到下,逐行读取的。PHP里若没有exit函数,则会读取完毕
(7)递归函数:自己调用自己
(8) 参数的数据类型
例如,系统内置函数举例copy()拷贝文件,两个参数必须为字符串
<?php if(copy('a.txt', 'b.txt')){ echo "复制成功"; }else{ echo "复制成功失败"; } ?>
(9)echo、print、print_r区别
①echo 是语言结构,不是函数或者方法,使用的时候可以不加括号,多用于单行字符串的输出。效率我记得是比print()高。
②print() 也是单行输出,但他是函数,使用时要把字符串做为参数传给print()函数。有些服务端程序用PHP来写的,输出会用到print();而不用echo ; 这个我不太清楚是什么原因……
③print_r () 可以用来遍历并输出数组的函数,我一般是在调试程序的过程中用来查看数组内容的。也可以用来输出单一的字符串。一般只在调试程序过程中使用。程序写好后,要把这东东去掉。
其他解释:
echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
print 是打印字符串
print_r 则是打印复合类型 如数组 对象
(10)修改php.int配置后无效?
所有配置修改,都需要重启Apache服务器才会生效。
(11)PHP入口文件index.php
(12)PHP除了通过php.int配置参数外,还可以通过ini_get()获取,ini_set()设置参数。不过只能作用在当前文件下
(13)MySQL数据库创建后,无法重命名
(14)删除和更新MySQL数据时,需要在尾部添加where条件。否则会对整个表单产生影响。
(15)注意:删除重要数据前要备份
(16)SQL 语句对大小写不敏感。所以查询语句SELECT 与 select 等效。
.(17)获取用户输入框输入时,记得去除两端空格trim()。去除左侧空格ltrim(),去除右侧空格rtrim()
(18)用户密码一般要进行m5加密,以加密方式存到数据库
(19)步骤:连接数据库,判断错误,设置字符集
$connect = mysqli_connect('localhost','root','root','user'); if(!$connect){ die("could not connect:".mysqli_error()); }else{ echo "连接成功<br>"; } mysql_set_charset('$connect','utf-8');//注意:连接点为字符串形式
(20)向上取整
每一页都是整数,包括最后一页。如计算出20.3个页面,则要向上取整函数ceil()
$one = 3; $two = 2; $result = $one / $two; echo ceil($result);//向上取整函数ceil()
(21)连接字符串,因为name等字段类型为char字符串类型,所以在解析的同时要在外面加上' '引号。
所以要写成name=' "$_POST['name']" ',这样才可以解析成name='name'的形式
(22)mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组 ,取一条记录
(23)隐藏ID的输入框,常用来传值,<input type='hidden' name='id'>
(24)utf-8文档编码;utf8为MySQL编码;
(25)密码必须加密md5(),验证时可以直接比对md5(pwd)即可。
(26)类里的方法结束时不能加;,否则会报错Parse error: syntax error, unexpected ';'
翻译为:语法错误,意外的;,语法错误会导致脚本终止
//声明一个类,实现其接口 class Super implements fly1,run1,water1{ //与抽象类和抽象方法相同,对于声明类里所带的接口, //必须对每个接口都进行一一实现,少一个也不行 public function fly($oil,$height){ echo "飞"; }; public function run($speed,$width){ echo "跑"; }; public function water($depth){ echo "游泳"; }; }
(27)PHP的命名空间语句位置必须在首行,否则会报错。且<?php必须顶行写
<!-- <meta charset="utf-8"> -->①没有顶行 <?php echo "56";②命名空间前有输出 namespace name;//命名空间---相当于创建了一个文件夹 class Test1{ public function __construct(){ echo "666"; } } new Test1(); ?>
以上都会导致报错:Fatal error: Namespace declaration statement has to be the very first statement in the script
翻译为:致命错误:命名空间声明语句必须是第脚本中的第一个语句
(28)面向对象的3大特征:封装、继承、多态
(29)拼接字符串报错
Parse error: syntax error, unexpected '='
翻译为解析错误:语法错误,意外的'='
查找后发现拼接字符串时.和=必须紧紧贴着,否则会解析错误
<?php $name = 'tony'; $name. = 'one';//这里没有紧贴,所以会报语法错误 echo $name; ?>
(30)去除空格或自定义字符
trim() -移除字符串两侧的空白字符或其他预定义字符
ltrim() - 移除字符串左侧的空白字符或其他预定义字符
rtrim() - 移除字符串右侧的空白字符或其他预定义字符
例如:
$sql = update user set name='tony',password='560',
上述插入操作需要去掉右侧的,
rtrim($sql,',')
(31)变量分配要放在模板展示前,否则$this->display()无法展示数据
(32)注意:TP模板中,如果if标签进行两个变量的比较,如果变量时数组并且用的是数组的点形式,则需要在 == 前后加空格,并且在最后的一个变量前加上空格
(33)表单重置
$('.clear').('click',function(){ $('form')[0].reset();//重置reset方法是js方法,所以需要jquery对象转换js对象 })