PHP学习笔记

目录

语法

---例子

---注释

变量

---例子

---作用域(local、global、static、parameter)

---echo与print

EOF

数据类型

类型比较

常量

字符串变量

并置运算符(.)

strlen()函数

strpos() 函数

PHP运算符

算数运算符

赋值运算符

递增/递减运算符

比较运算符

逻辑运算符

数组运算符

组合比较符

数组

数值数组

关联数组

数组排序

超级全局变量

魔术常量

命名空间

定义命名空间

子命名空间

面向对象

定义类

实例化

构造函数

继承

访问控制

接口

常量

抽象类

Static 关键字

Final关键字

PHP 表单和用户输入

PHP 获取下拉菜单的数据

PHP 下拉菜单多选

单选按钮表单

checkbox 复选框

PHP 表单验证

多维数组

格式化日期

PHP 包含文件

PHP include 和 require 语句

打开文件

关闭文件

逐行读取文件

逐字符读取文件

上传限制

保存上传的文件

创建Cookie

取回Cookie的值

删除 Cookie

Session

开始 PHP Session

存储Session变量

销毁Session

发送电子邮件

PHP 简易 E-Mail

PHP Mail 表单

防止 E-mail 注入

PHP错误处理

基本的错误处理:使用 die() 函数

创建自定义错误处理器

错误记录

PHP 异常处理

异常的基本使用

Try、throw 和 catch

创建一个自定义的 Exception 类

多个异常

相关函数:

重新抛出异常

设置顶层异常处理器

异常的规则

PHP过滤器

Validating 和 Sanitizing

选项和标志

验证输入

净化输入

过滤多个输入

使用 Filter Callback

JSON函数

PHP MySQL 

连接MySQL

创建数据库

创建表

插入数据

插入多条数据

预处理语句

从 MySQL 数据库读取数据

AJAX 与 PHP

AJAX 与 MySQL


新建一个名为xhr.html的html文件,来调用我们的example.php文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>xhr</title>
</head>
<body>

  <script>
    function createXHR(){
      if(typeof XMLHttpRequest != "undefined"){
        return new XMLHttpRequest();
      }else if(typeof ActiveXObject != "undefined"){
        if(typeof arguments.callee.activeXString!="string"){
          var version=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
                      i,len;
          for(i=0,len=version.length;i<len;i++){
            try{
              new ActiveXObject(version[i]);
              arguments.callee.activeXString=version[i];
              break;
            }catch(ex){

            }
          }
        }
        return new ActiveXObject(arguments.callee.activeXString);
      }else{
        throw new Error("No XHR object avaiable.")
      }
    }
    var xhr=createXHR();
    xhr.onreadystatechange=function(){
      if(xhr.readyState==4){
        if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
          document.write(xhr.responseText);
        }else{
          console.log("Request was unsuccessful:"+xhr.status);
        }
      }
    };
    xhr.open("get","example.php",true);
    xhr.send(null);
  </script>
</body>
</html>

关于服务,我用的是wampServer,具体操作可以看官网后者一些教程。

语法

<?php
// PHP 代码
?>

---例子

<?php
  echo "Hello world"; //输出Hello world
?>

 

---注释

<?php
  //单行注释
  /*
  多行
  注释
  */
?>

变量

---例子

<?php
  $x=5;
  $y=6;
  $z=$x+$y;
  echo $z; //输出11
?>

---作用域(local、global、static、parameter)

①local

<?php
  $x=5;//全局变量
  function testLocal(){
    $y=10;//局部变量
    // echo "x=$x";//会报错,因为获取不到x的值
    echo "y=$y";
  }
  testLocal();//输出:y=10
?>

②global关键字

<?php
  $x=5;//全局变量
  function testLocal(){
    $y=10;//局部变量
    global $x;
    echo "x=$x";
    echo "y=$y";
  }
  testLocal();//输出:x=5 y=10
?>

③static作用域

当一个函数完成时,它的所有变量通常都会被删除。static可以保留某个局部变量不被删除。

没有static时

<?php
  function add(){
    $x=1;
    echo $x;
    $x++;
    echo "<br/>";//换行
  }
  add();
  add();
?>

输出:

有了staitc

<?php
  function add(){
    static $x=1;
    echo $x;
    $x++;
    echo "<br/>";//换行
  }
  add();
  add();
?>

输出:

---echo与print

<?php
  //echo - 可以输出一个或多个字符串
  //print - 只允许输出一个字符串
  echo "这是一个","字符串";
  echo "<br />";
  print "这是一个";

  //输出可以包含HTML标签
  echo "<p style='color:red;'>echo</p>";
  print "<p style='color:green;'>print</p>";
?>

输出:

EOF

作用:按照原样,包括换行格式什么的,输出在其内部的东西;

           定界符 EOF 中的任何特殊字符都不需要转义;

<?php
  $txt="String";
  echo <<<EOF
    <p style="color:red;">$txt</p>
EOF;
// 结束需要独立一行且前后不能空格
?>

输出:

数据类型

---String

$x="String";

---Integer

$x=95;
$y=0x8C;//十六进制 140
$z=047;//八进制  39

---Float

$x=10.365;
$y=8E-2;//0.02
$z=2.4e3; //2400

---Boolean

$x=true;
$y=false;

---Array

<?php
  $fruit=array("apple","pear","banana");
  var_dump($fruit);//使用 PHP var_dump() 函数返回数组的数据类型和值
?>

var_dump() 方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

输出:

---Object

