php不会写 能看懂,人人都能看懂的全栈开发教程——PHP

既然我们是要实现从数据库里读取任务列表这个需求,那么首先我们就得知道如何通过编程的方式从数据库里把数据读出来。这里我们就选 PHP 作为我们的编程语言来实现我们的想法。

为什么是 PHP 呢?主要有以下两个原因:

PHP 比较简单,入门容易特别适合教学

全世界十个网站大概有八个都是 PHP 做的,所以市场还是有的

PHP 的历史也很长了,年纪大意味着稳定,但不一定意味着过时,PHP 最近一段时间还在新增功能,而且变化很快

当然作为『全栈』工程师,我们要接触的语言是很多的,后面还会遇到,但当你接触多了之后,就会发现语言跟语言之间还是有很多相通的地方,当你熟悉其中一个的时候,学起另外的就会快很多。

到目前为止我们已经知道两种语言了,HTML 和 SQL,只不过这俩语言是属于只服务于自己专业领域的语言,比如 SQL 就是用来操作数据库的,HTML 就是用来表示页面数据的。而有些编程语言适用性就更广一些,能解决各种各样的问题,这种语言就叫做 General Programming Language,简称 GPL,PHP 将是我们了解到的第三个语言,也是第一个 GPL。

就好像 HTML 需要浏览器来执行,SQL 需要通过 MySQL 来执行一样,PHP 也需要一个叫『PHP 解释器』的软件来执行。在 Ubuntu 里我们可以很方便得安装它

sudo apt install php-cli

# 我们也可以通过以下命令安装,但会安装很多我们用不到的组件,所以不太建议

sudo apt install php

提示安装完毕之后,我们可以通过下面的命令确认一下:

php -v

如果安装没有问题,会提示 PHP 解释器当前的版本。一般来说,PHP 的版本会显示为 PHP 7 以上。对于目前的项目需求来说,PHP 7.0 就已经足够我们用了。

这里要说明一下,因为 PHP 操作 MySQL 服务是一个可选功能,可能默认是不会安装的,所以我们要先检查一下是否支持连 MySQL。PHP 是通过 pdo_mysql 模块来连接 MySQL 的,我们可以通过下面的命令来查看 PHP 已经加载的模块(参数 -m 即 modules 的意思)

php -m

不出意外应该会返回一堆默认被安装的模块的名称,这些模块都是干嘛的先不用去管,现在的重点只是确认 pdo_mysql 模块在不在就行了。

这里顺便跟大家分享一个 Linux 里的命令或者说工具叫 grep,基本上所有发行版安装好都自带的。它的作用就是查找某个文字流里有没有出现某个指定的字符。最常见的文字流就是文件了,如果我想查找文件 index.html 里有没有出现 html 这个单词,就可以通过以下命令快速知道结果:

grep html index.html

大家可以通过 grep --help,或者 man grep 命令(man 是 manual 的意思即手册),或者就在网上查 grep 的所有用法,查多个文件,查某个目录下所有文件,给关键词加颜色(有些发行版默认就加了)等很多功能都是提供的。

通过 grep 这个特性,我们可以不用对着 PHP 返回的一堆模块看瞎了眼。但问题是 grep 只能找文件,如何用在 PHP 返回的结果里呢?

答案是在 *nix 系统里,我们可以将文件理解成文字流输入源,另外我们也可以通过『转发』操作,也就是 |,将 A 程序的输出,转成 B 程序的输入:

php -m|grep pdo_mysql

如果 PHP 加载了 pdo_mysql 模块,就应该返回 pdo_mysql。

如果我们发现 pdo_mysql 没有安装,那么我们可以通过下面的命令安装就行

sudo apt install php-mysql

开始第一个 PHP 程序

不过且慢,我们先回到当前 Ubuntu 账户的 home 目录

cd

Home 就是『家』这大家应该都知道,那么家之外就属于公共环境了,就跟你不应该在公共环境放自己的家具一样,我们也不应该在 home 之外的目录乱放文件。

你可以通过下面的命令确认是否在自己的 home 目录下:

pwd

pwd 就是 Print Working Directory 的意思,即打印当前的工作目录,正常情况下,你现在应该在 /home/你的用户名/ 这个目录里。

mkdir 是 MaKe DIRectory 的意思,即创建文件夹,我们先给自己创建一个名叫 code 的文件夹,或者说目录,当成我们的项目根目录。当然你也可以自己起名字

