首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 開發 31 大常見問題終極 FAQ:從變量獲取到模板引擎

     編輯:PHP 綜合知識

整理 PHP 開發高頻 31 個疑難雜症,涵蓋變量傳遞、Session、編碼、上傳、分頁、安全、性能等核心場景,附最佳實踐代碼。

核心問題速覽表

#問題核心解決方案
1跨頁面獲取不到變量PHP 4.2+ register_globals=Off,用 $_GET/$_POST 或 extract()
2程序調試變量值封裝 debug.php 輸出 $_GET/POST/COOKIE/SESSION,配置 include_path
3Session 使用方法session_start() 必須在輸出前,$_SESSION 直接賦值,銷毀用 session_destroy()
4URL 傳遞中文/空格丟失urlencode() 編碼傳遞,接收端自動 urldecode()
5中文截取避免亂碼按字節截取判斷 ord()>0xa0 雙字節,超出加省略號
6SQL 規範寫法表名字段用反引號,關鍵字大寫,多行縮進
7HTML/字符串原樣輸出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 + 類型大小驗證
14GD 庫配置dll 複製到 system32,php.ini extension=php_gd2.dll
15UBB 代碼是什麼HTML 變種標籤,論壇安全替代方案
16MySQL 修改密碼phpMyAdmin / mysqladmin / SET PASSWORD / GRANT IDENTIFIED BY
17獲取來源頁面 URL$_SERVER['HTTP_REFERER'](需超鏈接進入)
18數據入庫/出庫/顯示處理addslashes→入庫,stripslashes→出庫,htmlspecialchars(nl2br)→顯示
19獲取當前完整 URLHTTP_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遠程連接 MySQLmysql.user 表 Host 改 % 或具體 IP,防火牆開 3306
25正則表達式用法PCRE 函數 preg_match/replace,掌握元字符、量詞、分組
26Apache 亂碼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,輸出獲取寫文件
31PHP 解釋執行字符串eval("$o=$str;") 極度危險,嚴禁用戶輸入直接 eval

精選深度解析

問題 1:變量獲取三種方案優劣

<?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;
?>

問題 3:Session 完整生命周期

<?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、空白行)
?>

問題 13/18/22/29/30:高頻實戰模式

點擊展開:文件上傳、數據處理、真實 IP、在線統計、模板靜態化核心代碼
<?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() 是魔鬼:問題 31 警示,eval("$o=$str;") 若用戶輸入 phpinfo(); 將洩露服務器信息,system('rm -rf /'); 將毀滅服務器。嚴禁 對用戶輸入使用 eval
  • magic_quotes_gpc 已移除:PHP 5.4+ 移除,舊代碼 stripcslashes() 兼容處理
  • mysql_* 函數已棄用:全文涉及的 mysql_* 均應遷移至 PDO/MySQLi + 預處理語句
  • Session 文件權限:問題 3 提示 session.save_path 需可寫,共享主機常需自定義
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved