第 5 章:第一个 PHP 程序创建与运行测试

章节介绍

学习目标

通过本章学习,您将能够编写并执行完整的 PHP 脚本,理解基本语法结构,掌握在浏览器中运行 PHP 程序的方法,为后续深入学习打下坚实的实践基础。

在整个教程中的作用

本章是环境搭建模块的实践检验环节,将前面章节的理论知识转化为实际编程能力,是 PHP 学习旅程的真正起点。

与前面章节的衔接

  • 基于第 2 章安装的 PHP 运行环境
  • 使用第 3 章配置的 Web 服务器
  • 利用第 4 章设置的开发工具
  • 为后续 PHP 语法学习奠定基础

本章主要内容概览

  • PHP 基本语法规则和结构
  • 变量定义与数据类型
  • 输出语句的使用方法
  • 文件保存与运行测试
  • 错误处理和调试技巧

核心概念讲解

PHP 基本语法结构

PHP 脚本以<?php开始,以?>结束,中间是 PHP 代码。每个语句以分号结尾,这是 PHP 语法的基本要求。

变量与数据类型

PHP 是弱类型语言,变量以$符号开头,不需要预先声明类型。主要数据类型包括:

  • 字符串(String)
  • 整数(Integer)
  • 浮点数(Float)
  • 布尔值(Boolean)
  • 数组(Array)
  • 对象(Object)
  • NULL

输出机制

PHP 主要通过echoprint语句输出内容到浏览器。echo可以输出多个字符串,print只能输出一个字符串并返回 1。

文件组织与运行

PHP 文件必须保存为.php扩展名,通过 Web 服务器访问才能正确执行。直接双击打开 PHP 文件不会执行 PHP 代码。

错误处理基础

PHP 错误分为通知(Notice)、警告(Warning)和致命错误(Fatal Error)。初学者常见错误包括语法错误、变量未定义、文件路径错误等。

代码示例

示例 1:基础 Hello World 程序

<?php
// 这是第一个PHP程序:Hello World
// 所有PHP代码必须包含在<?php ?>标签中
// 使用echo语句输出文本到浏览器
echo "Hello, World!";

// 输出HTML标签,使显示更美观
echo "<h1>欢迎来到PHP世界!</h1>";
echo "<p>这是您的第一个PHP程序。</p>";

?>

预期输出:

Hello, World!
欢迎来到PHP世界!
这是您的第一个PHP程序。

示例 2:变量定义与使用

<?php
// 定义字符串变量
$greeting = "你好,PHP学习者!";
$name = "张三";

// 定义数字变量
$age = 25;
$score = 95.5;

// 定义布尔变量
$isStudent = true;
$hasExperience = false;

// 输出变量值
echo "<h2>变量使用示例</h2>";
echo "问候语:" . $greeting . "<br>";  // 使用点号连接字符串
echo "姓名:" . $name . "<br>";
echo "年龄:" . $age . "岁<br>";
echo "分数:" . $score . "分<br>";
echo "是否学生:" . ($isStudent ? "是" : "否") . "<br>";
echo "是否有经验:" . ($hasExperience ? "有" : "无") . "<br>";

// 变量重新赋值
$age = $age + 1;  // 年龄增加1岁
echo "明年年龄:" . $age . "岁<br>";

?>

预期输出:

变量使用示例
问候语:你好,PHP学习者!
姓名:张三
年龄:25岁
分数:95.5分
是否学生:是
是否有经验:无
明年年龄:26岁

示例 3:基本计算与字符串操作

<?php
// 数学计算示例
$number1 = 15;
$number2 = 7;

// 基本算术运算
$sum = $number1 + $number2;        // 加法
$difference = $number1 - $number2; // 减法
$product = $number1 * $number2;    // 乘法
$quotient = $number1 / $number2;   // 除法
$remainder = $number1 % $number2;  // 取余
echo "<h2>数学计算示例</h2>";
echo "数字1:" . $number1 . "<br>";
echo "数字2:" . $number2 . "<br>";
echo "和:" . $sum . "<br>";
echo "差:" . $difference . "<br>";
echo "积:" . $product . "<br>";
echo "商:" . $quotient . "<br>";
echo "余数:" . $remainder . "<br>";

// 字符串操作示例
$firstName = "李";
$lastName = "小明";
$fullName = $lastName . $firstName;  // 字符串连接
echo "<h2>字符串操作示例</h2>";
echo "姓:" . $lastName . "<br>";
echo "名:" . $firstName . "<br>";
echo "全名:" . $fullName . "<br>";

// 使用双引号的变量解析
echo "欢迎$fullName 学习PHP!<br>";

?>

预期输出:

数学计算示例
数字1:15
数字2:7
和:22
差:8
积:105
商:2.1428571428571
余数:1

字符串操作示例
姓:李
名:小明
全名:小明李
欢迎小明李学习PHP!

示例 4:错误处理与调试

<?php
// 错误处理示例 - 展示常见错误及解决方法
echo "<h2>PHP错误处理示例</h2>";

// 1. 正确的变量使用
$correctVariable = "这是正确的变量";
echo "正确示例:" . $correctVariable . "<br>";

// 2. 注释掉错误代码 - 变量未定义
// echo "错误示例:" . $undefinedVariable . "<br>"; // 这行会报Notice错误
// 3. 语法错误示例(注释掉)
// echo "缺少分号"  // 这行会报Parse error

// 4. 使用错误抑制符
$maybeUndefined = @$undefinedVariable; // @符号抑制错误
echo "使用错误抑制符:" . ($maybeUndefined ?? "变量未定义") . "<br>";

// 5. 检查变量是否设置
if (isset($correctVariable)) {
    echo "变量已设置:" . $correctVariable . "<br>";
} else {
    echo "变量未设置<br>";
}

// 6. 简单的调试输出
echo "<h3>调试信息:</h3>";
echo "当前文件:" . __FILE__ . "<br>";
echo "当前行号:" . __LINE__ . "<br>";

?>

预期输出:

PHP错误处理示例
正确示例:这是正确的变量
使用错误抑制符:变量未定义
变量已设置:这是正确的变量
调试信息:
当前文件:/path/to/your/file.php
当前行号:25

示例 5:安全输出与 XSS 防护

<?php
// 安全输出示例 - 防止XSS攻击
echo "<h2>安全输出与XSS防护</h2>";

// 模拟用户输入(可能包含恶意脚本)
$userInput = "<script>alert('恶意攻击!');</script>欢迎访问我们的网站";

// 不安全的输出方式 - 会导致XSS攻击
echo "<h3>不安全输出:</h3>";
echo "用户输入:" . $userInput . "<br>";

// 安全的输出方式 - 使用htmlspecialchars函数
echo "<h3>安全输出:</h3>";
echo "用户输入:" . htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8') . "<br>";

// 实际应用示例
$userComments = [
    "这个网站很好!",
    "<script>document.location='http:// 恶意网站.com'</script>",
    "我喜欢学习PHP"
];

echo "<h3>用户评论展示:</h3>";
foreach ($userComments as $comment) {
    echo "评论:" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "<br>";
}

?>

预期输出:

安全输出与XSS防护
不安全输出:
用户输入:(会执行恶意脚本)
安全输出:
用户输入:&lt;script&gt;alert('恶意攻击!');&lt;/script&gt;欢迎访问我们的网站
用户评论展示:
评论:这个网站很好!
评论:&lt;script&gt;document.location='http:// 恶意网站.com'&lt;/script&gt;
评论:我喜欢学习PHP

实战项目

项目名称:个人学习档案系统

项目需求分析

创建一个简单的个人学习档案系统,记录学习者的基本信息、学习进度和成绩,具备基本的显示和计算功能。

技术方案
  • 使用 PHP 变量存储用户数据
  • 实现基本的数学计算
  • 格式化输出显示
  • 包含基础的安全防护
分步骤实现

步骤 1:创建基础文件结构

<?php
// personal_learning_profile.php
// 个人学习档案系统
echo "<!DOCTYPE html>";
echo "<html lang='zh-CN'>";
echo "<head>";
echo "    <meta charset='UTF-8'>";
echo "    <meta name='viewport' content='width=device-width, initial-scale=1.0'>";
echo "    <title>个人学习档案</title>";
echo "    <style>";
echo "        body { font-family: Arial, sans-serif; margin: 20px; }";
echo "        .container { max-width: 800px; margin: 0 auto; }";
echo "        .profile { background: #f5f5f5; padding: 20px; border-radius: 8px; }";
echo "        .progress-bar { background: #ddd; height: 20px; border-radius: 10px; }";
echo "        .progress { background: #4CAF50; height: 100%; border-radius: 10px; text-align: center; color: white; }";
echo "    </style>";
echo "</head>";
echo "<body>";
echo "<div class='container'>";

步骤 2:定义学习档案数据

// 学习者基本信息
$studentName = "王学习";
$studentAge = 22;
$studentEmail = "wangxuexi@example.com";
$joinDate = "2024-01-15";

// 课程学习数据
$courses = [
    ["name" => "PHP基础", "progress" => 85, "score" => 92],
    ["name" => "HTML/CSS", "progress" => 90, "score" => 88],
    ["name" => "JavaScript", "progress" => 70, "score" => 85],
    ["name" => "数据库基础", "progress" => 60, "score" => 78]
];

