PHP问题


1、PHP echo 和 print 语句

echo 和 print 之间的差异:

  • echo - 能够输出一个以上的字符串
  • print - 只能输出一个字符串,并始终返回 1  

提示:echo 比 print 稍快,因为它不返回任何值。

      echo 和print都是语言结构,也就是关键字,不是函数。使用的时候不用加括号,加上也可以。echo可以用逗号隔开(print可以用.点号)显示多个值 。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候什么都没有。
print只能打印出简单类型变量的值(如int,string) 
print_r可以打印出复杂类型变量的值(如数组,对象)

2、单引号和双引号的区别


    ” ” 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。


    ‘ ‘ 单引号里面的不进行解释,直接输出。单引号的内容不会被解析,效率更高。

1、双引号内不能直接就再嵌套双引号

2、双引号与单引号互相嵌套使用

如:

双引号内直接嵌套单引号

[php]  view plain  copy
  1. echo "<script language='javascript'> alert('插入成功');</script>" ;  
  2. echo"<script language='javascript'>history.go(-2);</script>";  

3、php中单引号内的变量不能被解释

[php]  view plain  copy
  1. $c = 1;  
  2. echo "$c";           //输出1  
  3. $c = 1;  
  4. echo '$c';           //输出$c  
但是当用在sql语句中时当引号内有变量需要被解释时
如SQL语句可以写成:
[php]  view plain  copy
  1. $sql = "select * from user where id = '$id'";  
  2. $sql = "insert into user (`user`,`pwd`) values ('$a','$b')";  
  3. $sql = "select * from user where id = {$id}";  
  4. $sql = "insert into xadmin values ('','".$_POST['User']."','".$Pwd."','".$Xb."','".$Xydm."','".$_POST['Lxr']."','".$_POST['Lxdh']."','".$_POST['E_mail']."')";  
变量都是可以被解释的

对数据库里面的SQL语句赋值的时候也要用在双引号里面SQL="select a,b,c from ..."
但是SQL语句中会有单引号把字段名引出来
例如:select * from table where user='abc';
这里的SQL语句可以直接写成SQL="select * from table where user='abc'"
但是如果象下面:
$user='abc';
SQL1="select * from table where user=' ".$user." ' ";对比一下
SQL2="select * from table where user=' abc ' "
我把单引号和双引号之间多加了点空格,希望你能看的清楚一点。
也就是把'abc' 替换为 '".$user."'都是在一个单引号里面的。只是把整个SQL字符串分割了。
SQL1可以分解为以下3个部分
1:"select * from table where user=' "
2:$user
3:" ' "
字符串之间用 . 来连接

4、用\来转义实现双引号内嵌套双引号(尤其是有变量的时候,双引号内的变量能被解释)

[php]  view plain  copy
  1. function error($str,$url="")         
  2. {  
  3.    if($url!="")  
  4.    {  
  5.     echo"<meta http-equiv=\"refresh\" content=\"0;URL=$url\">";  
  6.     exit();  
  7.    }  
  8.    else  
  9.    {  
  10.     echo"<script language=\"JavaScript\" type=\"text/JavaScript\"> alert(\"$str\");history.back(-1);</script>";  
  11.    }  
  12.    exit();  
  13. }  
也可以写在这样
[php]  view plain  copy
  1. echo "<script language='javascript'>alert(\"$str\")</script>";  


3、转义


addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(')
  • 双引号(")
  • 反斜杠(\)
  • NULL

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符

]

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据。


不要使用magic_quotes_gpc指令或它的"幕后搭挡"-addslashes()函数,此函数在应用程序开发中是被限制使用的,并且此函数还要求使用额外的步骤-使用stripslashes()函数。 
· 相比之下,mysql_real_escape_string()函数更为常用,但是也有它自己的缺点。

 


3、HTTP中GET和POST的区别


GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

  (1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

  * 注意:这里安全的含义仅仅是指是非修改信息。(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。

http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html


1.GET请求的数据会附在URL之后 POST把提交的数据则放置在是HTTP包的包体中


POST的安全性要比GET的安全性高。

比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为

(1)登录页面有可能被浏览器缓存,

(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,

除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。


Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",

实质上,GET和POST只是发送机制不同,并不是一个取一个发!


传言1:GET方式对长度有限制;POST方式对长度没限制。
回答:长度限制之说一方面是HTTP客户端(如IE限定URL长度为2083字节,opera 是4050, Netscape 是8192)的限制;另一方面服务器的实现也加入了限制(如果URL长度过长,HTTP服务器会报414错误)。但HTTP协议及URL官方说明均对长度限制则没有规定。

 

传言2:GET是从服务器上获取数据;POST是向服务器传送数据。
回答:GET方式就没有向服务器传送数据?那么URL中的?子句送的是什么?不论是GET还是POST,都可以向服务器传送数据,只不过传送数据的位置不同;不论是GET还是POST,都要从服务器上获取数据,否则IE浏览器拿什么东西给我们看呢?关键的问题是
GET的主要任务是获得数据,但在获得数据前也可以向服务器提交一些数据; 
POST的主要任务是提交数据,但在提交数据之后服务器也会向用户端返回一些显示用的数据。

 

传言3:GET不安全,用户能从地址栏上看到传送的数据;POST安全,用户不能从地址栏上看到传送的数据。
回答:POST方式看不到传送的数据是因为IE浏览器做了限制。如果你通过第三方工具看到了POST方式传送的数据,你还能说POST方式是安全的吗?理论上说GET和POST方式都不安全,要不就用不着研究HTTPS了。



4、PHP类和对象之构造函数和析构函数

PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

class Car {
   function __construct() {
       print "构造函数被调用\n";
   }
}
$car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串

在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

class Car {
   function __construct() {
       print "父类构造函数被调用\n";
   }
}
class Truck extends Car {
   function __construct() {
       print "子类构造函数被调用\n";
       parent::__construct();
   }
}
$car = new Truck();

同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

class Car {
   function __construct() {
       print "构造函数被调用 \n";
   }
   function __destruct() {
       print "析构函数被调用 \n";
   }
}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数

当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。



5、PHP类和对象之Static静态关键字

静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用。静态属性不允许对象使用->操作符调用。

class Car {
    private static $speed = 10;
    
    public static function getSpeed() {
        return self::$speed;
    }
}
echo Car::getSpeed();  //调用静态方法

静态方法也可以通过变量来进行动态调用

$func = 'getSpeed';
$className = 'Car';
echo $className::$func();  //动态调用静态方法

静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

class Car {
    private static $speed = 10;
    
    public static function getSpeed() {
        return self::$speed;
    }
    
    public static function speedUp() {
        return self::$speed+=10;
    }
}
class BigCar extends Car {
    public static function start() {
        parent::speedUp();
    }
}

BigCar::start();
echo BigCar::getSpeed();

6、PHP include 和 require 语句

通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。

include 和 require 语句是相同的,除了错误处理方面:

  • require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
  • include 只生成警告(E_WARNING),并且脚本会继续

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。


7、empty()和isset()的区别

empty()和isset()的处理对象无外乎未定义变量,0,空字符串。 
如果变量为0,则empty()会返回TRUE,isset()会返回TRUE; 

如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE; 
如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE; 

手册中对empty()的解释如下: 

描述bool empty( mixed var ) 
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,”"、0、”0″、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。 
手册中对isset()的解释如下: 

isset()检测变量是否设置 

描述bool isset ( mixed var [, mixed var [, ...]] ) 

如果 var 存在则返回 TRUE,否则返回 FALSE。 

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”?”)并不等同于 PHP 的 NULL 常数。 
警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。 

当要 判断一个变量是否已经声明的时候 可以使用 isset 函数 
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty 函数 
当要 判断 一个变量 存在且不为空 先isset 函数 再用 empty 函数


8、 MYSQL优化方法

没索引与有索引的区别

优点:

当表中有大量记录时,若要对表进行查询,如果没用建立索引,搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;如果在表中针对一些字段建立了索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

缺点:

当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

分页优化

MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要的,所以n越大,性能会越差。

一般的分页做法,测试耗时 10.961s

 
 
  1. SELECT * FROM v_history_data  LIMIT 5000000, 10

优化后,测试耗时 1.943s

 
 
  1. SELECT * FROM v_history_data INNER JOIN (SELECT fid FROM t_history_data LIMIT 5000000, 10) a USING (fid)

优化前的SQL需要更多I/O浪费,因为先读索引,再读数据,然后抛弃无需的行。而优化后的SQL(子查询那条)只读索引(Cover index)就可以了,然后通过member_id读取需要的列

多使用触发器

表格拆分

大表垂直或者水平拆分。一般是水平拆分

尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。

Mysql 服务配置优化

MySQL参数的优化:内存中会为MySQL保留部分的缓冲区。这些缓冲区可以提高MySQL的速度。缓冲区的大小都是在MySQL的配置文件中进行设置的。

下面对几个重要的参数进行详细介绍:

key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快

table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。

query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0.

Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。

Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。

Sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。

Innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。这个值越大,查询的速度就会越快。这个值太大了就会影响操作系统的性能。

第一优化你的sql和索引;

第二加缓存,memcached,redis;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值