<?php
  class Car 
  {
    var $color;
    function __construct($color="green"){
      $this->color=$color;
    }
    function what_color(){
      return $this->color;
    }
  }
  // 实例化一个对象
  $car = new Car("red");
  foreach (get_object_vars($car) as $prop => $val) {
    echo "\t$prop = $val\n";
  }
?>

输出:color = red

---Null

$x=null;

类型比较

 =====
0   falsetruefalse
0   nulltruefalse
false  nulltruefalse
"0"  falsetruefalse
"0"  nullfalsefalse
" "  fasletruefalse
" "  nulltruefalse  

更多可以看菜鸟教程 https://www.runoob.com/php/php-types-comparisons.html

常量

<?php
  define("GREETING","Welcome to my blog!",false);//常量名,常量值,大小写敏感(true不敏感,默认false敏感,选填)
  echo GREETING;
  echo "<br/>";
  echo greeting;//大小写敏感,会报错,将上述false改为true则正常输出
?>

字符串变量

并置运算符(.)

<?php
  $txt1="hello";
  $txt2="world";
  echo $txt1 . " " . $txt2;//输出 hello world
?>

strlen()函数

返回字符串的长度

<?php
  $txt1="hello";
  echo strlen($txt1);//输出5
?>

strpos() 函数

匹配字符或字符串并返回第一个匹配的位置,没有则返回false

<?php
  $txt1="hello world";
  echo strpos($txt1,"world");//输出6
  echo strpos($txt1,"l");//输出2
?>

完整的 PHP String 参考手册 https://www.runoob.com/php/php-ref-string.html

PHP运算符

算数运算符

x+y  x-y  x*y  x/y  x%y  -x(取反)  a.b(并置)

赋值运算符

x=y  x+=y  x-=y  x*=y  x/=y    x%=y  x.=y

递增/递减运算符

++x  x++  --x  x--

比较运算符

x==y  x===y  x!=y  x<>y  x!==y  x>y  x<y  x>=y  x<=y  

逻辑运算符

(x and y)  (x or y)  (x xor y)  (x && y)  (x || y)  (!x)

数组运算符

(x+y)  (x==y)  (x===y)  (x!=y)  (x<>y)  (x!==y)

组合比较符

$c = $a <=> $b;

$a > $b   $c = 1
$a == $b  $c = 0
$a < $b   $c = -1

数组

数值数组

$fruits = array("banana","apple","pear");

获取数组的长度:count()

echo count($fruits);//输出3

遍历数组

for($x=0;$x<count($fruits);$x++){
    echo $fruits[$x];
    echo "<br/>";
  }

输出

关联数组

$ages = array("Lily"=>8,"Ben"=>9,"Cliare"=>7);

遍历关联数组

foreach($ages as $x=>$x_value){
    echo "Key=" . $x . ",value=" . $x_value;
    echo "<br />";
  }

输出

 PHP Array 参考手册

https://www.runoob.com/php/php-ref-array.html

数组排序

  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列

超级全局变量

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION

函数参考手册:https://www.runoob.com/php/php-ref-array.html

魔术常量

__LINE__                  文件中的当前行号

__FILE__                  文件的完整路径和文件名。

__DIR__                    文件所在的目录。

__FUNCTION__       函数名称

__CLASS__              类的名称

__TRAIT__                Trait 的名字

__METHOD__           类的方法名

__NAMESPACE__    当前命名空间的名称(区分大小写)。

命名空间

作用:

(由于这章节的内容好像有点多,个人感觉就是每个人都单独地开辟一块空间写代码吧,比如A写了个get()方法,B也写了个get()方法,两个人的代码合并的时候,在使用到get()方法的地方就不知道该用哪个了。)

---解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

---为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

定义命名空间

namespace myProject;
<?php
  namespace myProject{
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
  }
  
  namespace AnotherProject{
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
  }
?>
<?php
  namespace myProject{
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
  }
  
  namespace{//全局代码
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
  }
?>

子命名空间

<?php
  namespace MyProject\Sub\Level;  //声明分层次的单个命名空间
?>

面向对象

学Java的应该不陌生,我主要是觉得这些概念总结的还不错。

  •  − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

  • 对象 − 是类的实例。

  • 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。

  • 成员函数 − 定义在类的内部,可用于访问对象的数据。

  • 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

  • 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。

  • 子类 − 一个类继承其他类称为子类,也可称为派生类。

  • 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

  • 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。(如果get(a)与get(a,b))

  • 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

  • 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

  • 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

  • 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

定义类

<?php
  class  car {
    var $color;
    function setColor($color="black"){
      $this->color=$color;
    }
    function getColor(){
      echo $this->color;
    }
  }
?>

实例化

  $baoma=new car();
  $baoma->setColor("blue");
  $baoma->getColor();  //输出  blue

构造函数

__construct()

<?php
  class  car {
    function __construct($name){
      echo $name . "<br/>";
    }
    function __destruct(){
      echo "销毁";
    }

  }
  $baoma=new car("宝马");//输出 宝马  销毁
?>

继承

<?php
  class car{
    function __construct($name){
      $this->name=$name;
    }
  }
  class carColor extends car{
    var $color;
    function setColor($color){
      $this->color=$color;
    }
    function getInfo(){
      echo "这是一辆" . $this->color . "的" . $this->name;
    }
  }
  $baoma=new carColor("宝马");
  $baoma->setColor("红色");
  $baoma->getInfo();//输出   这是一辆红色的宝马
?>

访问控制

---public

---protected

---private

可用与变量,也可以用于修饰方法。