mkdir code

为了确认是否创建目录成功,我们可以通过『列文件(夹)』命令 ls (即 LiSt),列出当前目录下都有啥

ls

ls 命令也有很多参数,比如最常见的有 -l 即 long,没错,也就是更长(详尽)的信息,这里就不展示了,可以自己试试。

在 Linux 里还有 alias 即『别名』这个概念,可以把一些命令取一个别名,一般来说都是把长命令变成短别名。有好多发行版会默认将 ls -l 命令添加别名为 ll,大家也可以尝试一下自己的发行版是不是也是这样的。另外大家也可以通过 alias 命令列出当前所有的别名,或者新增别名:

# 列出所有别名

alias

# 新增别名

alias llh='ls -lh'

非 PHP 的话题不再展开。我们先进入项目根目录即 code 目录,然后使用 touch 命令创建一个文件 index.php,接着用大家自己喜欢的编辑器打开它,当然为了演示方便,我这里就用 Ubuntu 自带的,用起来跟 Windows 下记事本差不多的编辑器 gedit(实际上 gedit 功能要比 notepad 多多了)。

cd code

touch index.php

gedit index.php

我们在 gedit 里添加如下代码:

Hello world

保存之后,切换会终端,并运行以下命令:

php index.php

如果你能看到 Hello world,恭喜,您的第一个 PHP 程序已经能成功运行了。

是不是觉得,这什么玩意儿,我也没写啥啊?

我们再回到编辑器,将内容稍作添加:

Hello world

echo 'Bye world';

?>

再次回到终端运行脚本,返回的内容就是两行 xxx world 了。

这里我们可以做一个小总结,在 PHP 代码里,在 <?php和 ?>之间的代码,是 PHP 解释器要当作代码来处理的,而在之外的代码,PHP 解释器只是原样输出。

接下来我们将跳过一般教材特别无聊的基本概念介绍,直接说如何从数据库里读取数据,下面是从数据库读数据的代码,切记不要跳过注释

// 此为 PHP 里的注释

/* 也可以这么写注释 */

// Pdo 是一个『类』,对一个类做 new 操作,会变成一个『对象』

$pdo = new Pdo('mysql:dbname=minetodo', 'root', '123456');

// 我们可以把 $pdo 理解成之前我们用的 mysql 客户端,而 query 『方法』就跟在 mysql 客户端里执行 SQL 是一样的意思。

$rows = $pdo->query('select * from task');

// 大家可以先猜猜 foreach 是什么意思

foreach ($rows as $row) {

// var_dump 『函数』,可以将某个『变量』里的数据格式详细打印出来

var_dump($row);

}

// 如果后面不需要输出别的内容,PHP 代码关闭记号是可以省略不写的,建议不写,原因以后会说

这里我不会对什么是类,什么是函数,什么是方法给你们总结,那都是我的总结,不是你们自己的,学习最好的方式依然是从例子中去感受。如果你就想看别人的总结,网上也有很多很多,这里就不重复重复再重复了。

这里我们先重点看这一行

$pdo = new Pdo('mysql:dbname=minetodo', 'root','123456');

是不是感觉跟用 mysql-client 链接 MySQL 服务的命令很类似?让我们再回忆一下:

mysql -u root -p 123456

还记得我说如果没有设置密码,就不需要 -p 参数吗?PHP 代码是一样的,如果没设置密码,就不用写第三个参数,直接这样就行

$pdo = new Pdo('mysql:dbname=minetodo', 'root');

可能有些爱发问的小伙伴会问第一个参数为什么是那样写,我这里只先简单介绍一下,PDO (即 PHP Data Objects,PHP 数据对象)不仅可以支持 MySQL,其他很多种类的数据库都是支持的,比如之前提过的 SQLite,他也是支持的。它的第一个参数叫 DSN,即 Data Source Name,数据源名,DSN 包含了要连接的数据库类型,以及数据库地址等信息。比如例子里写的就是『数据库是 MySQL 类型,库名,即 dbname,是 minetodo』。假如我们的数据库是 SQLite 并且数据库文件是 minetodo.db,我们也可以写成

$pdo = new Pdo('sqlite:///minetodo.db');

注意上面例子连用户名都去掉了,因为 SQLite 不需要用户名(以及密码)。

还记得我们的需求吗?其中有一个需求是,在命令行下可以列出任务。在不知不觉中,我们已经完成了这个一个需求:

php index.php