// 计算统计数据
$totalCourses = count($courses);
$totalProgress = 0;
$totalScore = 0;

foreach ($courses as $course) {
    $totalProgress += $course['progress'];
    $totalScore += $course['score'];
}

$averageProgress = round($totalProgress / $totalCourses, 1);
$averageScore = round($totalScore / $totalCourses, 1);

步骤 3:显示个人档案信息

// 显示个人信息
echo "<h1>个人学习档案</h1>";
echo "<div class='profile'>";
echo "<h2>基本信息</h2>";
echo "<p><strong>姓名:</strong>" . htmlspecialchars($studentName) . "</p>";
echo "<p><strong>年龄:</strong>" . $studentAge . "岁</p>";
echo "<p><strong>邮箱:</strong>" . htmlspecialchars($studentEmail) . "</p>";
echo "<p><strong>加入日期:</strong>" . $joinDate . "</p>";

// 显示学习统计
echo "<h2>学习统计</h2>";
echo "<p><strong>总课程数:</strong>" . $totalCourses . "</p>";
echo "<p><strong>平均进度:</strong>" . $averageProgress . "%</p>";
echo "<p><strong>平均分数:</strong>" . $averageScore . "分</p>";

// 总体进度条
echo "<p><strong>总体学习进度:</strong></p>";
echo "<div class='progress-bar'>";
echo "    <div class='progress' style='width: " . $averageProgress . "%'>" . $averageProgress . "%</div>";
echo "</div>";

步骤 4:显示详细课程信息

// 显示课程详情
echo "<h2>课程详情</h2>";
foreach ($courses as $course) {
    $courseName = htmlspecialchars($course['name']);

    echo "<div style='margin-bottom: 15px;'>";
    echo "    <p><strong>课程:</strong>" . $courseName . "</p>";
    echo "    <p><strong>分数:</strong>" . $course['score'] . "分</p>";
    echo "    <p><strong>进度:</strong></p>";
    echo "    <div class='progress-bar'>";
    echo "        <div class='progress' style='width: " . $course['progress'] . "%'>" . $course['progress'] . "%</div>";
    echo "    </div>";
    echo "</div>";
}

步骤 5:添加学习建议和结尾

// 学习建议
echo "<h2>学习建议</h2>";
if ($averageScore >= 90) {
    echo "<p style='color: green;'>优秀!继续保持良好的学习状态。</p>";
} elseif ($averageScore >= 80) {
    echo "<p style='color: blue;'>良好!在薄弱环节多下功夫。</p>";
} elseif ($averageScore >= 70) {
    echo "<p style='color: orange;'>中等!需要加强学习和练习。</p>";
} else {
    echo "<p style='color: red;'>需要努力!建议重新学习基础内容。</p>";
}

// 计算学习时长(示例)
$joinTimestamp = strtotime($joinDate);
$currentTimestamp = time();
$daysLearning = round(($currentTimestamp - $joinTimestamp) / (60 * 60 * 24));

echo "<p><strong>已学习天数:</strong>" . $daysLearning . "天</p>";

echo "</div>"; // 结束.profile
echo "</div>"; // 结束.container
echo "</body>";
echo "</html>";
?>
项目测试和部署指南
  1. 本地测试
  • 将文件保存为personal_learning_profile.php
    • 放置在 Web 服务器的根目录(如 XAMPP 的 htdocs 文件夹)
  • 通过浏览器访问http:// localhost/personal_learning_profile.php
  1. 功能验证
  • 检查个人信息是否正确显示
  • 验证进度条和统计计算是否准确
  • 测试不同数据下的显示效果
  1. 安全测试
  • 尝试在姓名和邮箱中输入特殊字符,验证是否被正确转义
  • 检查是否可能存在 XSS 漏洞
项目扩展和优化建议
  1. 数据动态化
  • 添加表单让用户输入自己的信息
  • 实现数据的保存和读取功能
  1. 功能增强
  • 添加学习目标设置功能
  • 实现学习提醒和进度追踪
  • 添加图表展示学习数据
  1. 界面优化
  • 使用 CSS 框架美化界面
  • 实现响应式设计,适配移动设备

最佳实践

行业标准和开发规范

代码组织规范
<?php
// 良好的代码组织结构示例
/**
 * 个人学习档案类
* 用于管理学习者的信息和进度
*/
class LearningProfile {

    // 常量定义使用大写
const MAX_SCORE = 100;
    const MIN_SCORE = 0;

    // 属性使用有意义的命名
private $studentName;
    private $courses = [];

    /**
     * 构造函数
* @param string $name 学生姓名
*/
    public function __construct($name) {
        $this->studentName = htmlspecialchars($name);
    }

    /**
     * 添加课程
* @param string $courseName 课程名称
* @param int $progress 学习进度
* @param int $score 课程分数
*/
    public function addCourse($courseName, $progress, $score) {
        // 数据验证
if ($progress < 0 || $progress > 100) {
            throw new InvalidArgumentException("进度必须在0-100之间");
        }

        // 安全处理
$safeCourseName = htmlspecialchars($courseName);

        $this->courses[] = [
            'name' => $safeCourseName,
            'progress' => $progress,
            'score' => $score
        ];
    }

    /**
     * 计算平均进度
* @return float
     */
    public function getAverageProgress() {
        if (empty($this->courses)) {
            return 0;
        }

        $total = 0;
        foreach ($this->courses as $course) {
            $total += $course['progress'];
        }

        return round($total / count($this->courses), 1);
    }
}

// 使用示例
try {
    $profile = new LearningProfile("李同学");
    $profile->addCourse("PHP编程", 85, 92);
    $profile->addCourse("Web开发", 90, 88);

    echo "平均进度:" . $profile->getAverageProgress() . "%";
} catch (Exception $e) {
    echo "错误:" . $e->getMessage();
}
?>

常见错误和避坑指南

1. 语法错误
<?php
// 错误示例
// echo "Hello World"  // 缺少分号
// $variable = "value  // 缺少引号
// if ($condition {    // 缺少括号
// 正确示例
echo "Hello World";
$variable = "value";
if ($condition) {
    // 代码块
}
?>
2. 变量作用域问题
<?php
// 错误示例
function calculateTotal($prices) {
    $total = 0;  // 局部变量
foreach ($prices as $price) {
        $total += $price;
    }
}
// echo $total;  // 这里无法访问$total

// 正确示例
function calculateTotalCorrect($prices) {
    $total = 0;
    foreach ($prices as $price) {
        $total += $price;
    }
    return $total;  // 返回结果
}

$result = calculateTotalCorrect([10, 20, 30]);
echo "总计:" . $result;
?>

安全性考虑和建议

SQL 注入攻击案例和防护
<?php
// 不安全的SQL查询 - 存在SQL注入漏洞
$unsafeUserId = $_GET['user_id'];  // 用户直接输入
// 危险!攻击者可以输入: 1 OR 1=1
$unsafeQuery = "SELECT * FROM users WHERE id = " . $unsafeUserId;

// 安全的SQL查询 - 使用预处理语句
$safeUserId = $_GET['user_id'];

// 使用PDO预处理语句
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :user_id");
$stmt->bindParam(':user_id', $safeUserId, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll();

// 或者使用mysqli预处理
$mysqli = new mysqli("localhost", "username", "password", "test");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $safeUserId);  // "i"表示整数类型
$stmt->execute();
$result = $stmt->get_result();
?>
XSS 跨站脚本攻击和防护
<?php
// 不安全的输出 - 存在XSS漏洞
$userComment = $_POST['comment'];  // 用户可能输入恶意脚本
echo "<div>" . $userComment . "</div>";  // 危险!
// 安全的输出 - 使用htmlspecialchars
$safeComment = htmlspecialchars($userComment, ENT_QUOTES, 'UTF-8');
echo "<div>" . $safeComment . "</div>";  // 安全
// 更严格的内容安全策略
function safeOutput($input, $allowedTags = '') {
    // 移除所有HTML标签,只保留允许的标签
$cleaned = strip_tags($input, $allowedTags);

    // 进一步转义特殊字符
$cleaned = htmlspecialchars($cleaned, ENT_QUOTES, 'UTF-8');

    return $cleaned;
}

// 使用示例
$userInput = "<script>alert('xss')</script><p>正常内容</p>";
echo safeOutput($userInput, '<p><br>');  // 只允许<p>和<br>标签
?>
文件上传安全
<?php
// 不安全的文件上传
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $tempName = $_FILES['file']['tmp_name'];
    $fileName = $_FILES['file']['name'];

    // 危险!直接使用用户提供的文件名
move_uploaded_file($tempName, "uploads/" . $fileName);
}

// 安全的文件上传处理
function handleFileUpload($file) {
    // 检查上传错误
if ($file['error'] !== UPLOAD_ERR_OK) {
        throw new Exception("文件上传失败");
    }

    // 检查文件类型
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
    $fileType = mime_content_type($file['tmp_name']);

    if (!in_array($fileType, $allowedTypes)) {
        throw new Exception("不允许的文件类型");
    }

    // 检查文件大小(限制为2MB)
$maxSize = 2 * 1024 * 1024;
    if ($file['size'] > $maxSize) {
        throw new Exception("文件太大");
    }

    // 生成安全的文件名
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
    $safeFileName = uniqid() . '.' . $extension;
    $uploadPath = "uploads/" . $safeFileName;

    // 移动文件
if (!move_uploaded_file($file['tmp_name'], $uploadPath)) {
        throw new Exception("文件保存失败");
    }

    return $safeFileName;
}