<?php
  class Car{
    public $public=4;
    protected $protected="car";
    private $private="black";
    
    function getInfo(){
      echo $this->public;
      echo $this->protected;
      echo $this->private;
    }
  }
  $baoma=new Car();
  echo $baoma->public;     //输出4
  echo $baoma->protected;  //报错
  echo $baoma->private;    //报错
  $baoma->getInfo();       //输出4  car  black
?>

接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

<?php
  //声明一个 iTemplate 接口
  interface iTemplate
  {
    public function setVariable($name,$var);
    public function getHtml($template);
  }

  //实现接口
  class  Template implements iTemplate
  {
    private $vars=array();
    public function setVariable($name,$var){
      $this->vars[$name]=$var;
    }
    public function getHtml($template){
      foreach($this->vars as $name=>$value){
        $template=str_replace($name,$value,$template);
      }
      return $template;
    }
  }

  $template=new Template();
  $arr="Lily";
  $template->setVariable("Lily",10);
  $template->setVariable("John",12);
  echo $template->getHtml($arr);//输出Lily的年龄:10
?>

常量

<?php
class MyClass{
  const constant='常量';
}
echo MyClass::constant.PHP_EOL;
?>

抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。

被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

<?php
abstract class AbstractClass{
  /* 强制要求子类定义这些方法 */
  abstract protected function getValue();
  abstract protected function prefixValue($prefix);

  /* 普通方法 */
  public function printOut(){
    print $this->getValue()."<br/>";
  }
}
class ConceeateClass1 extends AbstractClass{
  protected function getValue(){
    return "ConceeateClass1";
  }
  public function prefixValue($prefix){
    return "{$prefix}:ConceeateClass1";
  }
}
class ConceeateClass2 extends AbstractClass{
  protected function getValue(){
    return "ConceeateClass2";
  }
  public function prefixValue($prefix){
    return "{$prefix}:ConceeateClass2";
  }
}
$class1=new ConceeateClass1;
$class2=new ConceeateClass2;
$class1->printOut(); 
echo $class1->prefixValue('FOO_')."<br/>";

$class2->printOut();
echo $class2->prefixValue('FOO_')."<br/>";

?>

输出:

Static 关键字

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

class Foo{
  public static $my_static='foo';
}
print Foo::$my_static;

Final关键字

如果父类中的方法被声明为 final,则子类无法覆盖该方法。

如果一个类被声明为 final,则不能被继承。

 

 

PHP 表单和用户输入

xhr.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>xhr</title>
</head>
<body>
  <form action="example.php" method="POST">
    Name: <input type="text" name="fname">
    Age: <input type="text" name="age">
    <input type="submit" value="Submit">
  </form>
</body>
</html>

example.php

<?php header("content-type:text/html;charset=utf-8"); ?>
欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"];?>  岁。

输入:

输出:

PHP 获取下拉菜单的数据

<form action="example.php" method="get">
    <select name="q">
      <option value="">Choose a subject</option>
      <option value="math">Math</option>
      <option value="chinese">Chinese</option>
      <option value="music">Music</option>
    </select>
    <input type="submit" value="Submit">
  </form>
<?php
$q=isset($_GET["q"])?htmlspecialchars($_GET["q"]):"";
if($q){
  if($q=="math"){
    echo "数学";
  }else if($q=="chinese"){
    echo "语文";
  }else if($q=="music"){
    echo "音乐";
  }
}
?>

            

PHP 下拉菜单多选

<form action="example.php" method="post">
    <select name="q[]" multiple="multiple">
      <option value="">Choose a subject</option>
      <option value="math">Math</option>
      <option value="chinese">Chinese</option>
      <option value="music">Music</option>
    </select>
    <input type="submit" value="Submit">
  </form>
<?php
$q=isset($_POST["q"])?$_POST["q"]:"";
if(is_array($q)){
  $sites=array(
    "math"=>"数学",
    "chinese"=>"语文",
    "music"=>"音乐"
  );
  foreach($q as $val){
    echo $sites[$val]."<br/>";
  }
}
?>

单选按钮表单

<form action="example.php" method="get">
    <input type="radio" name="q" value="math" />Math
    <input type="radio" name="q" value="chinese" />Chinese
    <input type="radio" name="q" value="music" />Music
    <input type="submit" value="Submit"/>
  </form>
<?php
$q=isset($_GET["q"])?htmlspecialchars($_GET["q"]):"";
if($q){
  if($q=="math"){
    echo "数学";
  }else if($q=="chinese"){
    echo "语文";
  }else if($q=="music"){
    echo "音乐";
  }
}
?>

输出:音乐

checkbox 复选框

<form action="example.php" method="post">
  <input type="checkbox" name="q[]" value="math"> Math<br> 
  <input type="checkbox" name="q[]" value="chinese"> Chinese<br> 
  <input type="checkbox" name="q[]" value="music"> Music<br>
  <input type="submit" value="Submit"/>
</form>
<?php
$q=isset($_POST["q"])?$_POST["q"]:"";
if(is_array($q)){
  $sites=array(
    "math"=>"数学",
    "chinese"=>"语文",
    "music"=>"音乐"
  );
  foreach($q as $val){
    echo $sites[$val]."<br/>";
  }
}
?>

 

PHP 表单验证

什么是 $_SERVER["PHP_SELF"] 变量?
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。$_SERVER["PHP_SELF"] 会发送表单数据到当前页面,而不是跳转到不同的页面。

什么是 htmlspecialchars()方法?

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号) 成为 &amp;
  • " (双引号) 成为 &quot;
  • ' (单引号) 成为 &#039;
  • < (小于) 成为 &lt;
  • > (大于) 成为 &gt;
<!DOCTYPE HTML> 
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<style>
.error {color: #FF0000;}
</style>
</head>
<body> 
<?php
// 定义变量并默认设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST"){
  if (empty($_POST["name"])){
      $nameErr = "名字是必需的";
  }else{
    $name = test_input($_POST["name"]);
    // 检测名字是否只包含字母跟空格
    if (!preg_match("/^[a-zA-Z ]*$/",$name)){
      $nameErr = "只允许字母和空格"; 
    }
  }
  
  if (empty($_POST["email"])){
    $emailErr = "邮箱是必需的";
  }else{
    $email = test_input($_POST["email"]);
    // 检测邮箱是否合法
    if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)){
        $emailErr = "非法邮箱格式"; 
    }
  }
  
  if (empty($_POST["website"])){
    $website = "";
  }else{
    $website = test_input($_POST["website"]);
    // 检测 URL 地址是否合法
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)){
      $websiteErr = "非法的 URL 的地址"; 
    }
  }
  
  if (empty($_POST["comment"])){
    $comment = "";
  }else{
    $comment = test_input($_POST["comment"]);
  }
  
  if (empty($_POST["gender"])){
    $genderErr = "性别是必需的";
  }else{
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data){
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
  名字: <input type="text" name="name" value="<?php echo $name;?>">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email" value="<?php echo $email;?>">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  网址: <input type="text" name="website" value="<?php echo $website;?>">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
  <br><br>
  性别:
  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?>  value="female">女
  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?>  value="male">男
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit"> 
</form>

<?php
echo "<h2>您输入的内容是:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>

多维数组

<?php header("content-type:text/html;charset=utf-8"); ?>
<?php
/* 二维数组 */
$cars=array(
  array("Volvo",100,96),
  array("BMW",60,59),
  array("Toyota",110,100)
);
echo $cars[0][1];//输出100
/* 多维数组 */
$sites=array(
  "baidu"=>array("百度","www.baidu.com"),
  "biying"=>array("必应","www.biying.com"),
  "google"=>array("谷歌","www.goole.com")
);
echo $sites["google"][0];//输出  谷歌
?>

格式化日期

date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。

https://www.runoob.com/php/func-date-date.html  PHP Date 参考手册

<?php 
echo date("Y/m/d")."<br/>";  //输出  2019/12/06
echo date("Y-m-d");   //输出   2019-12-06
?> 

PHP 包含文件

PHP include 和 require 语句

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • quire 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

打开文件

fopen() 函数用于在 PHP 中打开文件。

fopen(要打开的文件名称,打开的模式)

模式描述
r只读。在文件的开头开始。
r+读/写。在文件的开头开始。
w只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+读/追加。通过向文件末尾写内容,来保持文件内容。
x只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
<?php
$file=fopen("welcome.txt","r");
?>

关闭文件

fclose($file);

逐行读取文件

fgets() 函数用于从文件中逐行读取文件。

<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
    echo fgets($file). "<br>";
}
fclose($file);
?>

逐字符读取文件

fgetc() 函数用于从文件中逐字符地读取文件。

<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
{
    echo fgetc($file);
}
fclose($file);
?>

PHP Filesystem 参考手册  https://www.runoob.com/php/php-ref-filesystem.html

$_FILES 数组内容如下:

$_FILES['myFile']['name'] 客户端文件的原名称。

$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。

$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。

$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在 php.ini 的 upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。

$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在 PHP 4.3.0 之后变成了 PHP 常量。)

上传限制

<!-- <form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。
    在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。 -->
  <form action="example.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br/>
    <input type="submit" name="submit" value="Submit">
  </form>
/* 用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB */
$allowedExts=array("gif","jpeg","jpg","png");
$temp=explode(".",$_FILES["file"]["name"]);
$extension=end($temp);//获取文件后缀名

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)    // 小于 200 kb
&& in_array($extension, $allowedExts)){
  if($_FILES["file"]["error"]>0){
    echo "错误".$_FILES["file"]["error"]."<br/>";
  }else{
    echo "上传文件名:".$_FILES["file"]["name"]."<br/>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
  }
}else{
  echo "非法的文件格式";
}

保存上传的文件

<?php 
/* 用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB */
$allowedExts=array("gif","jpeg","jpg","png");
$temp=explode(".",$_FILES["file"]["name"]);
$extension=end($temp);//获取文件后缀名

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)    // 小于 200 kb
&& in_array($extension, $allowedExts)){
  if($_FILES["file"]["error"]>0){
    echo "错误".$_FILES["file"]["error"]."<br/>";
  }else{
    echo "上传文件名:".$_FILES["file"]["name"]."<br/>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br/>";

    /*  判断当期目录下的 upload 目录是否存在该文件 */
    /* 如果没有 upload 目录,你需要创建它,upload 目录权限为 777 */
    if(file_exists("upload/".$_FILES["file"]["name"])){
      echo $_FILES["file"]["name"]."文件已存在。";
    }else{  
      /* 如果upload目录下,不存在该文件则将文件上传到 upload 目录下 */
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
      echo "文件存储在:"."upload/",$_FILES["file"]["name"];
    }
  }
}else{
  echo "非法的文件格式";
}
?> 

---cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

---setcookie() 函数用于设置 cookie。

---setcookie() 函数必须位于 <html> 标签之前。

创建Cookie

setcookie(name, value, expire, path, domain);

取回Cookie的值

<?php
// 输出 cookie 值
echo $_COOKIE["user"];

// 查看所有 cookie
print_r($_COOKIE);
?>

