整理 PHP 開發高頻 31 個疑難雜症,涵蓋變量傳遞、Session、編碼、上傳、分頁、安全、性能等核心場景,附最佳實踐代碼。
| # | 問題 | 核心解決方案 |
|---|---|---|
| 1 | 跨頁面獲取不到變量 | PHP 4.2+ register_globals=Off,用 $_GET/$_POST 或 extract() |
| 2 | 程序調試變量值 | 封裝 debug.php 輸出 $_GET/POST/COOKIE/SESSION,配置 include_path |
| 3 | Session 使用方法 | session_start() 必須在輸出前,$_SESSION 直接賦值,銷毀用 session_destroy() |
| 4 | URL 傳遞中文/空格丟失 | urlencode() 編碼傳遞,接收端自動 urldecode() |
| 5 | 中文截取避免亂碼 | 按字節截取判斷 ord()>0xa0 雙字節,超出加省略號 |
| 6 | SQL 規範寫法 | 表名字段用反引號,關鍵字大寫,多行縮進 |
| 7 | HTML/字符串原樣輸出 | htmlentities(nl2br($str)) 轉義實體並換行 |
| 8 | 函數內訪問外部變量 | global $var 或 $GLOBALS['var'] |
| 9 | 查看系統支持函數 | get_defined_functions() 返回內部/用戶函數列表 |
| 10 | 兩日期相差天數 | mktime 轉時間戳相減除 86400,round 取整 |
| 11 | 升級 PHP 出現 Notice 滿屏 | error_reporting = E_ALL & ~E_NOTICE |
| 12 | 全站自動包含頭尾文件 | php.ini auto_prepend_file / auto_append_file |
| 13 | 文件上傳實現 | enctype=multipart/form-data + move_uploaded_file + 類型大小驗證 |
| 14 | GD 庫配置 | dll 複製到 system32,php.ini extension=php_gd2.dll |
| 15 | UBB 代碼是什麼 | HTML 變種標籤,論壇安全替代方案 |
| 16 | MySQL 修改密碼 | phpMyAdmin / mysqladmin / SET PASSWORD / GRANT IDENTIFIED BY |
| 17 | 獲取來源頁面 URL | $_SERVER['HTTP_REFERER'](需超鏈接進入) |
| 18 | 數據入庫/出庫/顯示處理 | addslashes→入庫,stripslashes→出庫,htmlspecialchars(nl2br)→顯示 |
| 19 | 獲取當前完整 URL | HTTP_HOST + SERVER_PORT + SCRIPT_NAME + $_GET 拼接 |
| 20 | 後退按鈕表單數據丟失 | session_cache_limiter('private, must-revalidate') |
| 21 | 圖片顯示 IP 地址 | GD 繪圖 + imagettftext + $_SERVER['REMOTE_ADDR'] |
| 22 | 獲取真實 IP(穿透代理) | 優先 HTTP_CLIENT_IP → HTTP_X_FORWARDED_FOR → REMOTE_ADDR |
| 23 | 查詢近 3 天記錄 | TO_DAYS(NOW()) - TO_DAYS(`date`) <= 3 |
| 24 | 遠程連接 MySQL | mysql.user 表 Host 改 % 或具體 IP,防火牆開 3306 |
| 25 | 正則表達式用法 | PCRE 函數 preg_match/replace,掌握元字符、量詞、分組 |
| 26 | Apache 亂碼 | httpd.conf AddDefaultCharset Off 或 GB2312/UTF-8 |
| 27 | 引號自動轉義 | magic_quotes_gpc=Off 或 stripcslashes() |
| 28 | 腳本超時 30 秒限制 | set_time_limit(0) 無限制,或具體秒數 |
| 29 | 在線人數統計 | 文本文件/數據庫存 IP+時間戳,定期清理超時記錄 |
| 30 | 模板引擎原理與靜態化 | PHPLib/Smarty:Set_File/Set_Block/Parse,輸出獲取寫文件 |
| 31 | PHP 解釋執行字符串 | eval("$o=$str;") 極度危險,嚴禁用戶輸入直接 eval |
<?php
// 方案一:修改 php.ini(不推薦,全局影響)
register_globals = On
// 方案二:extract() 批量導入(污染變量空間,慎用)
extract($_POST); extract($_GET); // 需 session_start() 後 extract($_SESSION)
// 方案三:顯式賦值(最安全、可追蹤、IDE 友好)
$id = $_GET['id'] ?? 0;
$name = $_POST['name'] ?? '';
$page = $_GET['page'] ?? 1;
?>
<?php
// 1. 啟動(必須在任何輸出前)
session_start();
// 2. 賦值(PHP 4.2+ 推薦)
$_SESSION['user'] = ['id' => 1, 'name' => 'admin'];
// 3. 讀取
$user = $_SESSION['user'] ?? null;
// 4. 刪除單個
unset($_SESSION['user']);
// 5. 完全銷毀
session_unset(); session_destroy();
// 關鍵:headers already sent 解決
// 頂部加 ob_start() 或確保 session_start() 前無任何輸出(含 BOM、空白行)
?>
<?php
// 13. 文件上傳核心
$allowed = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($_FILES['file']['type'], $allowed)) exit('類型禁止');
$ext = ['image/jpeg'=>'.jpg', 'image/png'=>'.png', 'image/gif'=>'.gif'][$_FILES['file']['type']];
$path = 'uploads/' . date('Ymd') . '/';
!is_dir($path) && mkdir($path, 0755, true);
$filename = $path . uniqid() . $ext;
move_uploaded_file($_FILES['file']['tmp_name'], $filename);
// 18. 數據全鏈路處理
function input_safe($str) { return addslashes($str); }
function output_safe($str) { return htmlspecialchars(nl2br(stripslashes($str))); }
// 入庫:$sql = "INSERT INTO t(c) VALUES('".input_safe($content)."')";
// 顯示:echo output_safe($row['c']);
// 22. 真實 IP 獲取
function real_ip() {
foreach (['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'] as $k) {
if (!empty($_SERVER[$k]) && $_SERVER[$k] !== 'unknown')
return explode(',', $_SERVER[$k])[0];
}
return 'unknown';
}
// 29. 文件版在線統計
$file = 'online.dat'; $timeout = 180;
$ips = file_exists($file) ? file($file, FILE_IGNORE_NEW_LINES) : [];
$now = time(); $new = [];
foreach ($ips as $line) {
[$ip, $time] = explode('|', $line);
if ($ip !== $_SERVER['REMOTE_ADDR'] && $time > $now) $new[] = $line;
}
$new[] = $_SERVER['REMOTE_ADDR'] . '|' . ($now + $timeout);
file_put_contents($file, implode("\n", $new));
echo "在線:" . count($new);
// 30. PHPLib 模板靜態化
$tpl = new Template('templates/');
$tpl->set_file('page', 'index.tpl');
$tpl->set_var('TITLE', '首頁');
$tpl->parse('output', 'page');
$html = $tpl->get('output');
file_put_contents('static/index.html', $html);
header('Location: static/index.html');
?>
eval("$o=$str;") 若用戶輸入 phpinfo(); 將洩露服務器信息,system('rm -rf /'); 將毀滅服務器。嚴禁 對用戶輸入使用 evalstripcslashes() 兼容處理