《我讨厌PHP-PHP和MySQL初学者指南》第三版
# 我讨厌PHP-PHP和MySQL初学者指南
> 作者:MakeMOney-1.com
>
> 翻译:Geticer 2022
>
> 校对/润色:Tillreetree 2022 - 2023 - 2026
你好,这是一本免费的电子书,你可以访问这个链接来检查更新的版本。当然,你可以把它免费送给你的朋友,或者任何需要了解PHP的人。
我并不*真的*讨厌PHP,但也有强烈不喜欢它的时候。感谢你购买这本PHP和MySQL的指南。我希望你能从中得到一些乐趣,并学到一些东西。
## 前言
### 首先,我的背景和为什么会有这本书?
### 那么,这本书是为谁写的呢?
这本书是为那些找不到对象的……等等……拿错了……
《我讨厌PHP》是为那些一直想知道“PHP能为他们做些什么”的站长和设计师准备的;那些**真正想用PHP“做”一些东西**而不是外包出去的人。
你最好要熟悉HTML和能写/看懂HTML代码。
你不需要成为一个“我都是用记事本写代码”的那种人——只要能打开文本编辑器并理解代码就足够了。复制/粘贴知识也是有帮助的。
与市场上的其他 PHP 书籍不同,我们不会涵盖 PHP 语言广阔世界的每一个方面。
我们要脚踏实地的掌握 PHP 语言的基础知识,熟悉它,并在实际生活中的例子中使用它……而不是“填鸭式教育”。
本书也适合在看《跟Wakaba酱一起学网站制作》到第六章的时候阅读,可替代该章节。
### 更多学习的地方
本书只是带你进入PHP世界的第一步,更多的路得自己走,以下网站会对你有很大帮助。
- php.net
- Google
- Bing 国际版
- StackOverflow
- 知乎
- 掘金
以下书籍也会对你有帮助:
- 《跟Wakaba酱一起学网页制作》
- 《跟Wakaba酱一起学Git使用》
### 本书概述
本书中的例子分为3个层次:“简单的东西”、“不简单的东西”和“天哪,是MySQL!”。
**“简单的东西”** 包括常见的PHP函数和语句,你几乎可以在你建立的任何网站上使用。
**“不简单的东西”** 是一些比较难掌握的代码,但你可能仍然想使用它。
**“天哪,是MySQL!”** 将包括如何连接到MySQL数据库,并做一些基本的事情,如向它写入和检索信息。
每一章都会包含若干个“扩展阅读”子章节,其中包含一些更高级的知识,**不一定要把他们全看完**就能理解整个章节的内容。
## 第一章:简单的东西
> 涵盖Echo、字符串、Date()、变量、Include、Require和Header()。
---
在我们开始学习如何使用 PHP 之前,我们需要简单地探讨一下什么是 PHP……但我不会去讲一些冗长的关于 PHP 的历史,以及为什么至今还在用。
> 另外,**在继续学习之前,最好熟悉一下HTML**,因为你需要能够在网页中复制和粘贴代码。
在广阔的网络世界中,有两种类型的编程语言——“服务器端语言”和“客户端语言”。
前者是*在 Web 服务器*上运行,后者是*在你的浏览器*中运行。
> **你可以这样想:**
>
> **服务端**:你在一家餐馆点了一个肉夹馍。它来到你面前时就是做好的,可以吃的。
>
> **客户端**:你在一家餐馆点了一个肉夹馍。肉夹馍的各个部分(馍、肉馅、调味品等)被分别送到你手中,你需要在吃之前把它们组装起来。
PHP是一种**服务器端语言**。所有的处理都是在 Web 服务器上完成的,其结果是以 HTML 的形式传递给 Web 浏览器的(顺便说一下,HTML是一种客户端**标记语言**)。
你的网络服务器也必须安装有PHP才能工作。大多数服务器供应商都安装了PHP,所以**如果你有疑问,询问他们即可。**
> **需要注意的事项:**
>
> 1. 文件后缀名**必须是 `.php` **而不是 `.htm`或 `.html`。如果后缀是 `.htm`或 `.html`的话,PHP会忽略掉其中的PHP代码的。*(也有例外,但现在我们不谈这些)*
> 2. PHP代码**必须在 ``标签内**。如果不这样做,PHP会忽略掉的。
> 3. 每个PHP语句必须以分号结尾。如果不这样做,你会得到一些神秘的错误信息。
### 现在,让我们开始编程吧
我们将从基础开始。让PHP将内容输出到浏览器、什么是变量以及如何使用它们……几乎任何页面都会用到的例子。
让我们从最基本的一个开始。
### Echo语句
我们要告诉PHP向屏幕上输出一些东西。**请记住,PHP可以和HTML一起出现和使用**,但为了保持简单,我们在本例中不用HTML。
```php
```
> (我讨厌世界上其他书都使用的“Hello World”示例,所以我改用“Creamy Bagels”。)
让我们**一点一点地剖析**这个例子。
当你看到大量的PHP代码时,这样做是有帮助的……因为,相信我,如果你不一点一点地看,它有时会看起来像一团乱麻。
- `` - ……告诉服务器“好了,我暂时不使用 PHP 了。回到常规的HTML”。
当你这样看的时候,就变得很简单了,对吧?
> “嗯嗯,但如果我想在我的屏幕上看到引号怎么办?”
这可以通过在PHP代码中“转义”你想显示的内容中的引号来实现。例如:
```php
```
如果你想看到 `"This way please"`周围的引号,你可以这样写:
```php
```
使用 `\"`告诉 PHP 你希望出现一个双引号,反斜杠在这里的意思是“转义”。记住这一点——我们以后可能要用到。
> 中文的单双引号不需要转义。
### 字符串
在PHP中,字符串是**包含在引号内的一行文本**。在字符串中可以使用双引号(`"`),也可以使用单引号(`'`)。
> 推荐使用单引号,可以在一些场合中省去转义的麻烦。
```php
```
当使用单引号时,如果你希望在输出文本中显示单引号,你需要用反斜线“转义”(就像使用双引号一样)。
```php
```
#### 字符串内的特殊命令…
有一些 "秘密命令",你可以在字符串中使用,以操纵输出文本。
- `\n`:换行
- `\r`:回车键
- `\t`:制表符 Tab
- `\$`:美元符号 *(只能在双引号字符串里用)* ——记住,如果你不使用反斜线的话,PHP将寻找这个变量……并抛出一个难看的错误!
> 字符串是PHP里8种数据类型的一种,更多的数据类型将在下一章中介绍。
### 变量
PHP中的变量,简单地说,就是**用一个东西代表另一个或多个东西**——一个“容器”。它可以代表文本、数字、算式等等。
变量是相当强大的,如果你搞砸了,它们会在半夜来找你的。
声明一个变量很容易。
```php
```
变量名**区分大小写**。只要遵守四条基本规则,你想怎么起变量名都行:
1. 变量名不能包含空格。
2. 变量名称可以包含字母(`a~z`、`A~Z`)、数字(0~9)和下划线(_)。
3. 变量名**可以**以字母或下划线开头,但**不能**以数字开头。
4. 变量名应该有意义 *(能描述变量的作用)* ,这样你以后就可以记住它们啦!
在你说*“我需要这个干什么?”之前,请记住,**变量是非常有用的**。
### 变量的实际应用
下面是一个**如何使用变量**的例子:在你的网站上显示当前日期。
```php
```
在这个例子中,`date`函数的结果被分配到一个名为`$today`的变量中(这个过程叫做“赋值”),并使用`echo`将其显示在屏幕上。
> 关于`date`函数的更多信息,在第二章中会讲到的。
#### 输出多个变量的内容
使用点 `.` 来“组合”两个变量。
```php
```
在你的浏览器中显示为这样。
```
举头望明月,低头思故乡。
```
你也可以混合字符串和变量,像这样…
```php
```
输出:
```
你购买了 3 个物品。
```
#### 扩展阅读:常量
PHP中的常量和数学中的常量概念一样,就是**一直存在的一个值**,在定义了之后**不可被修改**。
要定义常量的话,需要使用`define()`函数。
```php
```
常量可以使用大小写字母、数字和下划线。但一般来说。常量最好只用大写字母(和数字、下划线),用于和变量区分开,也更醒目。
#### 扩展阅读:PHP预定义的变量,与超全局变量
我们已经讨论了变量,但我们还没有讨论PHP中现成的变量。预定义变量已经定义,顾名思义,并且可以在您无需先创建它们的情况下使用。
大多数预定义变量用于提供来自Web服务器、Web浏览器和用户的信息和关于Web服务器、Web浏览器和用户的信息。它们被称为超全局变量。
可以使用以下超全局变量:
| 变量名称 | 变量描述 |
| ------------- | ----------------------------------------------- |
| $_GET | HTTP GET请求的信息 |
| $_POST | HTTP POST请求的信息 |
| $_FILES | HTTP上传的文件信息 |
| $_SERVER | 服务器和环境信息 |
| $_COOKIE | HTTP Cookies |
| $_SESSION | 会话变量 |
| $_REQUEST | HTTP请求变量,包含$_GET、$_POST和$_COOKIE的内容 |
| $GLOBALS | 全局作用域中的所有变量,集合成一个数组 |
我们将在之后的章节中详细讨论这些超全局变量,所以现在我们只通过`$_SERVER`超全局变量的演示简要地演示如何使用它们。
```php
echo "您的IP地址: " . $_SERVER['REMOTE_ADDR'] . "
";
echo "当前页面名称是: " . $_SERVER['PHP_SELF'] . "
";
echo "你来自这个页面: " . $_SERVER['HTTP_REFERER'] . "
";
```
~超全局变量,如`$_SERVER`变量,都是数组类型的。变量末尾的放括号和单引号包含我们想要的实值的引用名称。~
上面例子的结果是:
```
您的IP地址是:192.168.110.22
当前页面名称是:/第一章:简单的东西/变量/扩展阅读:PHP预定义的变量,与超全局变量.php
你来自这个页面:https://creamy-bagels.example.com/第一章:简单的东西/变量/扩展阅读:PHP预定义的变量,与超全局变量.php
```
`$_SERVER`变量有30多个可用元素,其中大部分实际上很有用(假设您的服务器支持它们)。最常见的元素是:
```php
$_SERVER['REMOTE_PORT'] //端口。
$_SERVER['SERVER_NAME'] //服务器主机的名称。
$_SERVER['PHP_SELF']//正在执行脚本的文件名
$_SERVER['argv'] //传递给该脚本的参数。
$_SERVER['argc'] //传递给程序的命令行参数的个数。
$_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。
$_SERVER['SERVER_SOFTWARE'] //服务器标识的字串
$_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本
$_SERVER['REQUEST_METHOD']//访问页面时的请求方法
$_SERVER['QUERY_STRING'] //查询(query)的字符串。
$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录
$_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容。
$_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容。
$_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容
$_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容。
$_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。
$_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。
$_SERVER['SERVER_ADMIN'] #管理员信息
$_SERVER['SERVER_PORT'] #服务器所使用的端口
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
```
### 包含文件
当你想把一个文件的内容包含在另一个文件中时,就会用到 `include()`……一个非常有用的函数。
```php
```
#### 包含文件的实例
假设你正在开发一个有5个页面的网站,你可能会增加一些页面。你的页面HTML看起来像这样。
```html
我的网站
页面内容……
```
而导航栏要在每一个页面中出现。
现在,当你在你的网站上添加一个页面时,你就得改变所有5个页面的代码,添加新的链接。这需要大好几分钟的时间……
那如果网站有到20个页面或更多呢?这将是一场恶梦!
**使用include!**
让我们把上面的例子中的菜单链接代码剪切下来,粘贴到一个新的文本文件中(你可以用Windows上的“记事本”(Notepad)或Mac上的“文本编辑”(TextEdit))。
```html
```
将这个文本文件保存为`navigation.inc.php`。将以下内容粘贴到原始HTML文件中的导航栏代码位置…
```php
```
然后将HTML页面保存为PHP页面。
好耶!任何时候你需要改变菜单链接,你仅需编辑一个文件——`navigation.inc.php`即可!
> 不一定非要用 `.inc.php`作为 `include`用的文件的后缀名——你可以用PHP `include`HTML和PHP代码。但是,有一点要记住,就是要从你要包含的页面中剥离出诸如 ``和 ``这样的标签。
>
> 换句话说,文件里应只有你想要包括(include)的东西!
#### 我**要求**你包含这个文件
在PHP中,你也可以使用 `require`函数来代替 `include`。
两者之间的主要区别是,如果找不到要包含的文件,`require`会停止程序运行(页面将不能完全加载);`include`会显示一个警告,并继续执行其余代码。
> 你不能重复`require`或`include`引入某个文件,
>
> 如果你记不住你有没有`require`或`include`某个文件(或者确实引入了多次某个文件),请使用`require_once`或`include_once`,这样文件就只会**引入一次**指定的文件。
### 现在,让我们在一个例子中把这一切结合起来吧
想象一下:你正在建设一个网站。200个页面。400篇文章。**纯手写代码。** 网站中的泰坦。
你想在每个页面上嵌入广告位(此处以AdSense为例)。你还想在广告代码上测试不同的颜色主题,或定期改变广告。
你也相当慷慨,想把这个网站送给别人使用。
问题开始充斥着你的头脑……
- 我怎样才能轻松地改变广告的颜色或格式?
- 我怎样才能让其他人轻松地输入他们的AdSense发布者代码?
我们将使用"变量"和"include"来解决这个问题。
创建两个文本文件。第一个是设置文件,第二个是你的广告代码。
在设置文件中,你要为**你知道你要改变的东西**设置变量,也就是`AdSense发布者代码`和`广告链接颜色`。
因此,我们将设置以下变量:
```php
```
把这个页面保存为 `settings.php`。
然后,在AdSense网站上获取广告位的HTML代码:
```html
```
并将其粘贴到另一个打开的文件中,做一些修改……
```php
google_ad_client = \"$ad_pub_num\";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = \"120x600_as\";
google_ad_type = \"text_image\";
google_ad_channel = \"1\";
google_color_border = \"FFFFFF\";
google_color_bg = \"FFFFFF\";
google_color_link = \"$eb_linkcolor\";
google_color_text = \"$eb_linkcolor\";
google_color_url = \"$eb_linkcolor\";
";
//将 google_ad_client、google_color_link、google_color_text、google_color_url 修改为对应变量
?>
```
并将此文件保存为ads.php。
现在我们已经准备好从网页上调用这些文件了!
在你的内容页面的开头,添加这段代码。
```php
```
这告诉页面,它需要包含 `settings.php`文件的内容。在每个页面上包括这段代码,设置我们将在整个网站上使用的变量。
现在,在你想要显示广告的地方使用PHP引入文件。
```php
```
因此,你的广告链接颜色将显示为深蓝色,例子中的发布者ID `pub-0123456789`将在广告中显示出来。将你的每一个内容页重命名为 `.php`,而不是 `.html`,就可以用了。
如果你决定要改变广告的颜色(或改变AdSense发布者ID代码),你只需修改**一个文件**(而不是200个文件)——`settings.php`即可!
### 使用`header()`进行重定向
你可以用PHP来重定向到其他页面或网站。
```php
```
当访客访问这个PHP页面时,他们将被重定向到代码中的`location`部分写的链接。
这是一个很好的方法,因为其他使用HTML和Javascript的重定向方法很容易被屏蔽。`header()`还有其他功能,但重定向是比较常见的用途之一,所以我们现在先不谈这个。
### 第一章 小结
虽然我们目前没有涵盖全部的基本PHP函数和语句,但我们所涵盖的函数和语句是**最常见**的,几乎可以在任何Web项目中使用。
- echo: 输出到屏幕。
- 字符串:PHP变量中的一种内容。
- 变量:某物等于另一物。
- date():显示日期/时间的一种方式。
- include():拉入另一个文件的内容。
- require():要求另一个文件的内容。
- header():重定向到新文件/URL。
接下来……
### 问答时间!
> 1. INCLUDE和REQUIRE的区别是什么?
>
> 2. 我们可以用引号来回荡单词吗?怎么做?
>
> 3. 变量的用途是什么?
非常好。现在,短暂的休息一下……然后继续下一章!
## 第二章:不简单的东西
> 涵盖`if`、`else`、`switch`、数组、函数、Session和Cookie。
### 你已经通过了问答——好耶!`ヽ(✿゚▽゚)ノ`
现在,你已经掌握了足够的PHP知识,可以在你的网站中添加基本的PHP功能。
知道很多其他人不知道的事情是非常酷的,而且他们永远无法通过右键你的网站选择“查看源代码”来发现(尤其是 你无法通过在浏览器中查看源代码 来看到PHP代码!)。
---
在本节中,我们将介绍一些更高级的PHP代码。这些东西你现在可能还用不到,但一旦你熟悉了PHP并想从中获得更多,你就准备好了,我的年轻徒弟。
在我们继续学习之前,您需要能够**在代码中添加注释**。
**为什么?** 如果你添加了注释,那么你就会更容易知道你当时为什么要写某一行代码……这样你就不会在3个月后回来问自己:*“我写这段代码的时候是不是睡着了?”*
以下是注释代码的例子。
```php
```
PHP 会忽略掉以上内容。
现在,我们继续学习PHP!
### 如果这样就好了——`if`语句
PHP中的IF语句与现实生活中使用“如果”非常相似。
> 你去看看西瓜降价了没。如果降价了,就多买两个西瓜
>
> 如果还是原价,就只买个包子
>
> 请根据西瓜价格带回晚餐
`if`(和它的朋友`else`)被称为“条件”。
首先,我们来看看PHP是如何比较条件值的。你会在IF语句中看到“运算符”。
- `==` `===` 等于
- 强烈建议使用 `===`
- `!=` `!==` 不等于
- 强烈建议使用 `!==`
- `<` 小于
- `>` 大于
- `<=` 小于等于
- `>=` 大于等于
因此,有效的IF语句如下。
```php
```
当判断条件不只有一条的时候,可以使用以下运算符组合起来:
- `&&` 与:所有的判断条件都成立,才会执行里面的代码
- `||` 或:只要有一个判断条件成立,就执行里面的代码
- `()` 括号:先判断括号里的条件,在一些情况中很有用(括号可以嵌套)
```php
```
还有……
- `!` 非(取反)
```php
```
### 用`else`扩展`if`的内容
`else`使你可以选择在`if`里的条件不成立的情况下执行`else`里的事情。
例如,你可以让你的网站在满足条件(如看到西瓜降价了)的情况下执行一些东西(买两个西瓜),或者在不满足条件的情况下进入ELSE(就只买个包子)。
```php
```
#### `If/Else`的实际应用
你可以用`If`/`Else`创建一个简单的“密码保护区域”。
- 一个带有条件语句的PHP页面,用于处理HTML登录表单。
- 可以设置变量“`$password`”
- 并且可以使用`Header`函数在成功或失败时重定向。
HTML页面是个简单的表单…
```html
```
这个HTML表单中的值将会传入 `action`中写的页面(本例中为 `login.php`)中的`$_POST`变量(后面会详细介绍),并做两件事中的一件:
- 如果密码是正确的,它将显示所需的内容。
- 如果不正确,它将重定向到另一个页面。
由于这个判断是在PHP中进行的,所以在浏览器中查看源代码是不会发现密码的。
`login.php`的内容是If/Else和重定向的结合…
```php
```
完成了!这是一种密码保护页面的简单方法。
我不会把它用于敏感的东西(比如把你的住址放在网上),但它对简单的“单层”安全很有好处。
### 又如果——`elseif`
如果你只需要检查**一个**条件,IF/ELSE语句是非常好的。
但是,如果你需要依次检查**多个**条件呢?
例如:“**如果**这辆卡车是`道奇`的,就这样做……;**又如果**这辆卡车是`雪佛兰`的,就这样做……”
但是如果卡车是`福特`的,该怎么办?
---
在这个例子中,我们只是想看看这辆卡车是否是`道奇`的。
我们可以用`IF`/`ELSE`来完成这个任务…
```php
```
现在,如果我们想看看这辆卡车是否是`福特`的,我们需要添加`elseif`语句。
```php
```
……以此类推。你可以继续使用`elseif`来声明其他可能的情况。
关于`elseif`需要记住的一点是,**没有IF就不能使用它**。
那么,如果你有**很多**的elseif呢?
### 是时候‘切’换思路了!
有时我们需要判断不止几种情况,这使得`elseif`变得有点麻烦*(你想写20个`elseif`吗? 我不想!)*。
使用更精简、更高效的`switch`语句可以解决这个问题。
让我们在列表中再添加一些卡车:
```php
";
switch ($truck){
case "Dodge":
echo "Ram Tough!"; break;
case "Ford":
echo "Built Ford Tough!"; break;
case "Toyota":
echo "Got The Guts?"; break;
case "Nissan":
echo "Shift_power"; break;
case "GMC":
echo "Professional Grade"; break;
} ?>
```
你不觉得这看起来更干净吗?比同等数量的`if/Else`语句少一点笨拙。
当你使用`Switch`时,请确保包含 "`break`"语句——如果没有的话,将会继续执行下一个 `case`里的代码,直到出现 "break "或整个 `switch`结束。
在一些情况中,这种 *你可能会觉得“反直觉”* 的设计是很有用的:
```php
$animal = "狗"; // 也可以是“猫”或下列case里的任何一种
switch($animal) {
case "狗":
case "猫":
case "金鱼":
echo $animal . "是一种宠物"; break;
case "猪":
case "牛":
case "羊":
echo $animal . "是一种牲畜"; break;
case "大象":
case "鹿":
case "骆驼":
echo $animal . "是一种野生动物"; break;
}
```
当`$animal`是“狗”的时候:
- 进入第一个case`"狗"`里,
- 里面没有`break`,
- 所以会进入到下一个case`"猫"`里,
- 里面也没有`break`,
- 所以会继续进入到下一个case`"金鱼"`里,
- 这里有一个`echo`命令和一个`break`,
- 所以会执行`echo`命令,
- 再跳出`switch`。
最终结果是:
```
狗是一种宠物
```
-----
另外,请注意,当我们选择的卡车不在任何一个`case`里,并没有语句兜底!所以只会输出:
```
Drive a Chevy,
```
我们需要在`Switch`中再加一个东西——`default`。
```php
";
switch ($truck){
case "Dodge":
echo "Ram Tough!"; break;
case "Ford":
echo "Built Ford Tough!"; break;
case "Toyota":
echo "Got The Guts?"; break;
case "Nissan":
echo "Shift_power"; break;
case "GMC":
echo "Professional Grade"; break;
default:
echo "We’ll Be There!"; break;
} ?>
```
这样一来,如果没有匹配的 `case`,就会显示我们的默认值。
```
Drive a Chevy,
We’ll Be There!
```
### 数组
数组是一个可以存储**多个值**的变量。
你可以根据需要创建尽可能多的变量来单独存储你的数据,但如果这些数据都是**相关的**,并且你想搜索它们,或以特定的方式对它们排序呢?**在一个数组中存储相关的数据**可以让你执行这些功能以及更多的功能。
数组使用键(key)确定要引用的值(value),例如:
```
$array[key] = value;
```
键通常从"`0`"开始,因为PHP喜欢从零而不是从一开始编号。*不要问为什么。*
让我们使用上面的卡车例子,并将其分配到一个数组中。
```php
```
然后我们从数组中获取数据。
```php
另外两个卡车制造商是:" .$truck_array[2] ." & " . $truck_array[3];
?>
```
下面是上述数组的输出结果。
```
两大卡车制造商是:Toyota & Dodge
另外两个卡车制造商是:Chevy & Ford
```
#### 关联数组
关联数组可让你用一个字符串作为键,并给每个键分配一个值。
```php
"Tundra",
"Nissan" => "Titan",
"Dodge" => "Ram"
);
//你也可以这样写,效果是一样的:
$truck["Toyota"] = "Tundra";
$truck["Nissan"] = "Titan";
$truck["Dodge"] = "Ram";
?>
```
一个使用上述关联数组的语法例子。
```php
";
echo "日产生产的" . $truck["Nissan"] ."
";
echo "道奇生产的" . $truck["Dodge"];
?>
```
输出结果是:
```
丰田生产的Tundra
日产生产的Titan
道奇生产的Ram
```
#### 多维数组(二维数组、三维数组等)
多维数组是**包含**一个或多个其他**数组的数组**。除了令人困惑之外,它们也不经常使用,但我们会讲一个简单的例子,这样你就知道它们是如何工作的。
```php
array("狗", "猫", "金鱼"),
"牲畜"=>array("猪", "牛", "羊"),
"野生动物"=>array("大象", "鹿", "骆驼")
);
?>
```
在这个例子中,我们有一个名为“`$animals`(动物)”的二维数组,它包含三个不同的数组(`宠物`、`牲畜`和`野生动物`),每个数组都包含自己的三个数组值。“`$animals`”数组是一个关联数组,但里面的三个数组都是普通数组,这意味着你可以这样获得“羊”:
```php
```
-----
你现在可能看不到数组多有用,但我认为(并希望)一旦我们进入下一节——**循环**,它就会变得更有意义。
让我们继续前进!
### 循环
我们都有平凡、重复的任务要做。就像在每年寄出的节日贺卡上贴邮票一样。
从编程的角度来看,可以通过`循环`帮助我们减轻网站中重复任务的工作量。
#### While 循环
我们要讨论的第一种循环是`while`循环。它是PHP中最有用的循环函数之一。
从逻辑上看,它是这样的。
```
while (此条件语句为真){
//这样做。
}
```
这不是真正的代码——只是说明了它是如何工作的。下面是一步一步发生的事情:
1. PHP检查条件语句。如果是真的(`true`),转到第2步。如果是假的(`false`),转到第4步。
2. PHP运行循环中包含的代码。
3. 回到第1步,进入下一次循环。
4. 一旦条件语句变成假的(`false`),循环就会退出,然后接着执行后面的代码。
##### While 循环实践
**奶油百吉饼公司**希望在他们的网站上显示最多20个百吉饼的价格表。
但是,由于百吉饼是一种有价值的商品,价格经常波动。你必须及时更新页面。*你热爱你的工作。*
使用`While`循环和一些HTML,这个需求可以相对容易地实现。当百吉饼价格变化时,你只需要改变**一个**值*(然后收取3小时的工作费用!)*。
```php
';
echo"| 数量 | ";
echo "价格 |
";
while ( $counter <= 20 ) { //只是将计数器的上限设置为20,可以随时改变
echo "| ";
echo $counter;
echo" | ";
echo $bagel_price * $counter; //计数器(数量)乘以单价等于最终价格
echo" |
";
$counter = $counter + 1; //这里我们在计数器上加1并重新开始
}
echo "";
?>
```
如你所见,我们设置了变量 `$bagel_price`和 `$counter`。`$counter`变量是一个算式,每次循环时将数量增加1。
因此,当$counter等于小于或等于20时,这个循环就会发挥作用。一旦我们达到21,循环就结束了——就会继续执行接下来的代码了。
这是浏览器中的样子……
```
| 数量 | 价 格 |
| ----:| -----:|
| 1 | 2.15 |
| 2 | 4.3 |
| 3 | 6.45 |
| 4 | 8.6 |
| 5 | 10.75 |
| 6 | 12.9 |
| 7 | 15.05 |
| 8 | 17.2 |
| 9 | 19.35 |
| 10 | 21.5 |
| 11 | 23.65 |
| 12 | 25.8 |
| 13 | 27.95 |
| 14 | 30.1 |
| 15 | 32.25 |
| 16 | 34.4 |
| 17 | 36.55 |
| 18 | 38.7 |
| 19 | 40.85 |
| 20 | 43 |
```
你可以一目了然地看到买13个百吉饼要花多少钱。
##### 扩展阅读:Do While循环
Do While循环与While循环非常相似,但有一个主要区别。条件是在运行每个循环**之后**而不是之前检查的。“do”部分位于“while”部分之前,因此即使条件为假,代码也会运行一次。
例子:
```php
";
$count++;
}
while ($count<=5);
?>
```
这个例子将输出数字1-5。
**Do While循环并不经常使用。**在我的职业生涯中,我还没有使用过它,但是现在你知道如果你需要它,它是存在的!
#### For 循环
`for`循环与`while`循环非常相似。区别在于循环中包含了多一点代码。`for` 循环比`while` 循环更紧凑。
逻辑是这样的:
```
for(创建一个计数器变量;条件语句;递增或递减计数器){
//这样做
}
```
for循环可以在您**事先知道应该运行多少次代码**时使用。
让我们用for循环重新写一下百吉饼价格表。
> 哎呀——百吉饼刚涨了一毛钱!
```php
";
echo "| 数量 | ";
echo "价格 |
";
for ( $counter = 1; $counter <= 20; $counter += 1) {
echo "| ";
echo $counter; echo " | ";
echo $bagel_price * $counter;
echo " |
";
}
echo "";
?>
```
你会注意到,计数器变量被定义在循环**里面**,而不是*外面*。
> **PHP里可用的数学运算**
>
> `+`加法(您可以使用++将值增加1(称之为“自增”))
>
> `-`减法
>
> `*`乘法
>
> `/`除法
>
> 当然还有更多的数学运算法/函数,之后我们就会讲到。
#### Foreach 循环
如果你想在一个数组中进行循环呢?
你可以使用`foreach`来完成这个任务。
`WHILE`和`FOR`循环一直运行到条件被满足(或遇到错误)为止(很难处理关联数组),而`foreach`循环会遍历数组中的每一项。
就像 “吃一串关东煮”。
- 数组 = 一串关东煮。
- 每次循环 = 你吃下一颗。
- `$key => $value` = 你看到这颗是什么(鱼丸/萝卜/竹轮),然后尝到它的味道。
- 你不可能同时吃两颗(一次循环处理一对键值)。
- 你会一颗接一颗吃,直到签子空了(数组遍历完)。
```php
"鱼丸", "第二颗" => "大萝卜", "第三颗" => "竹轮"];
foreach ($关东煮 as $位置 => $食材) {
echo "你吃下了第{$位置}颗,它是{$食材}。
";
}
```
输出:
```
你吃下了第一颗,它是鱼丸。
你吃下了第二颗,它是大萝卜。
你吃下了第三颗,它是竹轮。
```
#### 扩展阅读:跳出循环
有时你想在循环完成之前就结束循环(比如你已经得到了你需要的结果时),使用`break`语句就可以做到。
> (没错,和Switch的break是一样的)
```php
300) { break; }
echo $number . "
";
$number += 75;
}
?>
```
通过在`for`循环中添加一行代码,我们可以看到`break`语句在起作用。如果`$number`的值大于300,则执行break语句,跳出循环。跳出循环后,break语句之后的代码 和剩余/未完成的循环都被忽略。
结果将是:
```
75
150
225
300
```
如果有多个循环(嵌套的),break语句还接受一个数值来表示要跳出几层循环。`break 1;`和`break;`效果一致。所以要跳出两层循环,应该要写`break 2;`,以此类推。
```php
";
if ($b>500) { break 2; }
$a++;
}
}
?>
```
在这个示例中,我们能看到while循环里还包着for循环,for循环里包含一个条件判断,即“如果$b变量值大于500,则跳出2层循环”。你能弄清楚这段代码还在说什么,结果会是什么吗?
-----
以上就是我们需要介绍的 有关循环的全部内容。接下来是…
### 函数(`Function`)
感觉PHP中的**几乎所有东西**都是一个**函数**,对吗?那么,这个"函数"的定义就有点不同了。
PHP中的函数其实**很容易理解**——如果上过小学的话,你一定会熟悉这种题型:
> 假设`a ★ b = ( a + b ) / b` 。求 `8 ★ 5` 。
这里的“`★`”就像是一个函数,它把**一种比较复杂的运算方式**(两数之和除以后一个数的商)定义成**一个符号**,符号两边则为**自变量 *(加数/乘数…)* **,参数通过运算得出**因变量 *(和/积…)* **。
在PHP里也是一样的道理,你可以把**一系列要做的事情**定义成一个**函数**,并给它起**一个名字**,并留出**参数**位置,参数通过函数内的处理得出**结果**。
还记得之前我们谈到的“重复性任务”吗?函数可以帮助我们进一步减少这些“重复工作量”,只需写一次代码,然后将其定义成一个函数,就可以随时随处使用了。
你可以像这样创建一个函数:
```php
function MyFunctionName(/* 这里写参数 */){
//定义函数要做的事情
}
```
> 你可以给函数起任何你想要的名字,只要函数名不是PHP内置的函数名(或还没有用作PHP函数的名字)即可。函数名不区分大小写,可以包括字母、数字和/或下划线,但只能以字母或下划线开头。
**简单!**太简单了?*可能吧。*让我们尝试一些更复杂的东西。
```php
function multiply($a, $b) {
return $a * $b;
}
echo multiply(5, 7);
echo multiply(3, 100);
echo multiply(7000, 68);
```
当我们定义这个函数的时候,在函数的括号之间有两个**参数**(称为“形参”)。
这些参数在函数中使用,它们相互相乘并返回乘积。
直到函数**被调用时**,参数才被实际赋值(称为“实参”)。此时,值需要填写在函数的圆括号中,按函数定义的参数的顺序填写,并用逗号分隔。
#### “为什么要创建函数?为什么不直接当场写好所需的代码并继续前进呢?”
如果你认为你可能会多次使用相同的代码的话,**将其放入函数中**,之后根据需要多次调用该函数,可以**节省大量时间和精力**。您甚至可以将函数存储在单独的文件中,并根据需要将文件包含(`Include`)在尽可能多的文件中,这样就可以在任何文件里使用自己的函数了。
函数是相当酷的。
#### 实际应用1
使用PHP回答以下问题。
> 定义一种新的运算符号⊗,已知:2⊗3=2+3+4=9;7⊗2=7+8=15;3⊗5=3+4+5+6+7=25,
>
> 按此规律计算4⊗6=?
可以看出⊗前的2为起始数值,⊗后的3是起始数值**及其后连续自然数的个数**,所以,
```php
function new_sum($x, $y) {
$result = 0; //结果
for($i = 0; $i < $y; $i++) { //$i是计数器
//当计数器小于⊗后的数字时停止运算并返回结果;由于计数器是从0开始的,所以第一次循环的时候等于将$x里的数字赋值到$result里,之后便会继续计算。
$result = $result + ($x + $i);
}
return $result;
}
echo new_sum(4,6);
```
#### 实际应用2
你想让一个网站的每一页都写上公司名称。让我们创建一个函数(称为`myCompanyName`)来做到这一点。
```php
```
然后,我们在大括号之间添加我们想要执行的代码。
```php
```
现在,每当我们想要我们的公司名称出现时,你就可以在任何地方的PHP标签中调用这个函数。
```php
";
myCompanyName();
?>
```
输出看起来像这样…
```
是时候让你体验一下更好的百吉饼了吗?
欢迎来到奶油百吉饼公司!
```
### PHP内置的函数
#### 字符串函数
PHP提供了近100个可以以各种方式操作字符串的函数。一些(但不是全部!)可以在字符串上执行的函数是:
- 比较两个字符串
- 在另一个字符串中找到一个字符串
- 找出一个字符串在另一个字符串中出现了多少次
- 返回字符串的一部分
- 替换字符串的一部分
- 从字符串的末尾修剪空白
- 使整个字符串变小写或大写字母
- 将字符串中的一些字符转换为HTML实体,反之亦然
- 从字符串内部剥离HTML标签
最简单的字符串函数是那些只需要一个参数的函数。这个参数是字符串本身,可以作为变量,也可以作为单引号或双引号字符串接受。例如,strlen()函数将返回给定字符串的长度。
```php
$string = "What is the definition of a caterpillar?";
echo strlen($string);// 结果将是: 40
```
大多数函数接受多个参数。例如,strpos()函数搜索一个字符串在另一个字符串中的出现情况,并且需要两个参数才能正常工作。多个参数以逗号分隔。
```php
$str = "船上有四只猫,一只跳出来了。还剩下多少人?";
echo mb_strpos($str, "猫");//结果将是: 5
```
`strpos()`函数将返回一个数字,指示它遇到的第一个匹配项的位置。如果你自己开始数,你会发现“猫”是第6个字符……为什么函数的结果是5?这是因为**大多数PHP函数从0开始计数**,所以字符串的第一个字符是0,第二个字符是1,等等。
下面是50个有用的字符串函数的列表,以及简短的描述和所需的参数。
#### 数学函数
PHP提供了近五十个函数,可以执行各种数学运算。结合数学运算符,它们可以让你的作业轻松很多!
最简单的数学函数是那些只需要一个参数的函数。这个参数通常是一个数字,它可以作为变量或字符串被接受。例如,`ceil()`函数将返回一个四舍五入到最接近的整数的数字。
```php
$num = 55;
echo ceil($num); // 结果将是: 55
$result = ceil(295.34);
echo $result; // 结果将是: 296
```
一些数学函数接受多个参数。例如,`rand()`函数在给定的两个数字之间生成一个随机数。多个参数间用逗号`,`分隔。
```php
echo rand(0, 500); // 结果可能是: 19
```
如果你刷新页面,你会看到上面的结果每次都变成0到500之间的随机数。
下面列出了近二十个有用的数学函数,以及简要描述和所需参数。
| 函数 | 描述 |
| ---------------------------- | ---------------------------------------------------- |
| rand(min_number, max_number) | 返回一个随机整数 |
| ceil(number) | 返回向上取整的数字 `⌈number⌉` |
| floor(number) | 返回向下取整的数字 `⌊number⌋` |
| abs(number) | 返回数字的绝对值 `|number|` |
| base_convert(number) | 将数字从一个进制转换为另一个进制 |
| bindec(binary_number) | 将二进制数转换为十进制数 |
| decbin(decimal_number) | 将十进制数转换为二进制数 |
| dechex(decimal_number) | 将十进制数转换为十六进制数 |
| hexdec(hex_number) | 将十六进制数转换为十进制数 |
| fmod(number, divisor) | 返回除法的浮点数余数 `number mod divisor` |
| is_finite(number) | 如果值**是有限数**,则返回true |
| is_infinite(number) | 如果值**是无穷数**,则返回true |
| is_nan(value_to_check) | 如果值**不是数字**,则返回true |
| max(Number1, Number2) | 返回两个指定数字的**最大值**的数字 |
| min(Number1, Number2) | 返回两个指定数字的**最小值**的数字 |
| pi() | 返回π的值 |
| pow(x, y) | 返回x的y次方 `x^y` |
| round(number) | 将数字四舍五入到最近的整数(小数点后的位数可选) `[x]` |
| sqrt(number) | 返回数字的平方根 `√ ̄number` |
可以在[官方PHP手册](https://www.php.net/manual/zh/ref.math.php)中找到可用数学函数的完整列表。每个函数都包含帮助您了解如何使用它的示例。
#### 日期与时间函数
有将近五十个日期和时间函数,但你其实只需要三个。
函数描述
time()以Unix时间戳的形式返回当前时间
date()格式化本地时间/日期
strtotime()将英文文本日期或时间解析为Unix时间戳
> **`date()`函数的参数**
>
> **时间**
>
> a:上午或下午(小写英文字母)
>
> A:上午或下午(大写英文字母)
>
> G:不带前导零的24进制小时(0-23)
>
> h:带前导零的12进制小时(01-12)
>
> H:不带前导零的24进制小时(0-23)
>
> i:带前导零的分钟(00-59)
>
> s:带前导零的秒数(00-59)
>
> **日期-年**
>
> L:如果是闰年,则显示1;如果不是,则显示0
>
> Y:四位数格式的年份(2006)
>
> y:两位数格式的年份(06)
>
> **日期-月**
>
> m: 带前导零的月份(01-12)
>
> n:不带前导零的月份(1-12)
>
> m:月份缩写(Jan – Dec)
>
> F:月份名称(January – December)
>
> t:该月的天数(28-31)
>
> **日期-日**
>
> d:带前导零的当月日期(01-31)
>
> j:不带前导零的当月日期(1-31)
>
> d:星期几的缩写(Sun–Sat)
>
> I:星期几(Sunday – Saturday)
>
> w:不带前导零的星期几(0-6)
>
> z:不带前导零的一年中的天数(1-365)
>
> **其他日期格式**
>
> r:完整日期,包括时间戳和时区偏移量(O)
>
> U:自Unix纪元时间(1970年1月1日)以来的秒数
>
> O:与GMT时间(格林尼治标准时间)的偏移差。`100`=1小时,`-100`=负1小时
### PHP 会话
当你的网站开始变得更加“先进”,并且你发现你需要在网站的不同页面上提供特定的用户数据(比如购物车)时,就到了用会话(`Session`)的时候了。
开始一个会话是很容易的。
```php
```
服务器将创建一个非常非常长的随机“会话ID”来表示一个独特的会话。看起来像这样:`a8486dd2a3eacc136bd44ca653d8c5a2`
除非我们能在其中存储数据,否则这个会话是不值一提的。
PHP提供了一个关联数组变量——`$_SESSION`——可以让我们对其进行操作。(是不是有些开始明白了?)
**让我们来做一个基于会话的登录表单吧!**
```php
```
```html
```
你的用户名和密码现在被储存在一个数组中,将持续到会话被“删除”。
删除一个会话是在以下两种情况下进行的。访客关闭浏览器,或者 PHP 执行清除会话的函数,又称“销毁”。
> **你可以这样想**:你的会话是一个画有信息的液晶画板。在你清除它之前,画的东西会一直在那里。
```php
```
使用这个函数,会话就被“摧毁”了。这将清除与当前会话相关的任何数据。
> “那么,如果我想从一个会话中删除特定的数据而不删除整个会话,该怎么办?”
这可以通过`IF`语句与`isset`和`unset`函数相结合来完成。
```php
```
因此,从逻辑上讲...
```
如果在这个会话中有"某个特定的键",则删除该"键'的数据。
```
### Cookies (好吃 ლ(´ڡ`ლ) )
希望你对Cookies很熟悉——你在访问几乎任何网站的时候都会收到这个东西。**Cookies可让你在访客的电脑上存储有关他们的会话信息。**
Cookie最常见的用途之一是存储用户登录信息。当浏览者回到你的网站时,他们就不必再次需要登录了。
你可以用以下方法在PHP中创建cookie。
```php
```
设置cookie时有3个必填项:
- `name`:**名称**:设置您的cookie名称,以便您以后可以获取它的值。
- `value`:**值**:你希望在你的cookie中存储的值。常见的值包括`用户名`或`最后访问的日期`。
- `expiration`:**过期时间**:设置您的cookie何时会从用户的电脑中删除。如果您不设置过期日期,cookie将在浏览者关闭其浏览器时被删除!
从cookie中获取信息就像设置cookie一样简单。
还记得几分钟前学到的 "`isset()`"吗?PHP获取cookie数据的方法与此类似,使用`$_COOKIE`关联数组 *(是的,又来了!)* 来存储你所获取的cookie数据。
数组的键是你在设置该变量时给它起的名字。*(你可以设置任何数量的cookie!)*
```php
```
还有,Cookies是以小文本文件的形式存储在你的电脑上。*(如果你不知道的话!)*
### 处理表单-实战
让我们回到之前介绍“循环”的地方。
现在,奶油百吉饼公司希望用户可以在他们的网站上购买百吉饼。
你询问你的同事,知道了购买步骤:
- 用户输入用户的名字、百吉饼的数量和住址
- 用户点击提交按钮,让用户确认填写的信息无误
- 用户点击确认按钮,网站向库管发送一封电子邮件
- 之后,库管将百吉饼送到用户家门口
让我们一步步实现。
#### 用户输入用户的名字、百吉饼的数量和住址
需要一个HTML表单。
```html
订购百吉饼
订购百吉饼
```
#### 用户点击提交按钮,让用户确认填写的信息无误
```php
请确认订单
请确认您的订单
- 您的姓名
- 您的住址
- 购买数量
- 需付款(元)
若上述信息准确无误,请点击“确认购买”按钮,完成购买。
大约于1小时内送达。
```
#### 用户点击确认按钮,网站向库管发送一封电子邮件
```php
客户姓名
$order_name
客户住址
$order_address
购买数量
$order_amount
";
// 如果服务器已经配置好了邮件服务,使用mail函数就可以发出电子邮件。
mail($email_sendto,$email_subject,$email_message);
?>
感谢您的惠顾
尊敬的 先生/女士:
- 您购买了:
- 个
- 共计(元)
- 将会送往:
我们的宗旨是为您提供高品质的产品和良好的售后服务,如果您对我们的产品或服务有任何意见和建议,欢迎您随时与我们联系。请拨打24小时的免费热线电话 9876543210 或发送电子邮件至 support@creamy-bagels.example.com 。我们会在24小时内答复您的邮件。
再次感谢您的惠顾。我们将竭诚为您服务。
```
#### 库管将百吉饼送到用户家门口
这个就不是我们需要操心的地方了。我们做好自己该做的事情就好。
-----
实际上,要实现这一整套流程并不简单。你需要考虑到:
- 用户是否需要在公司网站上注册账户,用来保存自己的姓名、住址等信息,以便下次购买
- 未来公司发展,推出不同口味的百吉饼(和其他甜点),订购页面需要改进
- 设计一套用户界面,让员工更轻松地管理产品、用户等
- 如何防止恶意用户订购一亿亿个锟斤拷到海王星上去
- 如何让一万个用户同时购买百吉饼的时候,服务器不会冒烟
- 等等……
以上这些都不在本教程的范畴中。
### 第二章概述
在本章中,我们介绍了PHP的一些更高级的特性。
不适合胆小的人,但也不是不可能掌握的!
- `if(){}` - 如果某事是真的,就做某事。
- `else{}` - 如果不是,就做其他事情
- `elseif(){}` - 在If中增加更多的选择
- `switch(){}` - 如果你有大量的ElseIf,请使用它
- 数组 - 一个变量,许多值
- 关联数组 - 一个变量,甚至更多的值
- 循环(For, While, Foreach) - 重复执行代码的方法
- 函数 - 把大的代码块变成小的
- 会话(Session) - 在页面之间携带独特的数据
- Cookie - 在浏览者的计算机上存储会话数据
- 表单处理 - 让客户与你互动的方式之一
### 问答时间!
1. 在PHP中注释代码的3种方式是什么?
2. ELSEIF**不能不**使用_____
3. PHP中的Cookies有什么用?
## 第三章:天哪,是MySQL!
> 涵盖通过PHP连接和操作MySQL数据库
### 使用数据库实现更多功能
PHP和MySQL是Web应用程序开发的绝佳组合。MySQL经常与PHP结合使用,原因与PHP如此受欢迎的原因相同——它是免费的,广泛可用,大多数Web服务器都安装了它。PHP还可以使用其他数据库系统,但MySQL似乎是最常见的。
在本节中,我将使您熟悉使用`mysqli`连接到MySQL数据库并执行基本操作。
`高级MySQL`和`SQL语言本身`有点超出了本书的范围,所以我们不会深入到沉重的细节(我不想失去你!)。然而,MySQL的命令是用几乎简单的英语编写的(初中英语足够了),你通常只要看一下就能明白。
大多数PHP/MySQL书籍也告诉你如何安装MySQL和配置它。我们不会在这里这样做。你的Web服务器很可能预装了MySQL供你使用,而且他们有简单的方法来创建数据库。
所以,让我们连接起来吧!
### 建立与MySQL的连接
首先,在我们**使用**数据库之前,我们需要告诉PHP**连接**到数据库。这个命令很简单——`mysqli_connect()`。
```php
";
die; //不执行接下来的代码
}
// 用完数据库之后别忘了断开连接
// mysqli_close($con);
?>
```
看一下上面的代码,一切都很好解释……除了`if(mysqli_connect_errno($con))`。这是一种处理错误的方法。
如果由于某种原因PHP不能连接到数据库,`mysqli_connect_error()`部分会告诉PHP向我们显示错误的确切内容。大多数情况下是人为的错误——在代码中输入了错误的用户名、密码等。**务必检查你写的对不对!**
### 将**数据**放入数据库
好耶!我们连接到了MySQL数据库!`ヾ(✿゚▽゚)ノ`
现在怎么办?我们需要**把数据输入到数据库**并使用它!
首先,你需要用`mysqli_select_db()`函数选择要使用的数据库。
```php
```
### 用`mysqli_query()`创建表(以及做其他的事情!)
现在我们已经选择了我们要使用的数据库,我们需要在数据库中创建一些表,以便存储数据。
不过,在这之前,你需要考虑**什么样的数据会在表里面出现**。我一会儿就会说到原因。
下面是一个用`mysqli_query()`函数创建表的简单例子。
```php
```
你需要定义表里的列(字段)的数据类型......这就是为什么你需要“设计”数据库里的表。
请记住,如果你试图将文本(TEXT)放入一个被定义为接受数字(INT)的列中,你会得到错误!(这就是“方枘圆凿’的情况!)
#### 常见的字段数据类型。
- CHAR() - 字段长度固定,介于0到255个字符之间(在括号中指定长度),可以存储任何类型的数据。**要放入的数据不能超过指定的长度。**该字段的长度设置与放入该字段的数据大小无关,也就是说,可以往CHAR(10)里放入1个字符,但占用的空间还是10个字符。
- INT - 只有整数。也可以在括号中指定位数,但没有必要。范围:-2,147,483,648到2,147,483,647(UNSIGNED:0~2^32);可定义为`unsigned`从而禁用负值,使列的取值范围为0以上。
继而(在一些情况中)导致可存储的数据变少!**
- FLOAT - 可带小数的数字,精度稍低。
- TEXT - 可变长度的纯文本字段,最大长度为65,535个字符。
- DATE - 日期,格式为`YYYY-MM-DD。
- TIME - 时间,格式为`hh:mm:ss`。
- DateTime - 日期与时间組合,格式为`YYYY-MM-DD hh:mm:ss`。
- VARCHAR() - 可变长度字段,介于0到255个字符之间(在括号中指定长度),可以存储任何类型的数据。与`CHAR()`类型不同,每个`VARCHAR()`字段的长度由放入的数据决定。
所以,知道了这些,让我们来解读上面的代码例子。
- ``
- (结束)
一旦你掌握了基本概念,用MySQL进行数据操作就不难了。让我们再深入了解一下表的布局方式。
> **更多较为少见的数据类型**
> - TINYINT - 整数。范围:-128到123(UNSIGNED:0~255)
> - SMALLINT - 同上。范围:-32,768到32,767(UNSIGNED:0~ 65535)
> - BIGINT - 同上。范围:-9,223,372,036,854,775,808到9,223,372,036,854,775,807(UNSIGNED:0~2^64);**不要盲目使用太大的数据类型,会使数据库“占地空间”变大,
> - DOUBLE - 可带小数的数字,但精度更高、需要更多空间存储,适合小数位数多的情况。
> - TINYTEXT - 可变长度的纯文本字段。最大长度为255个字符。
> - MEDIUMTEXT - 同上。最大长度为16,777,215个字符。
> - LONGTEXT - 同上。最大长度为4,294,967,295个字符。
> 使用合适的数据类型可以优化数据库的使用空间,让你可以存储更多数据。
### 主键
在我们的日常生活中,很多时候我们需要唯一地标识某个事物或个体,以便我们能够准确地找到它、引用它或者记录它的相关信息。比如,在学校里,每个学生都有一个唯一的学号;在公司里,每个员工都有一个唯一的员工编号。
同样的,在使用电子表格软件(如Microsoft Office Excel)的时候,虽然我们通常不会直接用到“主键”这个词,但行号在某种程度上扮演了类似的角色,帮助我们识别某一行数据。
而在数据库中,为了实现数据的唯一性,我们引入了“**主键**”这一概念。主键是表中的一列或列组合,其值能够唯一地标识表中的每一行。与现实生活中的学号、员工编号或图书馆的书号类似,主键是数据库表中数据的“身份证”。
你可以比较容易地绘制出你的数据库——或者你可以在电子表格中创建一个模拟的数据库。比如说:
| employee_id | first_name | last_name |
|-------------|------------|-----------|
| 101 | Bill | Lumbergh |
| 102 | Tom | Smykowski |
| 103 | Michael | Bolton |
| 104 | Peter | Gibbons |
当我们创建这样的表时,会明确指定`employee_id`列为主键,以确保其值的唯一性。
此外,为了使数据库更易于使用,我们通常会为主键列设置`AUTO_INCREMENT`(自增)属性,这样数据库在插入新行(写入新的数据)时会自动为新的一行数据生成一个递增的唯一值。同时,我们还会设置主键列为`NOT NULL`,以确保每条记录都有一个有效的主键值。
这样,当你向这个表中添加新员工的信息时,你不需要手动为employee_id指定编号,数据库会自动为你处理。
#### 代码实例
```php
";
die;
}
// SQL语句,用于创建Employees表
$sql = "CREATE TABLE Employees (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
employee_id INT UNIQUE,
first_name VARCHAR(50),
last_name VARCHAR(50)
)";
// 执行SQL语句
if (mysqli_query($con, $sql)) {
echo "表创建好了!";
} else {
// 如果表创建失败,输出错误信息
echo "表创建失败: " . mysqli_error($con);
}
?>
```
让我们一步一步地解析这个。
- 首先,我们定义了数据库连接所需的参数,包括数据库服务器地址(`$dbhost`)、数据库名称(`$dbname`)、数据库用户名(`$dbuser`)和密码(`$dbpass`)。
- 接着,我们使用`mysqli_connect()`函数尝试建立与MySQL数据库的连接,并将连接结果存储在变量`$con`中。
- 在确认数据库连接成功后,我们编写了一个SQL语句,用于在数据库中创建一个名为`Employees`的表。这个表包含五个字段:
- `id`:一个整数类型的字段,设置为非空(`NOT NULL`)且自增(`AUTO_INCREMENT`)。这意味着每当插入新记录时,MySQL会自动为`id`字段分配一个唯一的递增值,并且这个字段被设置为主键(`PRIMARY KEY`),以确保表中每行数据的唯一性。
- `employee_id`:另一个整数类型的字段,我们假设它也应该是唯一的(通过`UNIQUE`约束实现)。这可以用于存储员工在公司内部的唯一标识符,即使员工信息在数据库中有所更改,这个标识符也能保持不变。
- `first_name`和`last_name`:两个可变长字符串类型的字段,分别用于存储员工的名字和姓氏。这里我们设置了最大长度为50个字符。
- 使用`mysqli_query()`函数执行上述SQL语句。如果表创建成功,则输出“表创建好了”的消息;如果创建失败,则输出MySQL返回的错误信息。
- 最后,我们使用`mysqli_close()`函数关闭与MySQL数据库的连接,以释放数据库资源。
### `IF NOT EXISTS`
创建一个已经存在的表,会不会出错?
**是的,因为表已经存在了。**
这就是为什么你要在`CREATE`中使用"`IF NOT EXISTS`"子句。如果表已经存在,就不会再“创建”一次了。
> **注意**:如果是一个全新的数据库的话,你就不必担心表是否已经存在。
>
> 当您将表添加到现有数据库时,将`IF NOT EXISTS`子句纳入其中是一种很好的做法。
```php
```
在MySQL中,"`IF NOT EXISTS`"子句可用于其他事情,如创建数据库。你也可以在数据选择和其他查询中使用它(以及它的伙伴`IF EXISTS`)。
### 插入数据
使用前面的员工表"`Employees`"为例,讲解向表中插入数据的语法。
> 节省时间:使用PHP函数和/或`Include()`来设置`mysqli_connect`函数,因为**只要你用到数据库,它就必须存在**。
```php
";
die;
}
// 插入数据
mysqli_query($con,"INSERT INTO Employees
(employee_id, first_name, last_name) VALUES('103', 'Michael', 'Bolton' ) ");
?>
```
### 用`SELECT FROM`获取数据
把数据放进表里是很好的。如果你想让你的网络应用变得有用的话,你最终还是要把数据拿回来的。这就是SELECT和FROM的用武之地!
将数据放入表中非常棒。如果你希望你的Web应用程序有用的话,你最终还是要把数据拿回来的。**这就是`SELECT`和`FROM`的用武之地!**
#### 使用方法
```sql
SELECT 东西 FROM Table
```
> 从 *Table* 中选择 *东西*
如果你想从一个表中选择所有的东西,使用星号`*`。像这样。
```sql
SELECT * FROM Table
```
> 从 *Table* 中选择 *所有行*
或者,你可以通过该行的主键来选择特定的东西。像这样。
```sql
SELECT 3 FROM Table
```
> 从 *Table* 中选择 (主键为)*3*(的行)
你还可以使用WHERE来进一步挖掘你想要的数据。
```sql
SELECT * FROM Table WHERE last_name='Lumbergh'
```
> 从 *Table* 中选择 *last_name等于'Lumbergh'* 的 *所有行*
---
我们再来看看我们的雇员表。
```php
";
die;
}
// 查询数据
$result = mysqli_query($con,"SELECT * FROM Employees WHERE last_name='lumbergh'");
?>
```
现在,如果我们不记得如何拼写Lumbergh,而只是想找到以`L`开头的雇员姓氏,我们可以使用百分号`%`作为通配符。像这样。
```php
```
该查询将返回`last_name`列中以字母`L`开头的数据。
### 更新数据
如果数据需要改变,我们可以使用`UPDATE`和`SET`命令来更新它。让我们假设Peter Gibbons把他的姓改为`Griffin`。我们将简单地更新这个字段...
```php
```
### 删除数据
就像我们要添加数据一样,有时我们也需要删除数据。
```php
```
---
好的…我不会再深入了。我相信你的头脑现在已经够用了。
在MySQL中还有很多可用的功能,但这次我们不会介绍它们。
## 总结
感谢你能看到这里。
我希望你在读完这本书后,能对**PHP能为你做些什么**有一个很好的理解。刚开始的时候,PHP看起来很吓人,但当你深入了解它的细节时,你会愈加熟练。
最后我还要提一句,编程语言只是工具,没有什么“谁好谁坏”之分,只是“在某些领域中,某几种编程语言有优势”。PHP的优势在Web端,从网站到App,都是它的强项与领地。
但同时也不要局限自己的视野,多学几门编程语言(如JavaScript、Python、Go、Java等),你会有更广阔的**发挥自己**的空间。