补充:

isset — 检测变量是否已设置并且非 NULL

删除 Cookie

当删除 cookie 时,您应当使过期日期变更为过去的时间点。

// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);

Session

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。

Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。

开始 PHP Session

<?php session_start(); ?>//session_start() 函数必须位于 <html> 标签之前

存储Session变量

<?php
session_start();
// 存储 session 数据
$_SESSION['views']=1;
?>
<?php
// 检索 session 数据
echo "浏览量:". $_SESSION['views'];
?>

销毁Session

使用 unset() 或 session_destroy() 函数。

<?php
session_start();
if(isset($_SESSION['views']))
{
    unset($_SESSION['views']);
}
?>

<?php
session_destroy();
?>

发送电子邮件

PHP mail() 函数用于从脚本中发送电子邮件。

mail(to,subject,message,headers,parameters)

参数描述
to必需。规定 email 接收者。
subject必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。每行应该限制在 70 个字符内。
headers可选。规定附加的标题,比如 From、Cc 和 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。
parameters可选。对邮件发送程序规定额外的参数。

PHP 运行邮件函数需要一个已安装且正在运行的邮件系统(如:sendmail、postfix、qmail等)。所用的程序通过在 php.ini 文件中的配置设置进行定义。 

PHP Mail 参考手册 

https://www.runoob.com/php/php-ref-mail.html

PHP 简易 E-Mail

<?php
$to="someone@qq.com";//邮件接受者
$subject="测试邮件";  //邮件标题
$message="测试内容";  //邮件正文
$from="ceshi@163.com";//发送者
$header="From:".$from;//头部信息设置
mail($to,$subject,$message,$header);
echo "邮件已发送";
?>

PHP Mail 表单

<form action="example.php" method="post">
   Email: <input type="text" name="email"><br/>
   Subject: <input type="text" name="subject"><br/>
   Message:<br/>
   <textarea name="message" cols="30" rows="10"></textarea><br/>
   <input type="submit" value="Submit">
 </form>
<?php
if(isset($_REQUEST["email"])){// 如果接收到邮箱参数则发送邮件
  /* 发送邮件 */
  $email=$_REQUEST["email"];
  $subject=$_REQUEST["subject"];
  $message=$_REQUEST["message"];
  mail("someone@163.com",$subject,$message,"From".$email);
  echo "发送成功!";
}
?>

防止 E-mail 注入

最好方法:对输入进行验证

<?php
function spamcheck($field){
  /* filter_val()过滤e_mail */
  /* 使用FILTER_SANITIZE_EMAIL */
  $field=filter_var($field,FILTER_SANITIZE_EMAIL);
  return filter_var($field,FILTER_SANITIZE_EMAIL);
}

if(isset($_REQUEST["email"])){
  // 如果接收到邮箱参数则发送邮件
  /* 判断邮箱是否合法 */
  $mailcheck=spamcheck($_REQUEST["email"]);
  if($mailcheck){
    echo "非法输入";
  }else{
    /* 发送邮件 */
    $email=$_REQUEST["email"];
    $subject=$_REQUEST["subject"];
    $message=$_REQUEST["message"];
    mail("someone@163.com",$subject,$message,"From".$email);
    echo "发送成功!";
  }
  
}
?>
  • FILTER_SANITIZE_EMAIL 过滤器从字符串中删除电子邮件的非法字符
  • FILTER_VALIDATE_EMAIL 过滤器验证电子邮件地址的值

PHP错误处理

  • 简单的 "die()" 语句
  • 自定义错误和错误触发器
  • 错误报告

基本的错误处理:使用 die() 函数

<?php
if(!file_exists("welcome.txt")){
  die("file is not exist");
}else{
  $fiele=fopen("welcome.txt","r");
}
?>

创建自定义错误处理器

该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context):

error_function(error_level,error_message,
error_file,error_line,error_context)
参数描述
error_level必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
error_message必需。为用户定义的错误规定错误消息。
error_file可选。规定错误发生的文件名。
error_line可选。规定错误发生的行号。
error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
常量描述
2E_WARNING非致命的 run-time 错误。不暂停脚本执行。
8E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256E_USER_ERROR致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512E_USER_WARNING非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024E_USER_NOTICE用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191E_ALL所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
<?php
/* 创建一个处理错误的函数:
当它被触发时,它会取得错误级别和错误消息。
然后它会输出错误级别和消息,并终止脚本。 */
function customError($errno,$errstr){
  echo "<b>Error:</b>[$errno]$errstr<br/>";
  echo "脚本结束";
  die();
}
/* 设置错误处理程序 */
set_error_handler("customError");
/* 触发错误 */
echo($test);
?>

在脚本中用户输入数据的位置,当用户的输入无效时触发错误是很有用的。在 PHP 中,这个任务由 trigger_error() 函数完成。

  • E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
  • E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
  • E_USER_NOTICE - 默认。用户生成的 run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
<?php
$test=2;
if($test>1){
  trigger_error("the variable show smller than 2");
}
?>

错误记录

在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。

通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。

PHP 异常处理

异常用于在指定的错误发生时改变脚本的正常流程。

当异常被触发时,通常会发生:

  • 当前代码状态被保存
  • 代码执行被切换到预定义(自定义)的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

异常的基本使用

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。

<?php
/* 创建一个有异常处理的函数 */
function checkNum($number){
  if($number>1){
    throw new Exception("Value must be 1 or below.");
  }
  return true;
}
/* 触发异常 */
checkNum(2);//抛出一个异常,同时不去捕获它
?>