当然我们会发现 var_dump 函数所打印出来的数据信息,过于详细:

array(4) {

["content"]=>

string(15) "第一条任务"

[0]=>

string(15) "第一条任务"

["created_at"]=>

string(19) "2020-01-29 22:36:10"

[1]=>

string(19) "2020-01-29 22:36:10"

}

var_dump 告诉我们,$row 是一个数组(array),在 PHP 里,获取数组中某个元素,可以通过以下方式,比如我们要获取 content 字段:

$row['content']

所以我们可以将返回的内容做的更美观一些,修改我们的 index.php 中 foreach 部分代码:

foreach ($rows as $row) {

echo $row['content'], ' @ ', $row['created_at'], PHP_EOL;

}

小技巧:echo 若干字符串,并且用 , 隔开,等同于

echo $row['content'];

echo ' @ ';

echo $row['created_at'];

echo PHP_EOL;

最后的 PHP_EOL 是『常量』,常量可以自己创建,习惯全大写,PHP 也自带许多常量,比如 PHP_EOL 表示『回车符』。常量常用来表示一个永恒不变的值,比如圆周率,但 PHP_EOL 实际上会根据运行的环境不同而变化:*nix 下它是 \n,而 Windows 下它是 \r\n。

关于回车符多说几句,在 *nix 里回车是一个字符 \n,而 Windows 下是两个字符 \r\n,因为这个差别,经常会出现以 Windows 为开发系统的工程师,在打开以 *nix 为开发系统的工程师发过来的文件后发现折行都没了。或者反过来,*nix 工程师会发现 Windows 工程师发过来的文件每行后面总是有乱码。其实团队成员在不同的操作系统下开发没有问题,问题是大家不去统一代码规范。实际上,大部分编辑器比如 gedit,都是可以设置行结尾字符是 *nix 风格还是 Windows 风格(有的写作 MS-DOS 风格,毕竟在更早的 DOS 时代就已经是这样了),当然像 Windows 记事本这种功能实在太简单,是不提供这种功能的,所以用 Windows 的同学最好还是换一个编辑器。

最终完整的代码看这里。注意实例代码是没有 MySQL 密码的,如果你设置了密码需要自行加上。

df83231bee01dd4e52438731a8a0385e.png

写作累,服务器还越来越贵

求分担,祝愿好人一生平安

天使打赏人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

与詹金斯一起连续交付Heroku

如果您安装了Jenkins Git插件&#xff0c;那么利用Jenkins并针对Heroku的连续交付管道的设置就非常简单。 通过此管道&#xff0c;对特定Git分支的更改将导致Heroku部署。 为了使此部署过程正常运行&#xff0c;您应该至少使用两个Git分支&#xff0c;因为您希望有一个针对自动…

安卓第三次作业

<?xml version"1.0" encoding"utf-8"?> <uses-sdkandroid:minSdkVersion"8"android:targetSdkVersion"18" /> <uses-permission android:name"android.permission.RECORD_AUDIO" /> <uses-permissio…

[vue插件]基于vue2.x的电商图片放大镜插件

最近在撸一个电商网站&#xff0c;有一个需求是要像淘宝商品详情页那样&#xff0c;鼠标放在主图上&#xff0c;显示图片放大镜效果&#xff0c;找了一下貌似没有什么合适的vue插件&#xff0c;于是自己撸了一个&#xff0c;分享一下。小白第一次分享&#xff0c;各位大神莫见笑…

MySQL之视图、触发器、事务、存储过程、函数

一. 视图 视图是一个虚拟表&#xff08;非真实存在&#xff09;&#xff0c;是跑到内存中的表&#xff0c;真实表是硬盘上的表&#xff0c;怎么就得到了虚拟表&#xff0c;就是你查询的结果&#xff0c;只不过之前我们查询出来的虚拟表&#xff0c;从内存中取出来显示在屏幕上…

Java 8 Friday Goodies:SQL ResultSet流

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 &#xff0c;现在我们觉得是时候开始一个新的博客系列了…

SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

1. 什么是负载均衡&#xff1f; 负载均衡&#xff0c;就是分发请求流量到不同的服务器。 负载均衡一般分为两种 1. 服务器端负载均衡&#xff08;nginx&#xff09; 2. 客户端负载均衡&#xff08;Ribbon&#xff09; 2. 服务提供者&#xff08;spring-cloud-provider&#xff…

wait/notify实现线程间的通信

