web 编程,开始启动.
B-S 模式. 着重解决如下两个问题:
1. php 调试,出现错误网页不提示怎么办? 如何应付一下低级错误,类似编译级别. 如何定位.
2. javascript 调试, 出现错误网页不提示怎么办?
一种间接的办法是在其执行路径上放置打印语句,但我们还想要的更多,我们想让它报出错误定位.
网页, 谁没有上过网呢? php,也接触过一点,数据库也接触过一点,javascript也懂一点.
就是没有真正实现过一个自己的东西.
这不,机会来了,公司要实现一个自动SN记录管理, 功能要求很简单,大体如下....
SN 分三段SN1,SN2,SN3 都是16bit,
SN1 由下拉框vecdor决定高8bit.
SN1 由下拉框deviceType决定低8bit.
SN2 由年月日决定
SN3 是顺序号.每提交一次要加1.
其目的就是SN1,SN2,SN3构成产品序列号, 必需唯一不能重复,由服务器产生灌入产品并存储到服务器.
我们这里就是考虑服务器部分,做好记录. 同时也记录下项目,厂商和设备类型.
外观吗,大概就是封面图了,在这里插不进来.
好吧,把我们的lamp兄弟连拉出来干吧!
也许高手用不了一天就能完成,但我却看了2本书(姑且这么说吧),花费了一周的时间,憋出来了不到200行代码.
嗯,这是我独立网站开发的第一课了,以前小打小闹的就不算了. 麻雀虽小,五脏俱全,收获颇多!
(因为遇到和解决的问题颇多,虽然它们是很低级的,但却是很基础的.)
写完了代码,需要运行,你最怕什么? (先不说你是怎么写的代码,不管是抄的也好,憋的也好,copy也好,这是另一话题).
出来预期的结果? 别想好事了, 还差的远呢,不解决若干个问题,怎么可能运行正确.
除非你copy的别人代码,按别人的规定一步步操作,出结果了.(当然这个过程也是很重要的,能指导你出结果的,都是好书!)
你运行,什么都没有发生,你也不知道到底发生了什么?到底运行没有运行,是文字写错了?是变量写错了,还是语句写错了?
在哪?哪一行,不能让我通篇找吧,哪里出错了?
你迫切的需要一个对话, 对! 就是要一个对话,告诉我到底发生了什么?哪里出了问题?
前言:
假如用browser 来浏览, 你的文件后缀必须是php, apach 负责调用php解释器执行php 语句, 你看到的是执行php后的html文件.
如果是html后缀, apache可不管执行php语句,直接把文件下载给浏览器, 这就是我在html后缀文件中从浏览器中看到的,
嗯, 怎样echo 语句执行后, 后面的一大堆语句都呈现出来了,不是我想要的结果.
甲. 与php 的交互
假如用browser 来浏览, 界面空白,什么都没有出现.
方法1: 此时你应该看apache 的log. 毕竟你首先要找的是apache.
我们看/var/log/apache2/access.log, 和 error.log
$ cat access.log
127.0.0.1 - - [29/May/2021:10:29:27 +0800] "GET /insertSN.php HTTP/1.1" 500 185 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0)
Gecko/20100101 Firefox/88.0"
500 错误,是 internal server error, 内部服务器错误, 往往脚本语法错误, 下面看error.log
$ cat error.log
[Sat May 29 10:29:27.809821 2021] [php7:notice] [pid 1364] [client 127.0.0.1:47752] PHP Parse error: syntax error, unexpected 'do' (T_DO)
in /var/www/html/insertSN.php on line 4
很明显,在insertSN.php 第4行, 有一个语法错误,
好了,已经说的很清楚了,去修改吧!
后来我发现,能够实现把error 发给apache 来记录,对应着php.ini中的一个选项
log_errors = On
开发阶段php.ini中还有另外的一个选项可以打开.
display_errors = On
这样就不用去翻看错误log, 错误直接打到页面上了! 很方便.
方法2: 直接用php程序去执行你的php 代码.
这就是命令行调试, 毕竟假定apache 是没有问题的,错误只会出在你编写的代码上,所以先运行一下你的代码了.
$ php insertSN.php
PHP Parse error: syntax error, unexpected 'do' (T_DO) in /var/www/html/insertSN.php on line 4
看到了吧, apache 报的错误,其实就是php执行代码报的错误.
如此我们便解决了一个基础的php 调试问题.
下一步就是在代码中多加echo 语句,了解其内部执行过程. 也叫print 调试法. 网页中也可用.
再下一步可以用phpdbg 调试器, xdebug调试器,就比较高级化了. 一般print 调试法,就能解决大部分问题了.
注意: 用命令行php 预调试你的代码, 要注意鉴别warning 和 notice 消息.
例如1:
PHP Warning: session_start(): Cannot start session when headers already sent in /var/www/html/insertSN.php on line 3
PHP Stack trace:
PHP 1. {main}() /var/www/html/insertSN.php:0
PHP 2. session_start() /var/www/html/insertSN.php:3
在第3行有一个警告, 不能启动session_start(),
是的, 命令行里是启动不了session的. session 是属于apache的
例如2:
PHP Stack trace:
PHP 1. {main}() /var/www/html/insertSN.php:0
PHP Notice: Undefined index: select2 in /var/www/html/insertSN.php on line 35
在第35行有一个提醒, select2 索引没有定义,
是的,select2是_POST超级数组的索引, 在命令行里,当然不会有客户端向你post, 所以没有定义.
还有许多其它的notice.
毕竟,命令行只是一个预调试过程, 它能完整执行到尾就可以了, 真正的执行还是要通过web页面.
而web页面的调试一个是打印法,一个是xdebug.
乙: 与javascript 交互
俗称前端编程. 一堆代码已经写成,不运行怎么办?
网页已经呈现在你的面前,按要求点击一些按钮需要有所反应,可是什么都没有发生.
定位,首先要定位,然后确定发生了什么错误再修改.
至于说界面响应不对, 好像跟apache 也没有什么关系了,查看下log也确实没有关系,
找谁呢? 只能找浏览器,我的就是firefox.
当然,一种可行的办法就是在它的必经之路上采用打印语句, 但是我们还是想要的更多,最后能够定位.
firefox 的log 在哪里?
被我找到了,原来在工具->浏览器工具->web开发者,控制台下会有log输出(ctrl-shift-i). (ctrl-shift-j)浏览器控制台也有.
Uncaught ReferenceError: getElementById is not defined
updateSN0 http://localhost/insertSN.php:20
onchange http://localhost/insertSN.php:1
点击直接进到调试器界面, 看到了代码. 还是很人性化的.
不过注意,行号是获取的html页面行号, 所包含的php 代码部分都没有了,这是容易理解的,所以行号跟你的源代码不一定一致.
已经指示的很清楚了,去那里改改吧, 原来是忘掉了document 对象, 加上就可以了.
如此前端的调试也解决了,甚好!
丙: php 到底是前端还是后端?
之所以有此问,估计是你认识到了php 也能影响界面显示, 是的,它能够为控件赋值,它能够直接修改paragraph等内容,
它能够直接修改html页面. 所以php 就是一个动态的网页,说它为前端也无不可.但不准确, 大体上根据用户的post或get可以呈现不同的内容. 但那是以新的网页形式呈现给用户.
它重要的功能还是在后端,例如与数据库打交道,进行逻辑控制等. 动态网页也算后端.所以说,php,mysql是后端技术.
有了以上认识,web开发已在路上了.