Try、throw 和 catch

  1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
<?php
/* 创建一个有异常处理的函数 */
function checkNum($number){
  if($number>1){
    throw new Exception("Value must be 1 or below.");
  }
  return true;
}
/* 在try里触发异常 */
try{
  checkNum(2);
  /* 如果输出异常,以下文本不会输出 */
  echo "如果输出该内容,说明没有异常";
}/* 捕获异常 */
catch(Exception $e){
  echo "Message:".$e->getMessage();
}
?>

创建一个自定义的 Exception 类

<?php
class customException extends Exception{
  public function errorMessage(){
    /* 错误信息 */
    $errorMsg="错误行号:".$this->getLine()." in ".$this->getFile()
    .":<b>".$this->getMessage()."</b> 不是一个合法的Email地址";
    return $errorMsg;
  }
}
$email="someone@example...com";
try{
  /* 检测邮箱 */
  if(filter_var($email,FILTER_VALIDATE_EMAIL)===FALSE){
    /* 如果是个不合法的地址,抛出异常 */
    throw new customException($email);
  }
}catch(customException $e){
  echo $e->errorMessage();
}
?>

多个异常

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

相关函数:

  • stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
  • strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
  • strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
<?php
class customException extends Exception{
  public function errorMessage(){
    /* 错误信息 */
    $errorMsg="错误行号:".$this->getLine()." in ".$this->getFile()
    .":<b>".$this->getMessage()."</b> 不是一个合法的Email地址";
    return $errorMsg;
  }
}
$email="someone@example.com";
try{
  /* 检测邮箱 */
  if(filter_var($email,FILTER_VALIDATE_EMAIL)===FALSE){
    /* 如果是个不合法的地址,抛出异常 */
    throw new customException($email);
  }
  /* 检测example是否在邮箱地址中 */
  if(strpos($email,"example")!==FALSE){
    /* 该字符串是一个有效的 e-mail 地址,但包含字符串 "example" */
    throw new Exception("$email 是exam邮箱");
  }
}catch(customException $e){
  echo $e->errorMessage();
}catch(Exception $e){
  echo $e->getMessage();
}
?>

重新抛出异常

<?php
class customException extends Exception{
  public function errorMessage(){
    /* 错误信息 */
    $errorMsg="错误行号:".$this->getLine()." in ".$this->getFile()
    .":<b>".$this->getMessage()."</b> 不是一个合法的Email地址";
    return $errorMsg;
  }
}
$email="someone@example.com";
try{
  try{
    /* 检测“example”是否在邮箱地址中 */
    if(strpos($email,"example")!==FALSE){
      throw new Exception($email);
    }
  }catch(Exception $e){
    /* 重新抛出异常 */
    throw new customException($email);
  }
}catch(customException $e){
  /* 显示自定义信息 */
  echo $e->getMessage();
}
?>

设置顶层异常处理器

set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。

不存在 "catch" 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。

<?php
function myException($exception){
  echo "<b>Exception:</b>",$exception->getMessage();
}
set_exception_handler("myException");
throw new Exception("Uncaught Exception occurred");
?>

异常的规则

  • 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
  • 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
  • 使用多个 catch 代码块可以捕获不同种类的异常。
  • 可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。

PHP过滤器

PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
<?php
$int=123;
if(!filter_var($int,FILTER_VALIDATE_INT)){
  echo "不是一个合法的整数";
}else{
  echo "是一个合法的整数";
}
?>

Validating 和 Sanitizing

Validating 过滤器:

  • 用于验证用户输入
  • 严格的格式规则(比如 URL 或 E-Mail 验证)
  • 如果成功则返回预期的类型,如果失败则返回 FALSE

Sanitizing 过滤器:

  • 用于允许或禁止字符串中指定的字符
  • 无数据格式规则
  • 始终返回字符串

选项和标志

选项和标志用于向指定的过滤器添加额外的过滤选项。

利用ajax调取php

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  <title>xhr</title>
</head>
<body>
  <input type="text" id="num">
  <button onclick="checkNum();">检测</button>
  <p id="result"></p>
  <script>
    function checkNum(){
      var num=$("#num").val();
      $.ajax({
        type:"get",
        url:"example.php",
        data:{"num":num},
        dataType:"text",
        success:function(data){
          $("#result").html(data);
        }
      })
    }
  </script>
</body>
</html>

php代码:

<?php
$var=$_GET["num"];
$int_options=array(
  "options"=>array(
    "min_range"=>0,
    "max_range"=>256
  )
  );
if(!filter_var($var,FILTER_VALIDATE_INT,$int_options)){
  echo("不是一个合法的整数");
}else{
  echo("是一个合法的整数");
}
?>

 

验证输入

确认是否存在我们正在查找的输入数据。

/* 验证输入 */
  if(!filter_has_var(INPUT_GET,$var)){
    echo "请输入整数!";
  }else{
    //something else
  }

净化输入

<?php
if(!filter_has_var(INPUT_GET, "url"))
{
    echo("没有 url 参数");
}
else
{
    $url = filter_input(INPUT_GET, 
    "url", FILTER_SANITIZE_URL);
    echo $url;
}
?>

过滤多个输入

filter_input_array() 函数从脚本外部获取多项输入,并进行过滤。

本函数无需重复调用 filter_input(),对过滤多个输入变量很有用。

本函数可从各种来源获取输入:

  • INPUT_GET
  • INPUT_POST
  • INPUT_COOKIE
  • INPUT_ENV
  • INPUT_SERVER
  • INPUT_SESSION (Not yet implemented)
  • INPUT_REQUEST (Not yet implemented)