使线程之间进行通信之后&#xff0c;系统间的交互性更加强大&#xff0c;在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()while(true)也可以实现线程间通信。 例如:两个线程&#xff0c…

洛谷 P3367 【模板】并查集

嗯... 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P3367 并查集可以支持的操作&#xff1a;“并”和“查”。然后这道题主要就是考察这两种操作。将每一个点的“父亲”初始化为自己&#xff0c;然后分别进行“并”和“查”。 “并”&#xff1a;用递归函数fin…

jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

项目中使用的jquery版本是jquery-3.2.1&#xff0c;在使用layui弹出全屏iframe窗口时&#xff0c;iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-…

ADF Faces。 立即的自定义客户端事件

在本文中&#xff0c;我将重点介绍ADF Faces Javascript API方法以从客户端触发自定义事件。 例如&#xff1a; function cliListener(actionEvent) {AdfCustomEvent.queue(actionEvent.getSource(), "servListener",null, true);}我们可以使用af&#xff1a;client…

Genymotion模拟器安装ARM架构编译应用失败解决方案

我们在安装一些应用到Genymotion模拟器会提示&#xff1a;adb: failed to install xx.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res-113] 原因是Genymotion采用的编译方式是x86&#xff0c;默认不支持ARM架构编译的应用&#xff0…

CentOS7.5 yum 安装与配置MySQL5.7.24

安装环境&#xff1a;CentOS7 64位 MINI版&#xff0c;安装MySQL5.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 下面已经提供一个YUM源安装包,如果不需要特定版本可直接使用我提供的5.7.24版本 # 下载mysql源安装包…

5种改善服务器日志记录的技术

在最近的时间里&#xff0c;我们已经看到了许多工具可以帮助您理解日志。 诸如Scribe和LogStash之类的开源项目&#xff0c;诸如Splunk之类的本地工具以及诸如SumoLogic和PaperTrail之类的托管服务。 这些都可以帮助您将大量日志数据减少为更有意义的内容。 它们共有一个共同点…

java excel处理框架,Java三方—-excel框架之POI的使用一

Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。pdf框架之IText的使用&#xff0c;参见我的博客&#xff1a;Java三方—->pdf框架之IText的使用。今天我们开始POI中Excel部分的学习。POI框架的简单…

关于background-*的一些属性

1、盒模型 盒模型从外到内一次为&#xff1a;margin-box、border-box、padding-box、content-box。 2、一些属性设置的相对位置 ⑴background-position的属性值&#xff08;top/right/bottom/left/center&#xff09;起始位置是相对于padding-box外边沿开始的&#xff0c;…

Outlook邮件的右键菜单中添加自定义按钮

customUI代码如下&#xff1a; <customUI xmlns"http://schemas.microsoft.com/office/2009/07/customui"><contextMenus><contextMenu idMso"ContextMenuMailItem"> <button id"button1" label"修改件名"…

vue 项目的I18n国际化之路

I18n (internationalization ) ---未完善 产品国际化是产品后期维护及推广中重要的一环&#xff0c;通过国际化操作使得产品能更好适应不同语言和地区的需求 国际化重点&#xff1a;1、 语言语言本地化2、 文化颜色、习俗等3、 书写习惯日期格式、时区、数字格式、书写方向备…

使用IAM保护您的AWS基础架构

在开发新产品并发现合适的产品市场时&#xff0c;每个团队都需要快速行动。 尤其是初创公司&#xff0c;因为公司的整个未来都取决于快速找到为您的产品付款的人。 对于初创企业和其他团队来说&#xff0c; Amazon Web Services是令人难以置信的工具&#xff0c;可以快速构建其…

mysql文件软连接失败,解决打包软链接打包失败问题

一般情况下打包文件时&#xff0c;如果直接打包软连接会导致打包失败&#xff0c;即没有将要打包的内容打包进去&#xff0c;这里提供tar打包参数-h[rootlocalhost ~]# ll /etc/rc.locallrwxrwxrwx. 1 root root 13 Nov 24 00:45 /etc/rc.local -> rc.d/rc.local[rootlocalh…

快速掌握前端 专为Java程序员定制

Javascript 例子 修改页面内容 js 代码位置 <script>// js 代码 </script>引入 js 脚本 <script src"js脚本路径"></script>注意&#xff0c;到了框架之后&#xff0c;引入方式会有不同 1. 变量与数据类型 声明变量 1) let ⭐️ l…