// 使用示例
try {
    $savedFile = handleFileUpload($_FILES['document']);
    echo "文件上传成功:" . $savedFile;
} catch (Exception $e) {
    echo "上传错误:" . $e->getMessage();
}
?>

练习题与挑战

基础练习题

练习 1:变量与输出(难度:★)

题目描述:
创建一个 PHP 程序,定义以下变量并格式化输出:

  • 姓名(字符串)
  • 年龄(整数)
  • 身高(浮点数,单位:米)
  • 是否在校(布尔值)
    要求输出格式美观,包含适当的 HTML 标签。
    解题提示:
  • 使用合适的变量命名
  • 注意数据类型的选择
  • 使用 echo 输出 HTML 结构
  • 布尔值需要转换为"是/否"显示
    参考答案:
<?php
$name = "陈小明";
$age = 20;
$height = 1.75;
$isInSchool = true;

echo "<div style='border: 1px solid #ccc; padding: 20px; margin: 10px;'>";
echo "<h2>个人信息</h2>";
echo "<p><strong>姓名:</strong>" . htmlspecialchars($name) . "</p>";
echo "<p><strong>年龄:</strong>" . $age . "岁</p>";
echo "<p><strong>身高:</strong>" . $height . "米</p>";
echo "<p><strong>是否在校:</strong>" . ($isInSchool ? "是" : "否") . "</p>";
echo "</div>";
?>
练习 2:简单计算器(难度:★☆)

题目描述:
创建一个简单的数学计算器,计算两个数字的加、减、乘、除和取余运算,并格式化显示所有结果。
解题提示:

  • 定义两个数字变量
  • 分别计算五种运算结果
  • 注意除法时的零除检查
  • 结果表格化显示
    参考答案:
<?php
$num1 = 15;
$num2 = 4;

// 计算各种运算
$addition = $num1 + $num2;
$subtraction = $num1 - $num2;
$multiplication = $num1 * $num2;
$division = $num2 != 0 ? $num1 / $num2 : "无法计算(除数为零)";
$modulus = $num2 != 0 ? $num1 % $num2 : "无法计算(除数为零)";

echo "<table border='1' style='border-collapse: collapse; width: 300px;'>";
echo "<tr><th>运算类型</th><th>结果</th></tr>";
echo "<tr><td>加法</td><td>" . $addition . "</td></tr>";
echo "<tr><td>减法</td><td>" . $subtraction . "</td></tr>";
echo "<tr><td>乘法</td><td>" . $multiplication . "</td></tr>";
echo "<tr><td>除法</td><td>" . $division . "</td></tr>";
echo "<tr><td>取余</td><td>" . $modulus . "</td></tr>";
echo "</table>";
?>

进阶练习题

练习 3:成绩等级判断(难度:★★)

题目描述:
创建一个程序,根据输入的成绩(0-100 分)判断等级:

  • 90-100: 优秀
  • 80-89: 良好
  • 70-79: 中等
  • 60-69: 及格
  • 0-59: 不及格
    要求显示成绩和对应的等级,并给出不同的颜色标识。
    解题提示:
  • 使用 if-elseif-else 结构
  • 为不同等级设置不同的 CSS 颜色
  • 考虑输入验证
    参考答案:
<?php
$score = 85; // 可以修改这个值测试不同情况
// 验证成绩范围
if ($score < 0 || $score > 100) {
    $grade = "无效成绩";
    $color = "gray";
} elseif ($score >= 90) {
    $grade = "优秀";
    $color = "green";
} elseif ($score >= 80) {
    $grade = "良好";
    $color = "blue";
} elseif ($score >= 70) {
    $grade = "中等";
    $color = "orange";
} elseif ($score >= 60) {
    $grade = "及格";
    $color = "#FFD700"; // 金色
} else {
    $grade = "不及格";
    $color = "red";
}

echo "<div style='padding: 15px; background-color: #f9f9f9; border-left: 5px solid $color;'>";
echo "<h3>成绩分析</h3>";
echo "<p><strong>成绩:</strong>" . $score . "分</p>";
echo "<p style='color: $color;'><strong>等级:</strong>" . $grade . "</p>";
echo "</div>";
?>
练习 4:字符串处理函数(难度:★★☆)