如果成功,则返回被过滤的数据,如果失败,则返回 false。

<body>
  Name: <input type="text" id="name"><br/>
  Age:<input type="text" id="age"><br/>
  Email: <input type="text" id="email"><br/>
  <button onclick="check();">检测</button><br/>
  <p id="result"></p>
  <script>
    function check(){
      var name=$("#name").val();
      var age=$("#age").val();
      var email=$("#email").val();
      $.ajax({
        type:"get",
        url:"example.php",
        data:{"name":name,"age":age,"email":email},
        dataType:"text",
        success:function(data){
          $("#result").html(data);
        }
      })
    }
  </script>
</body>
<?php
$name=$_GET["name"];
$age=$_GET["age"];
$email=$_GET["email"];
$filters=array(
  "name"=>array(
    "filter"=>FILTER_SANITIZE_STRING//过滤器去除或编码不需要的字符
  ),
  "age"=>array(
    "filter"=>FILTER_VALIDATE_INT,
    "options"=>array(
      "min_range"=>0,
      "max_range"=>120
    )
  ),
  "email"=>FILTER_VALIDATE_EMAIL
  );
  $result=filter_input_array(INPUT_GET,$filters);
  if(!$result["age"]){
    echo("年龄必须在0~120之间");
  }elseif(!$result["email"]){
    echo("请输入正确的邮箱地址");
  }else{
    echo("Input correct!");
  }
?>

使用 Filter Callback

通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。

将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。

<body>
  String: <input type="text" id="string"><br/>
  <button onclick="check();">检测</button><br/>
  <p id="result"></p>
  <script>
    function check(){
      var string=$("#string").val();
      $.ajax({
        type:"get",
        url:"example.php",
        data:{"string":string},
        dataType:"json",//顺便测试了一下json传递
        success:function(data){
          $("#result").html(data.text);
        }
      })
    }
  </script>
</body>
//写上  content-type:application/json;  如此重要!
<?php header("content-type:application/json;charset=utf-8"); ?>
<?php
//创建一个把 "_" 替换为 "." 的函数
function convertSpace($string){
  return str_replace("_",".",$string);
}
$string=$_GET["string"];
$arr=array(
  "text"=>filter_var($string,FILTER_CALLBACK,array("options"=>"convertSpace")),
  "code"=>200
);
echo json_encode($arr,JSON_UNESCAPED_UNICODE); 
?>

PHP 过滤器参考手册

https://www.runoob.com/php/php-ref-filter.html

JSON函数

函数描述
json_encode对变量进行 JSON 编码
json_decode对 JSON 格式的字符串进行解码,转换为 PHP 变量
json_last_error返回最后发生的错误

PHP MySQL 

连接MySQL

<?php
$servername = "localhost";
$username = "root";
$password = "123456";
 
// 创建连接
$conn = new mysqli($servername, $username, $password);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 
echo "连接成功";
?>

创建数据库

<?php
$servername = "localhost";
$username = "root";
$password = "123456";
 
// 创建连接
$conn = new mysqli($servername, $username, $password);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

// 创建数据库
$sql="CREATE DATABASE myDB";
if($conn->query($sql)==true){
    echo "数据库创建成功";
}else {
    echo "Error creating database:".$conn->error;
}
$conn->close();
?>

创建表

创建一个名为 "MyGuests" 的表,有 5 个列: "id", "firstname", "lastname", "email" 和 "reg_date"

数据库语言:

  • NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
  • DEFAULT value - 设置默认值
  • UNSIGNED - 使用无符号数值类型,0 及正数
  • AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
  • PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。
CREATE TABLE MyGuests (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    firstname VARCHAR(30) NOT NULL,
    lastname VARCHAR(30) NOT NULL,
    email VARCHAR(50),
    reg_date TIMESTAMP
)
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname="myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

// 使用 sql 创建数据表
$sql="CREATE TABLE MyGuests (
	id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
	firstname VARCHAR(30) NOT NULL,
	lastname VARCHAR(30) NOT NULL,
	email VARCHAR(50),
	reg_date TIMESTAMP
)";

if($conn->query($sql)===true){
    echo "表创建成功";
}else {
    echo "Error creating table:".$conn->error;
}
$conn->close();
?>

此时打开Navicat就可以看到创建的表了

插入数据

SQL语句

INSERT INTO 语句通常用于向 MySQL 表添加新的记录:

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
INSERT INTO myguests(firstname,lastname,email)
VALUES("Claire","Tang","Claire@example.com");
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname="myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

// 使用 sql 创建数据表
$sql="INSERT INTO myguests(firstname,lastname,email)
VALUES('Claire','Tang','Claire@example.com')";

if($conn->query($sql)===true){
    echo "记录插入成功";
}else {
    echo "Error :".$conn->error;
}
$conn->close();
?>

插入多条数据

mysqli_multi_query() 函数可用来执行多条SQL语句。

<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname="myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

// 使用 sql 创建数据表
$sql="INSERT INTO myguests(firstname,lastname,email)
VALUES('Mary', 'Moe', 'mary@example.com');";
$sql .="INSERT INTO myguests(firstname,lastname,email)
VALUES('John', 'Doe', 'john@example.com');";
$sql .="INSERT INTO myguests(firstname,lastname,email)
VALUES('Julie', 'Dooley', 'julie@example.com')";

if($conn->multi_query($sql)===true){
    echo "记录插入成功";
}else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>

预处理语句

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:

    INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比于直接执行SQL语句,预处理语句有两个主要优点:

  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。

  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。

  • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname="myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

