第一天就该写 echo,即在htdocs下建test.php并输出hello与日期;环境不搭好、错误不显示、安全不设防,后续全是空谈。

从哪天开始写第一行 echo 才不算浪费时间
别等“学完语法再动手”,PHP 是边跑边学的语言。第一天就该在 htdocs 里建 test.php,写 echo "Hello, " . date("Y-m-d");,用浏览器打开 http://localhost/test.php 看结果。环境搭不起来,后面全是空谈。
常见错误现象:404 Not Found 或空白页,大概率是文件没放对位置(XAMPP 必须进 htdocs,WAMP 必须进 www),或 Apache 没启动;Parse error: syntax error 多半是少了个分号或引号不配对。
- 跳过所有“PHP 是什么”“历史沿革”类介绍,直接查
echo、$_POST、mysqli_connect()的用法 - 每学一个语法点,立刻套进表单提交场景:比如用
if ($_POST)判断是否提交,再用htmlspecialchars()包一层再输出 - 别碰
register_globals或magic_quotes这类已废弃配置,它们只会让你的调试路径变弯
连不上 MySQL?先确认你连的是哪个 mysqli 而不是 mysql_*
mysql_* 函数在 PHP 7.0 已彻底移除,但很多老教程还在用。你现在唯一该练的数据库接口是 mysqli(面向对象式)或 PDO。选 mysqli 入门更直觉,比如 $conn = new mysqli($host, $user, $pass, $db); 一写就报错,错在哪一眼能定位。
使用场景:本地开发阶段,用 phpMyAdmin 创建库和表后,立刻写个脚本插入一条记录并查出来——不要等“学完 SQL 再连”,INSERT 和 SELECT 就够你跑通第一个动态页面。
立即学习“PHP免费学习笔记(深入)”;
- 连接失败时检查:用户名密码是否正确(phpMyAdmin 默认
root/空)、端口是不是被占(XAMPP 默认 3306)、$conn->connect_error是否有输出具体提示 - 查询结果别直接
echo $result,它是个对象,要用while ($row = $result->fetch_assoc())遍历 - 字符集问题常导致中文变问号:建库时指定
CHARSET=utf8mb4,连接后执行$conn->set_charset("utf8mb4")
页面白了 / 报错消失了?立刻开 error_reporting 和 display_errors
PHP 默认关掉错误显示,所以代码错了只给你一个空白页,这是初学者最大障碍。必须手动打开:在 php.ini 里设 error_reporting = E_ALL 和 display_errors = On;如果没权限改配置,就在 PHP 文件开头加:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', '1');这样 Undefined variable $name、Call to undefined function mysql_connect() 这类信息才会打出来,而不是靠猜。
- 别依赖
var_dump()查数组就完事,配合die()中断流程,比如var_dump($_POST); die();可快速确认表单数据有没有传进来 - 日志比屏幕输出更可靠:用
error_log("debug: " . print_r($data, true), 3, "/path/to/php.log");把中间值记下来,尤其处理异步请求或定时任务时 - 上线前务必关掉
display_errors,但保留log_errors = On,否则线上出问题你两眼一抹黑
学完增删查改就停?别跳过 htmlspecialchars() 和 prepared statement
你写的第一个用户注册页,只要没过滤输入,就等于把 XSS 和 SQL 注入的大门敞开了。这不是“高级话题”,而是和 echo 同等级的基础动作。
常见错误现象:用户输 <script>alert(1)</script>,页面弹窗了;输 ' OR '1'='1,直接绕过登录——这些都不是“以后再学安全”,是第一次连数据库就必须同步做的。
- 所有输出到 HTML 的用户数据,必须过一遍
htmlspecialchars($str, ENT_QUOTES, 'UTF-8') - 所有带变量的 SQL 查询,必须用预处理:
$stmt = $conn->prepare("SELECT * FROM user WHERE name = ?"); $stmt->bind_param("s", $name); - 别信“我这小项目没人黑”,本地测试时故意输恶意字符串,看到它被原样转义或拦截,才算真正跑通闭环
复杂点在于:过滤和预处理要嵌进每个输入出口,不是写一次就能全局生效。漏掉一个 echo $_GET['q'],整站就可能被拖库。这事没法偷懒,只能写一行,查一行,测一行。