题目描述:
编写一个程序,对给定的字符串进行多种处理:

  1. 统计字符串长度
  2. 转换为大写
  3. 转换为小写
  4. 单词首字母大写
  5. 反转字符串
  6. 查找特定字符的位置
    解题提示:
  • 研究 PHP 字符串函数:strlen, strtoupper, strtolower, ucwords, strrev, strpos
  • 注意中文字符串的特殊处理
    参考答案:
<?php
$originalString = "hello world, welcome to php programming!";

echo "<h3>字符串处理示例</h3>";
echo "<p><strong>原始字符串:</strong>" . $originalString . "</p>";

// 各种字符串操作
$length = strlen($originalString);
$upperCase = strtoupper($originalString);
$lowerCase = strtolower($originalString); // 虽然本来就是小写,演示用法
$capitalized = ucwords($originalString);
$reversed = strrev($originalString);
$position = strpos($originalString, "php");

echo "<ul>";
echo "<li><strong>字符串长度:</strong>" . $length . "个字符</li>";
echo "<li><strong>大写形式:</strong>" . $upperCase . "</li>";
echo "<li><strong>小写形式:</strong>" . $lowerCase . "</li>";
echo "<li><strong>单词首字母大写:</strong>" . $capitalized . "</li>";
echo "<li><strong>反转字符串:</strong>" . $reversed . "</li>";
echo "<li><strong>'php'位置:</strong>" . ($position !== false ? "第" . ($position + 1) . "个字符" : "未找到") . "</li>";
echo "</ul>";
?>

综合挑战题

挑战 1:简易购物车系统(难度:★★★)

题目描述:
创建一个简易的购物车系统,包含以下功能:

  1. 定义多个商品(名称、价格、数量)
  2. 计算总价
  3. 显示购物车内容(表格形式)
  4. 计算折扣(满 100 减 10)
  5. 显示最终价格
    解题提示:
  • 使用数组存储商品信息
  • 循环计算总价
  • 格式化货币显示
  • 实现折扣逻辑
    参考答案:
<?php
// 定义商品数组
$products = [
    ["name" => "PHP编程书籍", "price" => 45.50, "quantity" => 2],
    ["name" => "Web开发教程", "price" => 32.00, "quantity" => 1],
    ["name" => "编程鼠标", "price" => 89.90, "quantity" => 1],
    ["name" => "机械键盘", "price" => 299.00, "quantity" => 1]
];

// 计算购物车
$subtotal = 0;
foreach ($products as $product) {
    $subtotal += $product['price'] * $product['quantity'];
}

// 计算折扣
$discount = 0;
if ($subtotal >= 100) {
    $discount = 10;
}

$total = $subtotal - $discount;

// 显示购物车
echo "<h2>购物车清单</h2>";
echo "<table border='1' style='border-collapse: collapse; width: 100%;'>";
echo "<tr><th>商品名称</th><th>单价</th><th>数量</th><th>小计</th></tr>";

foreach ($products as $product) {
    $itemTotal = $product['price'] * $product['quantity'];
    echo "<tr>";
    echo "<td>" . htmlspecialchars($product['name']) . "</td>";
    echo "<td>¥" . number_format($product['price'], 2) . "</td>";
    echo "<td>" . $product['quantity'] . "</td>";
    echo "<td>¥" . number_format($itemTotal, 2) . "</td>";
    echo "</tr>";
}

echo "</table>";

// 显示总计
echo "<div style='margin-top: 20px; padding: 15px; background-color: #f0f8ff;'>";
echo "<h3>订单摘要</h3>";
echo "<p><strong>小计:</strong>¥" . number_format($subtotal, 2) . "</p>";
echo "<p><strong>折扣:</strong>-¥" . number_format($discount, 2) . "</p>";
echo "<p style='font-size: 1.2em; color: #e44d26;'><strong>总计:</strong>¥" . number_format($total, 2) . "</p>";
echo "</div>";
?>
挑战 2:安全表单数据处理(难度:★★★☆)

题目描述:
创建一个安全的用户注册表单处理程序,包含:

  1. 接收用户输入(姓名、邮箱、密码)
  2. 数据验证和清理
  3. 防止 XSS 攻击
  4. 密码加密
  5. 显示处理后的安全数据
    解题提示:
  • 使用 htmlspecialchars 防止 XSS
  • 使用 filter_var 验证邮箱
  • 使用 password_hash 加密密码
  • 实现完整的错误处理
    参考答案:
<?php
// 模拟表单提交的数据(实际应用中来自$_POST)
$userData = [
    'name' => "John <script>alert('xss')</script>",
    'email' => "john@example.com",
    'password' => "mypassword123"
];

echo "<h2>用户注册数据安全处理</h2>";

// 显示原始数据(危险!仅用于演示)
echo "<h3>原始提交数据:</h3>";
echo "<pre>" . htmlspecialchars(print_r($userData, true)) . "</pre>";