//  预处理及绑定
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// 设置参数并执行
$firstname = "Eohn";
$lastname = "Foe";
$email = "john@example.com";
$stmt->execute();
 
$firstname = "Eary";
$lastname = "Foe";
$email = "mary@example.com";
$stmt->execute();
 
$firstname = "Eulie";
$lastname = "Fooley";
$email = "julie@example.com";
$stmt->execute();
 
echo "新记录插入成功";

$stmt->close();
$conn->close();
?>

从 MySQL 数据库读取数据

SQL语句:SELECT 语句用于从数据表中读取数据:

SELECT column_name(s) FROM table_name

<?php
$servername = "localhost";
$username = "root";
$password = "123456";
$dbname="myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);
 
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result=$conn->query($sql);//从数据库中取出结果集并赋给复制给变量 $result

if($result->num_rows>0){//函数 num_rows() 判断返回的数据。
    // 输出数据
    while($row=$result->fetch_assoc()){//函数 fetch_assoc() 将结合集放入到关联数组并循环输出
        echo "id:".$row["id"]." -Name:".$row["firstname"]." ".$row["lastname"]. "\n";
    }
}else{
    echo "no data";
}
$conn->close();
?>

WHERE子句

SELECT column_name(s)
FROM table_name
WHERE column_name operator value

ORDER BY 关键词

SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC

Update

UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value

Delete

DELETE FROM table_name
WHERE some_column = some_value

AJAX 与 PHP

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  <title>xhr</title>
</head>
<body>
  <p>Input Name: </p>
  <form>
    Name: <input type="text" onkeyup="showHint(this.value)">
  </form>
  <p>返回值: <span id="txtHint"></span></p>
  <script>
    function showHint(str){
      if(str.length==0){
        $("#txtHint").html("");
        return;
      }
      $.ajax({
        type:"get",
        url:"example.php",
        data:{"q":str},
        dataType:"text",
        success:function(data){
          $("#txtHint").html(data);
        }
      })
    }
  </script>
</body>
</html>

<?php header("content-type:text/html;charset=utf-8"); ?>
<?php
// 将姓名填充到数组中
$a[]="Anna";
$a[]="Brittany";
$a[]="Cinderella";
$a[]="Diana";
$a[]="Eva";
$a[]="Fiona";
$a[]="Gunda";
$a[]="Hege";
$a[]="Inga";
$a[]="Johanna";
$a[]="Kitty";
$a[]="Linda";
$a[]="Nina";
$a[]="Ophelia";
$a[]="Petunia";
$a[]="Amanda";
$a[]="Raquel";
$a[]="Cindy";
$a[]="Doris";
$a[]="Eve";
$a[]="Evita";
$a[]="Sunniva";
$a[]="Tove";
$a[]="Unni";
$a[]="Violet";
$a[]="Liza";
$a[]="Elizabeth";
$a[]="Ellen";
$a[]="Wenche";
$a[]="Vicky";

$q=$_GET["q"];

// 查询是否有匹配值
if(strlen($q)>0){
    $hint="";
    for($i=0;$i<count($a);$i++){
        /* strtolower — 将字符串转化为小写 */
        /* substr — 返回字符串的子串 
           substr('abcdef', 1, 3);  // bcd */
        if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q)))){
            if($hint==""){
                $hint=$a[$i];
            }else{
                $hint=$hint.",".$a[$i];
            }
        }
    }
}
// 如果没有匹配值
if($hint==""){
    $response="no suggestion";
}else{
    $response=$hint;
}
echo $response;
?>

AJAX 与 MySQL

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  <title>xhr</title>
</head>
<body>
  <form>
    <select name="users" onchange="showSite(this.value)">
      <option value="">Choose a website:</option>
      <option value="1">Google</option>
      <option value="2">淘宝</option>
      <option value="3">菜鸟教程</option>
      <option value="4">微博</option>
      <option value="5">Facebook</option>
    </select>
  </form>
  <br>
  <div id="txtHint">
    <b>网站信息</b>
  </div>
  <script>
    function showSite(str){
      if(str.length==0){
        $("#txtHint").html("");
        return;
      }
      $.ajax({
        type:"get",
        url:"example.php",
        data:{"q":str},
        dataType:"text",
        success:function(data){
          $("#txtHint b").html($("#txtHint b").html()+data);
        }
      })
    }
  </script>
</body>
</html>

<?php
$q=isset($_GET["q"])?intval($_GET["q"]):"";
if(empty($q)){
    echo "please choose a website";
    exit;
}

$con=mysqli_connect('localhost','root',"123456");
if(!$con){
    die("连接失败:".mysqli_error($con));
}
// 选择数据库
mysqli_select_db($con,"mydb");
// 设置编码,防止中文乱码
mysqli_set_charset($con,"utf8");

$sql="SELECT *FROM website WHERE id='".$q."'";
$result=mysqli_query($con,$sql);
echo "<table border='1'>
<tr>
<th>ID</th>
<th>网站名</th>
<th>网站 URL</th>
<th>Alexa 排名</th>
<th>国家</th>
</tr>";
 
while($row = mysqli_fetch_array($result))
{
    echo "<tr>";
    echo "<td>" . $row['id'] . "</td>";
    echo "<td>" . $row['name'] . "</td>";
    echo "<td>" . $row['url'] . "</td>";
    echo "<td>" . $row['alexa'] . "</td>";
    echo "<td>" . $row['country'] . "</td>";
    echo "</tr>";
}
echo "</table>";
mysqli_close($con);
?>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值