// 安全处理数据
$processedData = [];

// 1. 清理姓名(移除标签,限制长度)
$processedData['name'] = htmlspecialchars(
    substr(trim($userData['name']), 0, 50),
    ENT_QUOTES,
    'UTF-8'
);

// 2. 验证邮箱
$email = filter_var(trim($userData['email']), FILTER_VALIDATE_EMAIL);
if ($email === false) {
    $processedData['email'] = "无效的邮箱地址";
    $emailValid = false;
} else {
    $processedData['email'] = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
    $emailValid = true;
}

// 3. 加密密码
if (strlen($userData['password']) < 6) {
    $processedData['password_hash'] = "密码太短(至少6位)";
} else {
    $processedData['password_hash'] = password_hash($userData['password'], PASSWORD_DEFAULT);
}

// 显示处理后的安全数据
echo "<h3>安全处理后的数据:</h3>";
echo "<div style='background-color: #e8f5e8; padding: 15px; border-radius: 5px;'>";
foreach ($processedData as $key => $value) {
    echo "<p><strong>" . ucfirst($key) . ":</strong>" . $value . "</p>";
}
echo "</div>";

// 验证演示
if ($emailValid && isset($processedData['password_hash']) &&
    !strpos($processedData['password_hash'], "密码太短")) {

    echo "<div style='background-color: #d4edda; color: #155724; padding: 10px; margin-top: 10px;'>";
    echo "✓ 数据验证通过,可以安全存储到数据库";
    echo "</div>";
} else {
    echo "<div style='background-color: #f8d7da; color: #721c24; padding: 10px; margin-top: 10px;'>";
    echo "✗ 数据验证失败,请检查输入";
    echo "</div>";
}
?>

章节总结

本章重点知识回顾

  1. PHP 基础语法:掌握了 PHP 脚本的基本结构和语法规则
  2. 变量与数据类型:理解了 PHP 的变量定义和各种数据类型的使用
  3. 输出语句:熟练使用 echo 和 print 进行内容输出
  4. 文件操作:学会了创建、保存和运行 PHP 文件的方法
  5. 错误处理:了解了常见的 PHP 错误类型和基本的调试技巧
  6. 安全基础:学习了 XSS 防护等基本安全概念

技能掌握要求

完成本章学习后,您应该能够:

  • 独立创建和运行 PHP 程序
  • 使用变量和基本数据类型
  • 进行简单的数学计算和字符串操作
  • 在浏览器中正确显示 PHP 输出
  • 识别和修复基本的语法错误
  • 理解并应用基本的安全输出原则

与下一章的衔接预告

在下一章中,我们将深入 PHP 的核心语法:

  • 条件语句(if-else)和循环结构
  • 函数的定义和使用
  • 数组的详细操作
  • 更复杂的数据处理
  • 面向对象编程基础

进一步学习建议

  1. 实践练习:多编写小程序来巩固基础知识
  2. 代码阅读:查看其他开发者的 PHP 代码,学习不同的编码风格
  3. 错误调试:故意制造错误,学习如何识别和解决问题
  4. 安全学习:继续深入了解 Web 安全知识,这是 PHP 开发者的重要技能
  5. 项目实践:尝试将学到的知识应用到小型个人项目中
    通过本章的学习,您已经迈出了成为 PHP 开发者的第一步。记住,编程是一门实践性很强的技能,多写代码、多思考、多解决问题是提高的最佳途径。在接下来的学习中,您将接触到更强大的 PHP 功能,为构建真实的 Web 应用打下坚实基础。

常见问题解答

本部分针对学习过程中常见问题提供解答,涵盖技术问题、学习方法、职业发展和资源获取,帮助学习者高效解决问题并提升学习效率。

学习过程中常见的技术问题

  • 问题 1:PHP 安装后无法运行,显示错误“PHP not found”
    解答:通常由于环境变量未设置或路径错误。解决方案:检查系统 PATH 变量是否包含 PHP 安装目录;如果使用集成环境,重启服务;在命令行输入php -v测试安装。
  • 问题 2:Web 服务器(如 Apache)启动失败,端口被占用
    解答:常见于 80 或 443 端口被其他程序占用。解决方案:使用命令(如netstat -ano在 Windows)查找占用进程并终止;或更改服务器配置文件中的端口号。
  • 问题 3:数据库连接错误,如“Access denied for user”
    解答:可能由于用户名、密码错误或权限不足。解决方案:验证数据库凭据;在 MySQL 中创建新用户并授权;检查服务是否运行。
  • 问题 4:PHP 代码在浏览器中显示为文本,未解析
    解答:通常因为文件未保存为.php 扩展名,或服务器未配置处理 PHP。解决方案:确保文件扩展名正确;检查服务器配置(如 Apache 的 httpd.conf)是否加载 PHP 模块。
  • 问题 5:编辑器插件不工作,如代码提示失效
    解答:可能由于插件未安装或配置错误。解决方案:重新安装插件(如 VS Code 的 PHP IntelliSense);检查编辑器设置是否指向正确 PHP 路径。

学习方法和效率提升建议

  • 方法 1:如何保持学习动力?
    解答:设定小目标,例如每天完成一个环境搭建步骤;加入学习小组或论坛,分享进度;使用 Pomodoro 技术(25 分钟学习,5 分钟休息)避免疲劳。
  • 方法 2:如何高效记忆概念?
    解答:结合实践编码,而非单纯阅读;制作笔记或思维导图总结关键点;定期复习,例如每周回顾环境配置步骤。
  • 方法 3:如何处理学习中的挫折?
    解答:接受错误为学习过程,使用调试工具(如浏览器开发者工具)分析问题;求助社区(如 Stack Overflow),但先尝试自行解决。
  • 效率提升建议:优先动手实践,理论占 30%,实践占 70%;使用在线模拟器练习环境搭建;定期自我测试,确保知识牢固。

职业发展相关咨询

  • 问题:学完本模块后,能申请什么职位?
    解答:可申请初级 Web 开发实习生、PHP 开发助理或技术支持角色,强调环境搭建和基础编码技能。建议在简历中突出实践项目。
  • 问题:如何规划 PHP 开发职业路径?
    解答:从入门职位起步,积累 1-2 年经验后,转向全栈或后端开发;学习相关技术(如 JavaScript 或云服务)拓宽机会;考虑认证提升可信度。
  • 咨询建议:关注行业招聘要求,定制学习计划;参加本地技术聚会扩展人脉;保持持续学习,适应技术变化。

资源获取和社区参与

  • 资源获取:免费资源如 PHP 官方文档、MDN Web Docs;付费资源如 Udemy 课程或书籍。建议多渠道结合,优先使用权威来源。
  • 社区参与:加入 PHP 社区如 PHP.net 论坛、Reddit 的 r/PHP 或本地 Meetup 组;参与讨论,提问时提供详细错误信息;贡献开源项目,建立声誉。
  • 总体建议:主动搜索和分享知识,社区参与能加速学习并获取最新资讯。

推荐资源

以下资源基于实用性和权威性筛选,帮助学习者进一步巩固本模块知识并扩展学习。所有资源均适合零基础入门,并提供可操作的学习路径。

优质学习网站和文档

  • PHP 官方文档(php.net):最权威的 PHP 参考,包含函数库和教程,支持多语言,适合随时查阅。
  • W3Schools PHP 教程:互动式学习平台,提供简单示例和练习,适合快速入门环境搭建和语法。
  • MDN Web Docs:Mozilla 维护的 Web 开发文档,涵盖 PHP 与前端技术集成,帮助理解全栈概念。
  • PHP The Right Way:最佳实践指南,强调现代 PHP 开发标准,包括环境配置和安全建议。

经典书籍和教程推荐

  • 《PHP 和 MySQL Web 开发》(Luke Welling & Laura Thomson 著):经典入门书籍,系统讲解从环境搭建到项目开发,适合循序渐进学习。
  • 《深入 PHP:面向对象、模式与实践》(Matt Zandstra 著):进阶读物,聚焦 OOP 和框架,为后续学习铺垫。
  • 在线教程:Codecademy PHP 课程:交互式学习,覆盖基础语法和环境练习,适合动手型学习者。
  • 免费 PDF 资源:如“PHP 入门指南”可从 GitHub 或开源平台下载,提供实用案例。

在线课程和视频资源

  • Udemy 课程(如“PHP for Beginners”):付费课程,常有折扣,视频讲解详细,包含环境搭建实战。
  • Coursera 专项课程(如“Web 开发”由约翰霍普金斯大学提供):系统化学习路径,涵盖 PHP 和数据库,适合追求学术深度。
  • Laracasts:专注于 PHP 和 Laravel,提供高质量视频,适合后续框架学习。

技术社区和论坛

  • Stack Overflow:问题解答平台,搜索常见环境问题或提问,社区活跃。
  • GitHub:代码托管和开源项目,参与 PHP 项目学习实践。
    这些资源组合使用,能帮助学习者从本模块延伸至更广阔的学习领域,建议根据个人进度选择优先资源。

本总结和进阶指导基于教程模块一内容,旨在提供专业、实用的学习支持。如果有更多问题或需要进一步定制,欢迎继续咨询。祝您学习顺利!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