[{"data":1,"prerenderedAt":3507},["ShallowReactive",2],{"navigation":3,"/templates/php-setup-guide":95,"/templates/php-setup-guide-surround":3502},[4,23,48],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"About Me","i-lucide-user",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Usage","/getting-started/usage","1.getting-started/3.usage","i-lucide-sliders",false,{"title":24,"path":25,"stem":26,"children":27,"page":22},"Essentials","/essentials","2.essentials",[28,33,38,43],{"title":29,"path":30,"stem":31,"icon":32},"Markdown Syntax","/essentials/markdown-syntax","2.essentials/1.markdown-syntax","i-lucide-heading-1",{"title":34,"path":35,"stem":36,"icon":37},"Code Blocks","/essentials/code-blocks","2.essentials/2.code-blocks","i-lucide-code-xml",{"title":39,"path":40,"stem":41,"icon":42},"Prose Components","/essentials/prose-components","2.essentials/3.prose-components","i-lucide-component",{"title":44,"path":45,"stem":46,"icon":47},"Images and Embeds","/essentials/images-embeds","2.essentials/4.images-embeds","i-lucide-image",{"title":49,"path":50,"stem":51,"children":52},"Templates","/templates","templates",[53,56,61,65,70,74,78,83,87,91],{"title":49,"path":50,"stem":54,"icon":55},"templates/index","i-lucide-archive",{"title":57,"path":58,"stem":59,"icon":60},"Panduan Setup HTML/CSS - Dari Template Statis hingga Responsive Design","/templates/html-css-setup-guide","templates/html-css-setup-guide","i-lucide-file-text",{"title":62,"path":63,"stem":64,"icon":60},"Panduan Setup Laravel - Dari Template hingga Ready Production","/templates/laravel-setup-guide","templates/laravel-setup-guide",{"title":66,"path":67,"stem":68,"icon":69},"Next.js SaaS Starter Kit - Panduan Lengkap","/templates/nextjs-saas-starter","templates/nextjs-saas-starter","i-lucide-layout-template",{"title":71,"path":72,"stem":73,"icon":60},"Panduan Setup Next.js - Dari Template hingga Production Ready","/templates/nextjs-setup-guide","templates/nextjs-setup-guide",{"title":75,"path":76,"stem":77,"icon":16},"Panduan Membeli & Download Template","/templates/panduan-beli-download","templates/panduan-beli-download",{"title":79,"path":80,"stem":81,"icon":82},"Panduan Setup Lengkap Semua Tech-Stack","/templates/panduan-setup-all-stack","templates/panduan-setup-all-stack","i-lucide-rocket",{"title":84,"path":85,"stem":86,"icon":60},"Panduan Setup PHP - Dari Template Hingga Production Deployment","/templates/php-setup-guide","templates/php-setup-guide",{"title":88,"path":89,"stem":90,"icon":60},"Product Documentation Template","/templates/product-documentation","templates/product-documentation",{"title":92,"path":93,"stem":94,"icon":60},"Panduan Setup React - Dari Download hingga Konfigurasi","/templates/react-setup-guide","templates/react-setup-guide",{"id":96,"title":84,"body":97,"description":3495,"extension":3496,"links":3497,"meta":3498,"navigation":3499,"path":85,"seo":3500,"stem":86,"__hash__":3501},"docs/templates/php-setup-guide.md",{"type":98,"value":99,"toc":3433},"minimark",[100,105,109,114,119,154,158,178,182,186,223,227,252,256,389,393,618,634,638,642,647,667,672,697,702,718,724,744,748,768,772,776,860,864,872,876,883,977,981,1233,1236,1260,1264,1268,1389,1393,1502,1506,1554,1558,1562,1883,1887,1891,2148,2152,2156,2310,2314,2355,2359,2391,2395,2399,2738,2742,2746,2790,2794,2823,2827,2888,2892,2930,2934,2938,2973,2977,3147,3151,3202,3206,3210,3303,3307,3327,3331,3335,3343,3347,3358,3362,3377,3381,3398,3401,3406,3429],[101,102,104],"h1",{"id":103},"panduan-setup-php-dari-template-hingga-production-deployment","📄 Panduan Setup PHP - Dari Template Hingga Production Deployment",[106,107,108],"p",{},"Panduan komprehensif untuk setup PHP website/aplikasi, dari template hingga siap production di server.",[110,111,113],"h2",{"id":112},"_1-persiapan-requirements","1. Persiapan & Requirements",[115,116,118],"h3",{"id":117},"kebutuhan-sistem","Kebutuhan Sistem",[120,121,122,130,136,142,148],"ul",{},[123,124,125,129],"li",{},[126,127,128],"strong",{},"PHP"," 7.4+ (7.4, 8.0, 8.1, 8.2)",[123,131,132,135],{},[126,133,134],{},"Web Server",": Apache atau Nginx",[123,137,138,141],{},[126,139,140],{},"Database",": MySQL 5.7+, PostgreSQL, atau MariaDB",[123,143,144,147],{},[126,145,146],{},"Text Editor",": VS Code, PHPStorm, atau Sublime",[123,149,150,153],{},[126,151,152],{},"FTP/SSH Client",": FileZilla, Cyberduck, atau Terminal",[115,155,157],{"id":156},"local-development-stack","Local Development Stack",[120,159,160,166,172],{},[123,161,162,165],{},[126,163,164],{},"Windows",": XAMPP, WAMP, atau Docker",[123,167,168,171],{},[126,169,170],{},"macOS",": MAMP, Laravel Valet, atau Docker",[123,173,174,177],{},[126,175,176],{},"Linux",": Apache + PHP + MySQL (manual) atau Docker",[110,179,181],{"id":180},"_2-install-local-development-environment","2. Install Local Development Environment",[115,183,185],{"id":184},"windows-xampp","Windows - XAMPP",[187,188,193],"pre",{"className":189,"code":190,"language":191,"meta":192,"style":192},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Download XAMPP dari https://www.apachefriends.org\n# 2. Install dengan default settings\n# 3. Start Apache & MySQL dari XAMPP Control Panel\n# 4. Akses http://localhost\n","bash","",[194,195,196,205,211,217],"code",{"__ignoreMap":192},[197,198,201],"span",{"class":199,"line":200},"line",1,[197,202,204],{"class":203},"sHwdD","# 1. Download XAMPP dari https://www.apachefriends.org\n",[197,206,208],{"class":199,"line":207},2,[197,209,210],{"class":203},"# 2. Install dengan default settings\n",[197,212,214],{"class":199,"line":213},3,[197,215,216],{"class":203},"# 3. Start Apache & MySQL dari XAMPP Control Panel\n",[197,218,220],{"class":199,"line":219},4,[197,221,222],{"class":203},"# 4. Akses http://localhost\n",[115,224,226],{"id":225},"macos-mamp","macOS - MAMP",[187,228,230],{"className":189,"code":229,"language":191,"meta":192,"style":192},"# 1. Download MAMP dari https://www.mamp.info\n# 2. Install aplikasi\n# 3. Klik Start Servers\n# 4. Akses http://localhost:8888\n",[194,231,232,237,242,247],{"__ignoreMap":192},[197,233,234],{"class":199,"line":200},[197,235,236],{"class":203},"# 1. Download MAMP dari https://www.mamp.info\n",[197,238,239],{"class":199,"line":207},[197,240,241],{"class":203},"# 2. Install aplikasi\n",[197,243,244],{"class":199,"line":213},[197,245,246],{"class":203},"# 3. Klik Start Servers\n",[197,248,249],{"class":199,"line":219},[197,250,251],{"class":203},"# 4. Akses http://localhost:8888\n",[115,253,255],{"id":254},"linux-manual-setup","Linux - Manual Setup",[187,257,259],{"className":189,"code":258,"language":191,"meta":192,"style":192},"# Install Apache\nsudo apt-get update\nsudo apt-get install apache2\n\n# Install PHP\nsudo apt-get install php php-cli php-mysql php-curl php-gd php-mbstring\n\n# Install MySQL\nsudo apt-get install mysql-server\n\n# Start services\nsudo systemctl start apache2\nsudo systemctl start mysql\n",[194,260,261,266,279,291,297,303,330,335,341,353,358,364,377],{"__ignoreMap":192},[197,262,263],{"class":199,"line":200},[197,264,265],{"class":203},"# Install Apache\n",[197,267,268,272,276],{"class":199,"line":207},[197,269,271],{"class":270},"sBMFI","sudo",[197,273,275],{"class":274},"sfazB"," apt-get",[197,277,278],{"class":274}," update\n",[197,280,281,283,285,288],{"class":199,"line":213},[197,282,271],{"class":270},[197,284,275],{"class":274},[197,286,287],{"class":274}," install",[197,289,290],{"class":274}," apache2\n",[197,292,293],{"class":199,"line":219},[197,294,296],{"emptyLinePlaceholder":295},true,"\n",[197,298,300],{"class":199,"line":299},5,[197,301,302],{"class":203},"# Install PHP\n",[197,304,306,308,310,312,315,318,321,324,327],{"class":199,"line":305},6,[197,307,271],{"class":270},[197,309,275],{"class":274},[197,311,287],{"class":274},[197,313,314],{"class":274}," php",[197,316,317],{"class":274}," php-cli",[197,319,320],{"class":274}," php-mysql",[197,322,323],{"class":274}," php-curl",[197,325,326],{"class":274}," php-gd",[197,328,329],{"class":274}," php-mbstring\n",[197,331,333],{"class":199,"line":332},7,[197,334,296],{"emptyLinePlaceholder":295},[197,336,338],{"class":199,"line":337},8,[197,339,340],{"class":203},"# Install MySQL\n",[197,342,344,346,348,350],{"class":199,"line":343},9,[197,345,271],{"class":270},[197,347,275],{"class":274},[197,349,287],{"class":274},[197,351,352],{"class":274}," mysql-server\n",[197,354,356],{"class":199,"line":355},10,[197,357,296],{"emptyLinePlaceholder":295},[197,359,361],{"class":199,"line":360},11,[197,362,363],{"class":203},"# Start services\n",[197,365,367,369,372,375],{"class":199,"line":366},12,[197,368,271],{"class":270},[197,370,371],{"class":274}," systemctl",[197,373,374],{"class":274}," start",[197,376,290],{"class":274},[197,378,380,382,384,386],{"class":199,"line":379},13,[197,381,271],{"class":270},[197,383,371],{"class":274},[197,385,374],{"class":274},[197,387,388],{"class":274}," mysql\n",[115,390,392],{"id":391},"docker-recommended","Docker (Recommended)",[187,394,398],{"className":395,"code":396,"language":397,"meta":192,"style":192},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# File: docker-compose.yml\nversion: '3.8'\nservices:\n  php:\n    image: php:8.1-apache\n    ports:\n      - \"80:80\"\n    volumes:\n      - ./:/var/www/html\n    environment:\n      DB_HOST: db\n      DB_USER: root\n      DB_PASSWORD: password\n      DB_NAME: phpdb\n\n  db:\n    image: mysql:8.0\n    environment:\n      MYSQL_ROOT_PASSWORD: password\n      MYSQL_DATABASE: phpdb\n    volumes:\n      - db_data:/var/lib/mysql\n\nvolumes:\n  db_data:\n","yaml",[194,399,400,405,424,432,439,449,456,470,477,484,491,501,511,521,532,537,545,555,562,572,582,589,597,602,610],{"__ignoreMap":192},[197,401,402],{"class":199,"line":200},[197,403,404],{"class":203},"# File: docker-compose.yml\n",[197,406,407,411,415,418,421],{"class":199,"line":207},[197,408,410],{"class":409},"swJcz","version",[197,412,414],{"class":413},"sMK4o",":",[197,416,417],{"class":413}," '",[197,419,420],{"class":274},"3.8",[197,422,423],{"class":413},"'\n",[197,425,426,429],{"class":199,"line":213},[197,427,428],{"class":409},"services",[197,430,431],{"class":413},":\n",[197,433,434,437],{"class":199,"line":219},[197,435,436],{"class":409},"  php",[197,438,431],{"class":413},[197,440,441,444,446],{"class":199,"line":299},[197,442,443],{"class":409},"    image",[197,445,414],{"class":413},[197,447,448],{"class":274}," php:8.1-apache\n",[197,450,451,454],{"class":199,"line":305},[197,452,453],{"class":409},"    ports",[197,455,431],{"class":413},[197,457,458,461,464,467],{"class":199,"line":332},[197,459,460],{"class":413},"      -",[197,462,463],{"class":413}," \"",[197,465,466],{"class":274},"80:80",[197,468,469],{"class":413},"\"\n",[197,471,472,475],{"class":199,"line":337},[197,473,474],{"class":409},"    volumes",[197,476,431],{"class":413},[197,478,479,481],{"class":199,"line":343},[197,480,460],{"class":413},[197,482,483],{"class":274}," ./:/var/www/html\n",[197,485,486,489],{"class":199,"line":355},[197,487,488],{"class":409},"    environment",[197,490,431],{"class":413},[197,492,493,496,498],{"class":199,"line":360},[197,494,495],{"class":409},"      DB_HOST",[197,497,414],{"class":413},[197,499,500],{"class":274}," db\n",[197,502,503,506,508],{"class":199,"line":366},[197,504,505],{"class":409},"      DB_USER",[197,507,414],{"class":413},[197,509,510],{"class":274}," root\n",[197,512,513,516,518],{"class":199,"line":379},[197,514,515],{"class":409},"      DB_PASSWORD",[197,517,414],{"class":413},[197,519,520],{"class":274}," password\n",[197,522,524,527,529],{"class":199,"line":523},14,[197,525,526],{"class":409},"      DB_NAME",[197,528,414],{"class":413},[197,530,531],{"class":274}," phpdb\n",[197,533,535],{"class":199,"line":534},15,[197,536,296],{"emptyLinePlaceholder":295},[197,538,540,543],{"class":199,"line":539},16,[197,541,542],{"class":409},"  db",[197,544,431],{"class":413},[197,546,548,550,552],{"class":199,"line":547},17,[197,549,443],{"class":409},[197,551,414],{"class":413},[197,553,554],{"class":274}," mysql:8.0\n",[197,556,558,560],{"class":199,"line":557},18,[197,559,488],{"class":409},[197,561,431],{"class":413},[197,563,565,568,570],{"class":199,"line":564},19,[197,566,567],{"class":409},"      MYSQL_ROOT_PASSWORD",[197,569,414],{"class":413},[197,571,520],{"class":274},[197,573,575,578,580],{"class":199,"line":574},20,[197,576,577],{"class":409},"      MYSQL_DATABASE",[197,579,414],{"class":413},[197,581,531],{"class":274},[197,583,585,587],{"class":199,"line":584},21,[197,586,474],{"class":409},[197,588,431],{"class":413},[197,590,592,594],{"class":199,"line":591},22,[197,593,460],{"class":413},[197,595,596],{"class":274}," db_data:/var/lib/mysql\n",[197,598,600],{"class":199,"line":599},23,[197,601,296],{"emptyLinePlaceholder":295},[197,603,605,608],{"class":199,"line":604},24,[197,606,607],{"class":409},"volumes",[197,609,431],{"class":413},[197,611,613,616],{"class":199,"line":612},25,[197,614,615],{"class":409},"  db_data",[197,617,431],{"class":413},[187,619,621],{"className":189,"code":620,"language":191,"meta":192,"style":192},"docker-compose up -d\n",[194,622,623],{"__ignoreMap":192},[197,624,625,628,631],{"class":199,"line":200},[197,626,627],{"class":270},"docker-compose",[197,629,630],{"class":274}," up",[197,632,633],{"class":274}," -d\n",[110,635,637],{"id":636},"_3-memilih-template-php","3. Memilih Template PHP",[115,639,641],{"id":640},"opsi-a-download-template-gratis","Opsi A: Download Template Gratis",[106,643,644],{},[126,645,646],{},"1. PHPFOX, PHP Scripts",[120,648,649,659],{},[123,650,651,658],{},[652,653,657],"a",{"href":654,"rel":655},"https://www.phpfox.com",[656],"nofollow","phpfox.com"," - Social platform",[123,660,661,666],{},[652,662,665],{"href":663,"rel":664},"https://www.nulled.io",[656],"nulled.io"," - Berbagai template PHP",[106,668,669],{},[126,670,671],{},"2. Marketplace Premium",[120,673,674,682,690],{},[123,675,676,681],{},[652,677,680],{"href":678,"rel":679},"https://codecanyon.net",[656],"codecanyon.net"," - Template PHP",[123,683,684,689],{},[652,685,688],{"href":686,"rel":687},"https://themeforest.net",[656],"themeforest.net"," - Website templates",[123,691,692],{},[652,693,696],{"href":694,"rel":695},"https://envato.com",[656],"envato.com",[106,698,699],{},[126,700,701],{},"3. GitHub",[120,703,704,712],{},[123,705,706,707],{},"Search \"PHP template\" di ",[652,708,711],{"href":709,"rel":710},"https://github.com",[656],"github.com",[123,713,714,715],{},"Clone repository: ",[194,716,717],{},"git clone repo-url",[106,719,720,723],{},[126,721,722],{},"4. CMS Populer"," (jika ingin pakai CMS)",[120,725,726,732,738],{},[123,727,728,731],{},[126,729,730],{},"WordPress"," - Blogging & CMS",[123,733,734,737],{},[126,735,736],{},"Joomla"," - Enterprise CMS",[123,739,740,743],{},[126,741,742],{},"Drupal"," - Flexible CMS",[115,745,747],{"id":746},"opsi-b-framework-php-modern","Opsi B: Framework PHP Modern",[120,749,750,756,762],{},[123,751,752,755],{},[126,753,754],{},"Laravel"," - Full framework (sudah ada di template sebelumnya)",[123,757,758,761],{},[126,759,760],{},"Slim"," - Micro framework untuk API",[123,763,764,767],{},[126,765,766],{},"Symfony"," - Enterprise framework",[110,769,771],{"id":770},"_4-setup-template-php-yang-didownload","4. Setup Template PHP yang Didownload",[115,773,775],{"id":774},"step-1-extract-folder-preparation","Step 1: Extract & Folder Preparation",[187,777,779],{"className":189,"code":778,"language":191,"meta":192,"style":192},"# Extract template\nunzip php-template.zip\n\n# Copy ke folder web server\n# Windows XAMPP: C:\\xampp\\htdocs\\project\n# macOS MAMP: /Applications/MAMP/htdocs/project\n# Linux: /var/www/html/project\n\n# Set permissions (Linux/Mac)\nchmod -R 755 .\nchmod -R 777 uploads storage cache\n",[194,780,781,786,794,798,803,808,813,818,822,827,842],{"__ignoreMap":192},[197,782,783],{"class":199,"line":200},[197,784,785],{"class":203},"# Extract template\n",[197,787,788,791],{"class":199,"line":207},[197,789,790],{"class":270},"unzip",[197,792,793],{"class":274}," php-template.zip\n",[197,795,796],{"class":199,"line":213},[197,797,296],{"emptyLinePlaceholder":295},[197,799,800],{"class":199,"line":219},[197,801,802],{"class":203},"# Copy ke folder web server\n",[197,804,805],{"class":199,"line":299},[197,806,807],{"class":203},"# Windows XAMPP: C:\\xampp\\htdocs\\project\n",[197,809,810],{"class":199,"line":305},[197,811,812],{"class":203},"# macOS MAMP: /Applications/MAMP/htdocs/project\n",[197,814,815],{"class":199,"line":332},[197,816,817],{"class":203},"# Linux: /var/www/html/project\n",[197,819,820],{"class":199,"line":337},[197,821,296],{"emptyLinePlaceholder":295},[197,823,824],{"class":199,"line":343},[197,825,826],{"class":203},"# Set permissions (Linux/Mac)\n",[197,828,829,832,835,839],{"class":199,"line":355},[197,830,831],{"class":270},"chmod",[197,833,834],{"class":274}," -R",[197,836,838],{"class":837},"sbssI"," 755",[197,840,841],{"class":274}," .\n",[197,843,844,846,848,851,854,857],{"class":199,"line":360},[197,845,831],{"class":270},[197,847,834],{"class":274},[197,849,850],{"class":837}," 777",[197,852,853],{"class":274}," uploads",[197,855,856],{"class":274}," storage",[197,858,859],{"class":274}," cache\n",[115,861,863],{"id":862},"step-2-folder-structure-untuk-php-website","Step 2: Folder Structure untuk PHP Website",[187,865,870],{"className":866,"code":868,"language":869},[867],"language-text","project/\n├── index.php                # Entry point\n├── config.php               # Configuration\n│\n├── public/\n│   ├── index.php           # Public entry\n│   ├── .htaccess           # Apache routing\n│   ├── css/\n│   ├── js/\n│   └── images/\n│\n├── app/\n│   ├── controllers/        # Business logic\n│   ├── models/             # Database models\n│   ├── views/              # View templates\n│   └── helpers/            # Helper functions\n│\n├── database/\n│   ├── config.php          # Database connection\n│   ├── migrations/         # Schema files\n│   └── seeds/              # Sample data\n│\n├── includes/\n│   ├── header.php\n│   ├── footer.php\n│   └── sidebar.php\n│\n├── admin/                  # Admin panel\n│   ├── index.php\n│   ├── css/\n│   └── js/\n│\n├── uploads/                # User uploads\n├── logs/                   # Error logs\n│\n├── .htaccess               # URL rewriting\n├── config.php              # Main config\n└── README.md\n","text",[194,871,868],{"__ignoreMap":192},[115,873,875],{"id":874},"step-3-database-connection-configuration","Step 3: Database Connection Configuration",[106,877,878,879,882],{},"Create ",[194,880,881],{},"database/config.php"," atau edit yang sudah ada:",[187,884,888],{"className":885,"code":886,"language":887,"meta":192,"style":192},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?php\n// Database configuration\ndefine('DB_HOST', 'localhost');\ndefine('DB_USER', 'root');\ndefine('DB_PASSWORD', 'password');\ndefine('DB_NAME', 'project_db');\n\n// Create connection\n$conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);\n\n// Check connection\nif ($conn->connect_error) {\n    die(\"Connection failed: \" . $conn->connect_error);\n}\n\n// Set charset\n$conn->set_charset(\"utf8\");\n?>\n","php",[194,889,890,895,900,905,910,915,920,924,929,934,938,943,948,953,958,962,967,972],{"__ignoreMap":192},[197,891,892],{"class":199,"line":200},[197,893,894],{},"\u003C?php\n",[197,896,897],{"class":199,"line":207},[197,898,899],{},"// Database configuration\n",[197,901,902],{"class":199,"line":213},[197,903,904],{},"define('DB_HOST', 'localhost');\n",[197,906,907],{"class":199,"line":219},[197,908,909],{},"define('DB_USER', 'root');\n",[197,911,912],{"class":199,"line":299},[197,913,914],{},"define('DB_PASSWORD', 'password');\n",[197,916,917],{"class":199,"line":305},[197,918,919],{},"define('DB_NAME', 'project_db');\n",[197,921,922],{"class":199,"line":332},[197,923,296],{"emptyLinePlaceholder":295},[197,925,926],{"class":199,"line":337},[197,927,928],{},"// Create connection\n",[197,930,931],{"class":199,"line":343},[197,932,933],{},"$conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);\n",[197,935,936],{"class":199,"line":355},[197,937,296],{"emptyLinePlaceholder":295},[197,939,940],{"class":199,"line":360},[197,941,942],{},"// Check connection\n",[197,944,945],{"class":199,"line":366},[197,946,947],{},"if ($conn->connect_error) {\n",[197,949,950],{"class":199,"line":379},[197,951,952],{},"    die(\"Connection failed: \" . $conn->connect_error);\n",[197,954,955],{"class":199,"line":523},[197,956,957],{},"}\n",[197,959,960],{"class":199,"line":534},[197,961,296],{"emptyLinePlaceholder":295},[197,963,964],{"class":199,"line":539},[197,965,966],{},"// Set charset\n",[197,968,969],{"class":199,"line":547},[197,970,971],{},"$conn->set_charset(\"utf8\");\n",[197,973,974],{"class":199,"line":557},[197,975,976],{},"?>\n",[115,978,980],{"id":979},"step-4-create-database-tables","Step 4: Create Database & Tables",[187,982,984],{"className":189,"code":983,"language":191,"meta":192,"style":192},"# Login ke MySQL\nmysql -u root -p\n\n# Buat database\nCREATE DATABASE project_db;\nUSE project_db;\n\n# Buat table (contoh users table)\nCREATE TABLE users (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    username VARCHAR(50) UNIQUE NOT NULL,\n    email VARCHAR(100) UNIQUE NOT NULL,\n    password VARCHAR(255) NOT NULL,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n# Insert sample data\nINSERT INTO users (username, email, password) VALUES\n('admin', 'admin@example.com', MD5('password123'));\n\nEXIT;\n",[194,985,986,991,1005,1009,1014,1028,1037,1041,1046,1060,1077,1103,1123,1141,1155,1160,1164,1169,1191,1222,1226],{"__ignoreMap":192},[197,987,988],{"class":199,"line":200},[197,989,990],{"class":203},"# Login ke MySQL\n",[197,992,993,996,999,1002],{"class":199,"line":207},[197,994,995],{"class":270},"mysql",[197,997,998],{"class":274}," -u",[197,1000,1001],{"class":274}," root",[197,1003,1004],{"class":274}," -p\n",[197,1006,1007],{"class":199,"line":213},[197,1008,296],{"emptyLinePlaceholder":295},[197,1010,1011],{"class":199,"line":219},[197,1012,1013],{"class":203},"# Buat database\n",[197,1015,1016,1019,1022,1025],{"class":199,"line":299},[197,1017,1018],{"class":270},"CREATE",[197,1020,1021],{"class":274}," DATABASE",[197,1023,1024],{"class":274}," project_db",[197,1026,1027],{"class":413},";\n",[197,1029,1030,1033,1035],{"class":199,"line":305},[197,1031,1032],{"class":270},"USE",[197,1034,1024],{"class":274},[197,1036,1027],{"class":413},[197,1038,1039],{"class":199,"line":332},[197,1040,296],{"emptyLinePlaceholder":295},[197,1042,1043],{"class":199,"line":337},[197,1044,1045],{"class":203},"# Buat table (contoh users table)\n",[197,1047,1048,1050,1053,1056],{"class":199,"line":343},[197,1049,1018],{"class":270},[197,1051,1052],{"class":274}," TABLE",[197,1054,1055],{"class":274}," users",[197,1057,1059],{"class":1058},"sTEyZ"," (\n",[197,1061,1062,1065,1068,1071,1074],{"class":199,"line":355},[197,1063,1064],{"class":270},"    id",[197,1066,1067],{"class":274}," INT",[197,1069,1070],{"class":274}," AUTO_INCREMENT",[197,1072,1073],{"class":274}," PRIMARY",[197,1075,1076],{"class":274}," KEY,\n",[197,1078,1079,1082,1085,1088,1091,1094,1097,1100],{"class":199,"line":360},[197,1080,1081],{"class":270},"    username",[197,1083,1084],{"class":274}," VARCHAR",[197,1086,1087],{"class":413},"(",[197,1089,1090],{"class":270},"50",[197,1092,1093],{"class":413},")",[197,1095,1096],{"class":274}," UNIQUE",[197,1098,1099],{"class":274}," NOT",[197,1101,1102],{"class":274}," NULL,\n",[197,1104,1105,1108,1110,1112,1115,1117,1119,1121],{"class":199,"line":366},[197,1106,1107],{"class":270},"    email",[197,1109,1084],{"class":274},[197,1111,1087],{"class":413},[197,1113,1114],{"class":270},"100",[197,1116,1093],{"class":413},[197,1118,1096],{"class":274},[197,1120,1099],{"class":274},[197,1122,1102],{"class":274},[197,1124,1125,1128,1130,1132,1135,1137,1139],{"class":199,"line":379},[197,1126,1127],{"class":270},"    password",[197,1129,1084],{"class":274},[197,1131,1087],{"class":413},[197,1133,1134],{"class":270},"255",[197,1136,1093],{"class":413},[197,1138,1099],{"class":274},[197,1140,1102],{"class":274},[197,1142,1143,1146,1149,1152],{"class":199,"line":523},[197,1144,1145],{"class":270},"    created_at",[197,1147,1148],{"class":274}," TIMESTAMP",[197,1150,1151],{"class":274}," DEFAULT",[197,1153,1154],{"class":274}," CURRENT_TIMESTAMP\n",[197,1156,1157],{"class":199,"line":534},[197,1158,1159],{"class":1058},");\n",[197,1161,1162],{"class":199,"line":539},[197,1163,296],{"emptyLinePlaceholder":295},[197,1165,1166],{"class":199,"line":547},[197,1167,1168],{"class":203},"# Insert sample data\n",[197,1170,1171,1174,1177,1179,1182,1185,1188],{"class":199,"line":557},[197,1172,1173],{"class":270},"INSERT",[197,1175,1176],{"class":274}," INTO",[197,1178,1055],{"class":274},[197,1180,1181],{"class":1058}," (username, ",[197,1183,1184],{"class":274},"email,",[197,1186,1187],{"class":274}," password",[197,1189,1190],{"class":1058},") VALUES\n",[197,1192,1193,1195,1198,1201,1203,1206,1209,1211,1214,1216,1219],{"class":199,"line":564},[197,1194,1087],{"class":413},[197,1196,1197],{"class":270},"'admin'",[197,1199,1200],{"class":270},",",[197,1202,417],{"class":413},[197,1204,1205],{"class":274},"admin@example.com",[197,1207,1208],{"class":413},"'",[197,1210,1200],{"class":274},[197,1212,1213],{"class":274}," MD5",[197,1215,1087],{"class":413},[197,1217,1218],{"class":270},"'password123'",[197,1220,1221],{"class":413},"));\n",[197,1223,1224],{"class":199,"line":574},[197,1225,296],{"emptyLinePlaceholder":295},[197,1227,1228,1231],{"class":199,"line":584},[197,1229,1230],{"class":270},"EXIT",[197,1232,1027],{"class":413},[106,1234,1235],{},"Atau jalankan file SQL jika template sudah punya:",[187,1237,1239],{"className":189,"code":1238,"language":191,"meta":192,"style":192},"mysql -u root -p project_db \u003C database/schema.sql\n",[194,1240,1241],{"__ignoreMap":192},[197,1242,1243,1245,1247,1249,1252,1254,1257],{"class":199,"line":200},[197,1244,995],{"class":270},[197,1246,998],{"class":274},[197,1248,1001],{"class":274},[197,1250,1251],{"class":274}," -p",[197,1253,1024],{"class":274},[197,1255,1256],{"class":413}," \u003C",[197,1258,1259],{"class":274}," database/schema.sql\n",[110,1261,1263],{"id":1262},"_5-file-struktur-dasar","5. File Struktur Dasar",[115,1265,1267],{"id":1266},"indexphp-entry-point","index.php (Entry Point)",[187,1269,1271],{"className":885,"code":1270,"language":887,"meta":192,"style":192},"\u003C?php\n// index.php\nsession_start();\n\n// Include configuration\nrequire_once 'database/config.php';\nrequire_once 'app/helpers/functions.php';\n\n// Determine page\n$page = isset($_GET['page']) ? $_GET['page'] : 'home';\n\n// Security: Sanitize input\n$page = preg_replace('/[^a-zA-Z0-9_]/', '', $page);\n\n// Check if page exists\nif (file_exists(\"app/views/{$page}.php\")) {\n    require \"includes/header.php\";\n    require \"app/views/{$page}.php\";\n    require \"includes/footer.php\";\n} else {\n    require \"includes/header.php\";\n    require \"app/views/404.php\";\n    require \"includes/footer.php\";\n}\n?>\n",[194,1272,1273,1277,1282,1287,1291,1296,1301,1306,1310,1315,1320,1324,1329,1334,1338,1343,1348,1353,1358,1363,1368,1372,1377,1381,1385],{"__ignoreMap":192},[197,1274,1275],{"class":199,"line":200},[197,1276,894],{},[197,1278,1279],{"class":199,"line":207},[197,1280,1281],{},"// index.php\n",[197,1283,1284],{"class":199,"line":213},[197,1285,1286],{},"session_start();\n",[197,1288,1289],{"class":199,"line":219},[197,1290,296],{"emptyLinePlaceholder":295},[197,1292,1293],{"class":199,"line":299},[197,1294,1295],{},"// Include configuration\n",[197,1297,1298],{"class":199,"line":305},[197,1299,1300],{},"require_once 'database/config.php';\n",[197,1302,1303],{"class":199,"line":332},[197,1304,1305],{},"require_once 'app/helpers/functions.php';\n",[197,1307,1308],{"class":199,"line":337},[197,1309,296],{"emptyLinePlaceholder":295},[197,1311,1312],{"class":199,"line":343},[197,1313,1314],{},"// Determine page\n",[197,1316,1317],{"class":199,"line":355},[197,1318,1319],{},"$page = isset($_GET['page']) ? $_GET['page'] : 'home';\n",[197,1321,1322],{"class":199,"line":360},[197,1323,296],{"emptyLinePlaceholder":295},[197,1325,1326],{"class":199,"line":366},[197,1327,1328],{},"// Security: Sanitize input\n",[197,1330,1331],{"class":199,"line":379},[197,1332,1333],{},"$page = preg_replace('/[^a-zA-Z0-9_]/', '', $page);\n",[197,1335,1336],{"class":199,"line":523},[197,1337,296],{"emptyLinePlaceholder":295},[197,1339,1340],{"class":199,"line":534},[197,1341,1342],{},"// Check if page exists\n",[197,1344,1345],{"class":199,"line":539},[197,1346,1347],{},"if (file_exists(\"app/views/{$page}.php\")) {\n",[197,1349,1350],{"class":199,"line":547},[197,1351,1352],{},"    require \"includes/header.php\";\n",[197,1354,1355],{"class":199,"line":557},[197,1356,1357],{},"    require \"app/views/{$page}.php\";\n",[197,1359,1360],{"class":199,"line":564},[197,1361,1362],{},"    require \"includes/footer.php\";\n",[197,1364,1365],{"class":199,"line":574},[197,1366,1367],{},"} else {\n",[197,1369,1370],{"class":199,"line":584},[197,1371,1352],{},[197,1373,1374],{"class":199,"line":591},[197,1375,1376],{},"    require \"app/views/404.php\";\n",[197,1378,1379],{"class":199,"line":599},[197,1380,1362],{},[197,1382,1383],{"class":199,"line":604},[197,1384,957],{},[197,1386,1387],{"class":199,"line":612},[197,1388,976],{},[115,1390,1392],{"id":1391},"includesheaderphp","includes/header.php",[187,1394,1396],{"className":885,"code":1395,"language":887,"meta":192,"style":192},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"id\">\n\u003Chead>\n    \u003Cmeta charset=\"UTF-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Ctitle>\u003C?php echo isset($page_title) ? $page_title : 'Website'; ?>\u003C/title>\n    \u003Clink rel=\"stylesheet\" href=\"public/css/style.css\">\n\u003C/head>\n\u003Cbody>\n    \u003Cheader>\n        \u003Cnav>\n            \u003Cul>\n                \u003Cli>\u003Ca href=\"index.php?page=home\">Home\u003C/a>\u003C/li>\n                \u003Cli>\u003Ca href=\"index.php?page=about\">About\u003C/a>\u003C/li>\n                \u003Cli>\u003Ca href=\"index.php?page=services\">Services\u003C/a>\u003C/li>\n                \u003Cli>\u003Ca href=\"index.php?page=contact\">Contact\u003C/a>\u003C/li>\n            \u003C/ul>\n        \u003C/nav>\n    \u003C/header>\n\n    \u003Cmain>\n",[194,1397,1398,1403,1408,1413,1418,1423,1428,1433,1438,1443,1448,1453,1458,1463,1468,1473,1478,1483,1488,1493,1497],{"__ignoreMap":192},[197,1399,1400],{"class":199,"line":200},[197,1401,1402],{},"\u003C!DOCTYPE html>\n",[197,1404,1405],{"class":199,"line":207},[197,1406,1407],{},"\u003Chtml lang=\"id\">\n",[197,1409,1410],{"class":199,"line":213},[197,1411,1412],{},"\u003Chead>\n",[197,1414,1415],{"class":199,"line":219},[197,1416,1417],{},"    \u003Cmeta charset=\"UTF-8\">\n",[197,1419,1420],{"class":199,"line":299},[197,1421,1422],{},"    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n",[197,1424,1425],{"class":199,"line":305},[197,1426,1427],{},"    \u003Ctitle>\u003C?php echo isset($page_title) ? $page_title : 'Website'; ?>\u003C/title>\n",[197,1429,1430],{"class":199,"line":332},[197,1431,1432],{},"    \u003Clink rel=\"stylesheet\" href=\"public/css/style.css\">\n",[197,1434,1435],{"class":199,"line":337},[197,1436,1437],{},"\u003C/head>\n",[197,1439,1440],{"class":199,"line":343},[197,1441,1442],{},"\u003Cbody>\n",[197,1444,1445],{"class":199,"line":355},[197,1446,1447],{},"    \u003Cheader>\n",[197,1449,1450],{"class":199,"line":360},[197,1451,1452],{},"        \u003Cnav>\n",[197,1454,1455],{"class":199,"line":366},[197,1456,1457],{},"            \u003Cul>\n",[197,1459,1460],{"class":199,"line":379},[197,1461,1462],{},"                \u003Cli>\u003Ca href=\"index.php?page=home\">Home\u003C/a>\u003C/li>\n",[197,1464,1465],{"class":199,"line":523},[197,1466,1467],{},"                \u003Cli>\u003Ca href=\"index.php?page=about\">About\u003C/a>\u003C/li>\n",[197,1469,1470],{"class":199,"line":534},[197,1471,1472],{},"                \u003Cli>\u003Ca href=\"index.php?page=services\">Services\u003C/a>\u003C/li>\n",[197,1474,1475],{"class":199,"line":539},[197,1476,1477],{},"                \u003Cli>\u003Ca href=\"index.php?page=contact\">Contact\u003C/a>\u003C/li>\n",[197,1479,1480],{"class":199,"line":547},[197,1481,1482],{},"            \u003C/ul>\n",[197,1484,1485],{"class":199,"line":557},[197,1486,1487],{},"        \u003C/nav>\n",[197,1489,1490],{"class":199,"line":564},[197,1491,1492],{},"    \u003C/header>\n",[197,1494,1495],{"class":199,"line":574},[197,1496,296],{"emptyLinePlaceholder":295},[197,1498,1499],{"class":199,"line":584},[197,1500,1501],{},"    \u003Cmain>\n",[115,1503,1505],{"id":1504},"includesfooterphp","includes/footer.php",[187,1507,1509],{"className":885,"code":1508,"language":887,"meta":192,"style":192},"    \u003C/main>\n\n    \u003Cfooter>\n        \u003Cp>&copy; \u003C?php echo date('Y'); ?> Website Saya\u003C/p>\n    \u003C/footer>\n\n    \u003Cscript src=\"public/js/main.js\">\u003C/script>\n\u003C/body>\n\u003C/html>\n",[194,1510,1511,1516,1520,1525,1530,1535,1539,1544,1549],{"__ignoreMap":192},[197,1512,1513],{"class":199,"line":200},[197,1514,1515],{},"    \u003C/main>\n",[197,1517,1518],{"class":199,"line":207},[197,1519,296],{"emptyLinePlaceholder":295},[197,1521,1522],{"class":199,"line":213},[197,1523,1524],{},"    \u003Cfooter>\n",[197,1526,1527],{"class":199,"line":219},[197,1528,1529],{},"        \u003Cp>&copy; \u003C?php echo date('Y'); ?> Website Saya\u003C/p>\n",[197,1531,1532],{"class":199,"line":299},[197,1533,1534],{},"    \u003C/footer>\n",[197,1536,1537],{"class":199,"line":305},[197,1538,296],{"emptyLinePlaceholder":295},[197,1540,1541],{"class":199,"line":332},[197,1542,1543],{},"    \u003Cscript src=\"public/js/main.js\">\u003C/script>\n",[197,1545,1546],{"class":199,"line":337},[197,1547,1548],{},"\u003C/body>\n",[197,1550,1551],{"class":199,"line":343},[197,1552,1553],{},"\u003C/html>\n",[110,1555,1557],{"id":1556},"_6-database-operations","6. Database Operations",[115,1559,1561],{"id":1560},"connect-query-data","Connect & Query Data",[187,1563,1565],{"className":885,"code":1564,"language":887,"meta":192,"style":192},"\u003C?php\nrequire 'database/config.php';\n\n// SELECT - Get data\n$query = \"SELECT * FROM users\";\n$result = $conn->query($query);\n\nif ($result->num_rows > 0) {\n    while ($row = $result->fetch_assoc()) {\n        echo \"ID: \" . $row['id'] . \" - Name: \" . $row['username'];\n    }\n} else {\n    echo \"No results found\";\n}\n\n// INSERT - Add data\n$username = $_POST['username'] ?? '';\n$email = $_POST['email'] ?? '';\n$password = password_hash($_POST['password'] ?? '', PASSWORD_DEFAULT);\n\nif (!empty($username) && !empty($email) && !empty($password)) {\n    $insert_query = \"INSERT INTO users (username, email, password) VALUES (?, ?, ?)\";\n    $stmt = $conn->prepare($insert_query);\n    $stmt->bind_param(\"sss\", $username, $email, $password);\n    \n    if ($stmt->execute()) {\n        echo \"User created successfully\";\n    } else {\n        echo \"Error: \" . $stmt->error;\n    }\n    $stmt->close();\n}\n\n// UPDATE - Edit data\n$id = $_POST['id'] ?? 0;\n$username = $_POST['username'] ?? '';\n\nif ($id > 0) {\n    $update_query = \"UPDATE users SET username = ? WHERE id = ?\";\n    $stmt = $conn->prepare($update_query);\n    $stmt->bind_param(\"si\", $username, $id);\n    \n    if ($stmt->execute()) {\n        echo \"User updated\";\n    }\n    $stmt->close();\n}\n\n// DELETE - Remove data\n$id = $_GET['id'] ?? 0;\nif ($id > 0) {\n    $delete_query = \"DELETE FROM users WHERE id = ?\";\n    $stmt = $conn->prepare($delete_query);\n    $stmt->bind_param(\"i\", $id);\n    \n    if ($stmt->execute()) {\n        echo \"User deleted\";\n    }\n    $stmt->close();\n}\n?>\n",[194,1566,1567,1571,1576,1580,1585,1590,1595,1599,1604,1609,1614,1619,1623,1628,1632,1636,1641,1646,1651,1656,1660,1665,1670,1675,1680,1685,1691,1697,1703,1709,1714,1720,1725,1730,1736,1742,1747,1752,1758,1764,1770,1776,1781,1786,1792,1797,1802,1807,1812,1818,1824,1829,1835,1841,1847,1852,1857,1863,1868,1873,1878],{"__ignoreMap":192},[197,1568,1569],{"class":199,"line":200},[197,1570,894],{},[197,1572,1573],{"class":199,"line":207},[197,1574,1575],{},"require 'database/config.php';\n",[197,1577,1578],{"class":199,"line":213},[197,1579,296],{"emptyLinePlaceholder":295},[197,1581,1582],{"class":199,"line":219},[197,1583,1584],{},"// SELECT - Get data\n",[197,1586,1587],{"class":199,"line":299},[197,1588,1589],{},"$query = \"SELECT * FROM users\";\n",[197,1591,1592],{"class":199,"line":305},[197,1593,1594],{},"$result = $conn->query($query);\n",[197,1596,1597],{"class":199,"line":332},[197,1598,296],{"emptyLinePlaceholder":295},[197,1600,1601],{"class":199,"line":337},[197,1602,1603],{},"if ($result->num_rows > 0) {\n",[197,1605,1606],{"class":199,"line":343},[197,1607,1608],{},"    while ($row = $result->fetch_assoc()) {\n",[197,1610,1611],{"class":199,"line":355},[197,1612,1613],{},"        echo \"ID: \" . $row['id'] . \" - Name: \" . $row['username'];\n",[197,1615,1616],{"class":199,"line":360},[197,1617,1618],{},"    }\n",[197,1620,1621],{"class":199,"line":366},[197,1622,1367],{},[197,1624,1625],{"class":199,"line":379},[197,1626,1627],{},"    echo \"No results found\";\n",[197,1629,1630],{"class":199,"line":523},[197,1631,957],{},[197,1633,1634],{"class":199,"line":534},[197,1635,296],{"emptyLinePlaceholder":295},[197,1637,1638],{"class":199,"line":539},[197,1639,1640],{},"// INSERT - Add data\n",[197,1642,1643],{"class":199,"line":547},[197,1644,1645],{},"$username = $_POST['username'] ?? '';\n",[197,1647,1648],{"class":199,"line":557},[197,1649,1650],{},"$email = $_POST['email'] ?? '';\n",[197,1652,1653],{"class":199,"line":564},[197,1654,1655],{},"$password = password_hash($_POST['password'] ?? '', PASSWORD_DEFAULT);\n",[197,1657,1658],{"class":199,"line":574},[197,1659,296],{"emptyLinePlaceholder":295},[197,1661,1662],{"class":199,"line":584},[197,1663,1664],{},"if (!empty($username) && !empty($email) && !empty($password)) {\n",[197,1666,1667],{"class":199,"line":591},[197,1668,1669],{},"    $insert_query = \"INSERT INTO users (username, email, password) VALUES (?, ?, ?)\";\n",[197,1671,1672],{"class":199,"line":599},[197,1673,1674],{},"    $stmt = $conn->prepare($insert_query);\n",[197,1676,1677],{"class":199,"line":604},[197,1678,1679],{},"    $stmt->bind_param(\"sss\", $username, $email, $password);\n",[197,1681,1682],{"class":199,"line":612},[197,1683,1684],{},"    \n",[197,1686,1688],{"class":199,"line":1687},26,[197,1689,1690],{},"    if ($stmt->execute()) {\n",[197,1692,1694],{"class":199,"line":1693},27,[197,1695,1696],{},"        echo \"User created successfully\";\n",[197,1698,1700],{"class":199,"line":1699},28,[197,1701,1702],{},"    } else {\n",[197,1704,1706],{"class":199,"line":1705},29,[197,1707,1708],{},"        echo \"Error: \" . $stmt->error;\n",[197,1710,1712],{"class":199,"line":1711},30,[197,1713,1618],{},[197,1715,1717],{"class":199,"line":1716},31,[197,1718,1719],{},"    $stmt->close();\n",[197,1721,1723],{"class":199,"line":1722},32,[197,1724,957],{},[197,1726,1728],{"class":199,"line":1727},33,[197,1729,296],{"emptyLinePlaceholder":295},[197,1731,1733],{"class":199,"line":1732},34,[197,1734,1735],{},"// UPDATE - Edit data\n",[197,1737,1739],{"class":199,"line":1738},35,[197,1740,1741],{},"$id = $_POST['id'] ?? 0;\n",[197,1743,1745],{"class":199,"line":1744},36,[197,1746,1645],{},[197,1748,1750],{"class":199,"line":1749},37,[197,1751,296],{"emptyLinePlaceholder":295},[197,1753,1755],{"class":199,"line":1754},38,[197,1756,1757],{},"if ($id > 0) {\n",[197,1759,1761],{"class":199,"line":1760},39,[197,1762,1763],{},"    $update_query = \"UPDATE users SET username = ? WHERE id = ?\";\n",[197,1765,1767],{"class":199,"line":1766},40,[197,1768,1769],{},"    $stmt = $conn->prepare($update_query);\n",[197,1771,1773],{"class":199,"line":1772},41,[197,1774,1775],{},"    $stmt->bind_param(\"si\", $username, $id);\n",[197,1777,1779],{"class":199,"line":1778},42,[197,1780,1684],{},[197,1782,1784],{"class":199,"line":1783},43,[197,1785,1690],{},[197,1787,1789],{"class":199,"line":1788},44,[197,1790,1791],{},"        echo \"User updated\";\n",[197,1793,1795],{"class":199,"line":1794},45,[197,1796,1618],{},[197,1798,1800],{"class":199,"line":1799},46,[197,1801,1719],{},[197,1803,1805],{"class":199,"line":1804},47,[197,1806,957],{},[197,1808,1810],{"class":199,"line":1809},48,[197,1811,296],{"emptyLinePlaceholder":295},[197,1813,1815],{"class":199,"line":1814},49,[197,1816,1817],{},"// DELETE - Remove data\n",[197,1819,1821],{"class":199,"line":1820},50,[197,1822,1823],{},"$id = $_GET['id'] ?? 0;\n",[197,1825,1827],{"class":199,"line":1826},51,[197,1828,1757],{},[197,1830,1832],{"class":199,"line":1831},52,[197,1833,1834],{},"    $delete_query = \"DELETE FROM users WHERE id = ?\";\n",[197,1836,1838],{"class":199,"line":1837},53,[197,1839,1840],{},"    $stmt = $conn->prepare($delete_query);\n",[197,1842,1844],{"class":199,"line":1843},54,[197,1845,1846],{},"    $stmt->bind_param(\"i\", $id);\n",[197,1848,1850],{"class":199,"line":1849},55,[197,1851,1684],{},[197,1853,1855],{"class":199,"line":1854},56,[197,1856,1690],{},[197,1858,1860],{"class":199,"line":1859},57,[197,1861,1862],{},"        echo \"User deleted\";\n",[197,1864,1866],{"class":199,"line":1865},58,[197,1867,1618],{},[197,1869,1871],{"class":199,"line":1870},59,[197,1872,1719],{},[197,1874,1876],{"class":199,"line":1875},60,[197,1877,957],{},[197,1879,1881],{"class":199,"line":1880},61,[197,1882,976],{},[110,1884,1886],{"id":1885},"_7-form-handling-validation","7. Form Handling & Validation",[115,1888,1890],{"id":1889},"form-dengan-validation","Form dengan Validation",[187,1892,1894],{"className":885,"code":1893,"language":887,"meta":192,"style":192},"\u003C?php\n// app/controllers/form.php\n\n$errors = [];\n$success = false;\n\nif ($_SERVER['REQUEST_METHOD'] === 'POST') {\n    // Sanitize input\n    $name = htmlspecialchars($_POST['name'] ?? '');\n    $email = filter_var($_POST['email'] ?? '', FILTER_SANITIZE_EMAIL);\n    $message = htmlspecialchars($_POST['message'] ?? '');\n\n    // Validate\n    if (empty($name)) $errors[] = \"Nama wajib diisi\";\n    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {\n        $errors[] = \"Email tidak valid\";\n    }\n    if (empty($message)) $errors[] = \"Pesan wajib diisi\";\n\n    // Process jika valid\n    if (empty($errors)) {\n        // Save to database atau kirim email\n        $insert = \"INSERT INTO messages (name, email, message) VALUES (?, ?, ?)\";\n        $stmt = $conn->prepare($insert);\n        $stmt->bind_param(\"sss\", $name, $email, $message);\n        \n        if ($stmt->execute()) {\n            $success = true;\n        }\n        $stmt->close();\n    }\n}\n?>\n\n\u003C!-- View -->\n\u003C?php if ($success): ?>\n    \u003Cdiv class=\"alert success\">Pesan berhasil dikirim!\u003C/div>\n\u003C?php endif; ?>\n\n\u003C?php if (!empty($errors)): ?>\n    \u003Cdiv class=\"alert error\">\n        \u003C?php foreach ($errors as $error): ?>\n            \u003Cp>\u003C?php echo $error; ?>\u003C/p>\n        \u003C?php endforeach; ?>\n    \u003C/div>\n\u003C?php endif; ?>\n\n\u003Cform method=\"POST\">\n    \u003Cinput type=\"text\" name=\"name\" placeholder=\"Nama Anda\" value=\"\u003C?php echo $name ?? ''; ?>\">\n    \u003Cinput type=\"email\" name=\"email\" placeholder=\"Email\" value=\"\u003C?php echo $email ?? ''; ?>\">\n    \u003Ctextarea name=\"message\">\u003C?php echo $message ?? ''; ?>\u003C/textarea>\n    \u003Cbutton type=\"submit\">Kirim\u003C/button>\n\u003C/form>\n",[194,1895,1896,1900,1905,1909,1914,1919,1923,1928,1933,1938,1943,1948,1952,1957,1962,1967,1972,1976,1981,1985,1990,1995,2000,2005,2010,2015,2020,2025,2030,2035,2040,2044,2048,2052,2056,2061,2066,2071,2076,2080,2085,2090,2095,2100,2105,2110,2114,2118,2123,2128,2133,2138,2143],{"__ignoreMap":192},[197,1897,1898],{"class":199,"line":200},[197,1899,894],{},[197,1901,1902],{"class":199,"line":207},[197,1903,1904],{},"// app/controllers/form.php\n",[197,1906,1907],{"class":199,"line":213},[197,1908,296],{"emptyLinePlaceholder":295},[197,1910,1911],{"class":199,"line":219},[197,1912,1913],{},"$errors = [];\n",[197,1915,1916],{"class":199,"line":299},[197,1917,1918],{},"$success = false;\n",[197,1920,1921],{"class":199,"line":305},[197,1922,296],{"emptyLinePlaceholder":295},[197,1924,1925],{"class":199,"line":332},[197,1926,1927],{},"if ($_SERVER['REQUEST_METHOD'] === 'POST') {\n",[197,1929,1930],{"class":199,"line":337},[197,1931,1932],{},"    // Sanitize input\n",[197,1934,1935],{"class":199,"line":343},[197,1936,1937],{},"    $name = htmlspecialchars($_POST['name'] ?? '');\n",[197,1939,1940],{"class":199,"line":355},[197,1941,1942],{},"    $email = filter_var($_POST['email'] ?? '', FILTER_SANITIZE_EMAIL);\n",[197,1944,1945],{"class":199,"line":360},[197,1946,1947],{},"    $message = htmlspecialchars($_POST['message'] ?? '');\n",[197,1949,1950],{"class":199,"line":366},[197,1951,296],{"emptyLinePlaceholder":295},[197,1953,1954],{"class":199,"line":379},[197,1955,1956],{},"    // Validate\n",[197,1958,1959],{"class":199,"line":523},[197,1960,1961],{},"    if (empty($name)) $errors[] = \"Nama wajib diisi\";\n",[197,1963,1964],{"class":199,"line":534},[197,1965,1966],{},"    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {\n",[197,1968,1969],{"class":199,"line":539},[197,1970,1971],{},"        $errors[] = \"Email tidak valid\";\n",[197,1973,1974],{"class":199,"line":547},[197,1975,1618],{},[197,1977,1978],{"class":199,"line":557},[197,1979,1980],{},"    if (empty($message)) $errors[] = \"Pesan wajib diisi\";\n",[197,1982,1983],{"class":199,"line":564},[197,1984,296],{"emptyLinePlaceholder":295},[197,1986,1987],{"class":199,"line":574},[197,1988,1989],{},"    // Process jika valid\n",[197,1991,1992],{"class":199,"line":584},[197,1993,1994],{},"    if (empty($errors)) {\n",[197,1996,1997],{"class":199,"line":591},[197,1998,1999],{},"        // Save to database atau kirim email\n",[197,2001,2002],{"class":199,"line":599},[197,2003,2004],{},"        $insert = \"INSERT INTO messages (name, email, message) VALUES (?, ?, ?)\";\n",[197,2006,2007],{"class":199,"line":604},[197,2008,2009],{},"        $stmt = $conn->prepare($insert);\n",[197,2011,2012],{"class":199,"line":612},[197,2013,2014],{},"        $stmt->bind_param(\"sss\", $name, $email, $message);\n",[197,2016,2017],{"class":199,"line":1687},[197,2018,2019],{},"        \n",[197,2021,2022],{"class":199,"line":1693},[197,2023,2024],{},"        if ($stmt->execute()) {\n",[197,2026,2027],{"class":199,"line":1699},[197,2028,2029],{},"            $success = true;\n",[197,2031,2032],{"class":199,"line":1705},[197,2033,2034],{},"        }\n",[197,2036,2037],{"class":199,"line":1711},[197,2038,2039],{},"        $stmt->close();\n",[197,2041,2042],{"class":199,"line":1716},[197,2043,1618],{},[197,2045,2046],{"class":199,"line":1722},[197,2047,957],{},[197,2049,2050],{"class":199,"line":1727},[197,2051,976],{},[197,2053,2054],{"class":199,"line":1732},[197,2055,296],{"emptyLinePlaceholder":295},[197,2057,2058],{"class":199,"line":1738},[197,2059,2060],{},"\u003C!-- View -->\n",[197,2062,2063],{"class":199,"line":1744},[197,2064,2065],{},"\u003C?php if ($success): ?>\n",[197,2067,2068],{"class":199,"line":1749},[197,2069,2070],{},"    \u003Cdiv class=\"alert success\">Pesan berhasil dikirim!\u003C/div>\n",[197,2072,2073],{"class":199,"line":1754},[197,2074,2075],{},"\u003C?php endif; ?>\n",[197,2077,2078],{"class":199,"line":1760},[197,2079,296],{"emptyLinePlaceholder":295},[197,2081,2082],{"class":199,"line":1766},[197,2083,2084],{},"\u003C?php if (!empty($errors)): ?>\n",[197,2086,2087],{"class":199,"line":1772},[197,2088,2089],{},"    \u003Cdiv class=\"alert error\">\n",[197,2091,2092],{"class":199,"line":1778},[197,2093,2094],{},"        \u003C?php foreach ($errors as $error): ?>\n",[197,2096,2097],{"class":199,"line":1783},[197,2098,2099],{},"            \u003Cp>\u003C?php echo $error; ?>\u003C/p>\n",[197,2101,2102],{"class":199,"line":1788},[197,2103,2104],{},"        \u003C?php endforeach; ?>\n",[197,2106,2107],{"class":199,"line":1794},[197,2108,2109],{},"    \u003C/div>\n",[197,2111,2112],{"class":199,"line":1799},[197,2113,2075],{},[197,2115,2116],{"class":199,"line":1804},[197,2117,296],{"emptyLinePlaceholder":295},[197,2119,2120],{"class":199,"line":1809},[197,2121,2122],{},"\u003Cform method=\"POST\">\n",[197,2124,2125],{"class":199,"line":1814},[197,2126,2127],{},"    \u003Cinput type=\"text\" name=\"name\" placeholder=\"Nama Anda\" value=\"\u003C?php echo $name ?? ''; ?>\">\n",[197,2129,2130],{"class":199,"line":1820},[197,2131,2132],{},"    \u003Cinput type=\"email\" name=\"email\" placeholder=\"Email\" value=\"\u003C?php echo $email ?? ''; ?>\">\n",[197,2134,2135],{"class":199,"line":1826},[197,2136,2137],{},"    \u003Ctextarea name=\"message\">\u003C?php echo $message ?? ''; ?>\u003C/textarea>\n",[197,2139,2140],{"class":199,"line":1831},[197,2141,2142],{},"    \u003Cbutton type=\"submit\">Kirim\u003C/button>\n",[197,2144,2145],{"class":199,"line":1837},[197,2146,2147],{},"\u003C/form>\n",[110,2149,2151],{"id":2150},"_8-session-authentication","8. Session & Authentication",[115,2153,2155],{"id":2154},"user-login","User Login",[187,2157,2159],{"className":885,"code":2158,"language":887,"meta":192,"style":192},"\u003C?php\n// app/controllers/login.php\n\nsession_start();\n\nif ($_SERVER['REQUEST_METHOD'] === 'POST') {\n    $username = $_POST['username'] ?? '';\n    $password = $_POST['password'] ?? '';\n\n    if (!empty($username) && !empty($password)) {\n        // Check database\n        $query = \"SELECT id, username, password FROM users WHERE username = ?\";\n        $stmt = $conn->prepare($query);\n        $stmt->bind_param(\"s\", $username);\n        $stmt->execute();\n        $result = $stmt->get_result();\n\n        if ($result->num_rows === 1) {\n            $user = $result->fetch_assoc();\n            \n            // Verify password\n            if (password_verify($password, $user['password'])) {\n                $_SESSION['user_id'] = $user['id'];\n                $_SESSION['username'] = $user['username'];\n                header(\"Location: dashboard.php\");\n                exit;\n            }\n        }\n        $error = \"Username atau password salah\";\n    }\n}\n?>\n",[194,2160,2161,2165,2170,2174,2178,2182,2186,2191,2196,2200,2205,2210,2215,2220,2225,2230,2235,2239,2244,2249,2254,2259,2264,2269,2274,2279,2284,2289,2293,2298,2302,2306],{"__ignoreMap":192},[197,2162,2163],{"class":199,"line":200},[197,2164,894],{},[197,2166,2167],{"class":199,"line":207},[197,2168,2169],{},"// app/controllers/login.php\n",[197,2171,2172],{"class":199,"line":213},[197,2173,296],{"emptyLinePlaceholder":295},[197,2175,2176],{"class":199,"line":219},[197,2177,1286],{},[197,2179,2180],{"class":199,"line":299},[197,2181,296],{"emptyLinePlaceholder":295},[197,2183,2184],{"class":199,"line":305},[197,2185,1927],{},[197,2187,2188],{"class":199,"line":332},[197,2189,2190],{},"    $username = $_POST['username'] ?? '';\n",[197,2192,2193],{"class":199,"line":337},[197,2194,2195],{},"    $password = $_POST['password'] ?? '';\n",[197,2197,2198],{"class":199,"line":343},[197,2199,296],{"emptyLinePlaceholder":295},[197,2201,2202],{"class":199,"line":355},[197,2203,2204],{},"    if (!empty($username) && !empty($password)) {\n",[197,2206,2207],{"class":199,"line":360},[197,2208,2209],{},"        // Check database\n",[197,2211,2212],{"class":199,"line":366},[197,2213,2214],{},"        $query = \"SELECT id, username, password FROM users WHERE username = ?\";\n",[197,2216,2217],{"class":199,"line":379},[197,2218,2219],{},"        $stmt = $conn->prepare($query);\n",[197,2221,2222],{"class":199,"line":523},[197,2223,2224],{},"        $stmt->bind_param(\"s\", $username);\n",[197,2226,2227],{"class":199,"line":534},[197,2228,2229],{},"        $stmt->execute();\n",[197,2231,2232],{"class":199,"line":539},[197,2233,2234],{},"        $result = $stmt->get_result();\n",[197,2236,2237],{"class":199,"line":547},[197,2238,296],{"emptyLinePlaceholder":295},[197,2240,2241],{"class":199,"line":557},[197,2242,2243],{},"        if ($result->num_rows === 1) {\n",[197,2245,2246],{"class":199,"line":564},[197,2247,2248],{},"            $user = $result->fetch_assoc();\n",[197,2250,2251],{"class":199,"line":574},[197,2252,2253],{},"            \n",[197,2255,2256],{"class":199,"line":584},[197,2257,2258],{},"            // Verify password\n",[197,2260,2261],{"class":199,"line":591},[197,2262,2263],{},"            if (password_verify($password, $user['password'])) {\n",[197,2265,2266],{"class":199,"line":599},[197,2267,2268],{},"                $_SESSION['user_id'] = $user['id'];\n",[197,2270,2271],{"class":199,"line":604},[197,2272,2273],{},"                $_SESSION['username'] = $user['username'];\n",[197,2275,2276],{"class":199,"line":612},[197,2277,2278],{},"                header(\"Location: dashboard.php\");\n",[197,2280,2281],{"class":199,"line":1687},[197,2282,2283],{},"                exit;\n",[197,2285,2286],{"class":199,"line":1693},[197,2287,2288],{},"            }\n",[197,2290,2291],{"class":199,"line":1699},[197,2292,2034],{},[197,2294,2295],{"class":199,"line":1705},[197,2296,2297],{},"        $error = \"Username atau password salah\";\n",[197,2299,2300],{"class":199,"line":1711},[197,2301,1618],{},[197,2303,2304],{"class":199,"line":1716},[197,2305,957],{},[197,2307,2308],{"class":199,"line":1722},[197,2309,976],{},[115,2311,2313],{"id":2312},"protect-pages","Protect Pages",[187,2315,2317],{"className":885,"code":2316,"language":887,"meta":192,"style":192},"\u003C?php\n// Check if user logged in\nsession_start();\nif (!isset($_SESSION['user_id'])) {\n    header(\"Location: login.php\");\n    exit;\n}\n?>\n",[194,2318,2319,2323,2328,2332,2337,2342,2347,2351],{"__ignoreMap":192},[197,2320,2321],{"class":199,"line":200},[197,2322,894],{},[197,2324,2325],{"class":199,"line":207},[197,2326,2327],{},"// Check if user logged in\n",[197,2329,2330],{"class":199,"line":213},[197,2331,1286],{},[197,2333,2334],{"class":199,"line":219},[197,2335,2336],{},"if (!isset($_SESSION['user_id'])) {\n",[197,2338,2339],{"class":199,"line":299},[197,2340,2341],{},"    header(\"Location: login.php\");\n",[197,2343,2344],{"class":199,"line":305},[197,2345,2346],{},"    exit;\n",[197,2348,2349],{"class":199,"line":332},[197,2350,957],{},[197,2352,2353],{"class":199,"line":337},[197,2354,976],{},[115,2356,2358],{"id":2357},"logout","Logout",[187,2360,2362],{"className":885,"code":2361,"language":887,"meta":192,"style":192},"\u003C?php\nsession_start();\nsession_destroy();\nheader(\"Location: index.php\");\nexit;\n?>\n",[194,2363,2364,2368,2372,2377,2382,2387],{"__ignoreMap":192},[197,2365,2366],{"class":199,"line":200},[197,2367,894],{},[197,2369,2370],{"class":199,"line":207},[197,2371,1286],{},[197,2373,2374],{"class":199,"line":213},[197,2375,2376],{},"session_destroy();\n",[197,2378,2379],{"class":199,"line":219},[197,2380,2381],{},"header(\"Location: index.php\");\n",[197,2383,2384],{"class":199,"line":299},[197,2385,2386],{},"exit;\n",[197,2388,2389],{"class":199,"line":305},[197,2390,976],{},[110,2392,2394],{"id":2393},"_9-restful-api-dengan-php","9. RESTful API dengan PHP",[115,2396,2398],{"id":2397},"api-endpoints","API Endpoints",[187,2400,2402],{"className":885,"code":2401,"language":887,"meta":192,"style":192},"\u003C?php\n// api/users.php\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$id = $_GET['id'] ?? null;\n\nrequire_once '../database/config.php';\n\nswitch ($method) {\n    case 'GET':\n        if ($id) {\n            // GET single user\n            $query = \"SELECT * FROM users WHERE id = ?\";\n            $stmt = $conn->prepare($query);\n            $stmt->bind_param(\"i\", $id);\n        } else {\n            // GET all users\n            $query = \"SELECT * FROM users\";\n            $stmt = $conn->prepare($query);\n        }\n        \n        $stmt->execute();\n        $result = $stmt->get_result();\n        $data = $result->fetch_all(MYSQLI_ASSOC);\n        \n        echo json_encode(['status' => 'success', 'data' => $data]);\n        break;\n\n    case 'POST':\n        // CREATE user\n        $data = json_decode(file_get_contents('php://input'), true);\n        $query = \"INSERT INTO users (username, email, password) VALUES (?, ?, ?)\";\n        $stmt = $conn->prepare($query);\n        $stmt->bind_param(\"sss\", $data['username'], $data['email'], \n                         password_hash($data['password'], PASSWORD_DEFAULT));\n        \n        if ($stmt->execute()) {\n            echo json_encode(['status' => 'success', 'id' => $conn->insert_id]);\n        } else {\n            echo json_encode(['status' => 'error', 'message' => $stmt->error]);\n        }\n        break;\n\n    case 'PUT':\n        // UPDATE user\n        $data = json_decode(file_get_contents('php://input'), true);\n        $query = \"UPDATE users SET username = ? WHERE id = ?\";\n        $stmt = $conn->prepare($query);\n        $stmt->bind_param(\"si\", $data['username'], $id);\n        \n        if ($stmt->execute()) {\n            echo json_encode(['status' => 'success']);\n        } else {\n            echo json_encode(['status' => 'error', 'message' => $stmt->error]);\n        }\n        break;\n\n    case 'DELETE':\n        // DELETE user\n        $query = \"DELETE FROM users WHERE id = ?\";\n        $stmt = $conn->prepare($query);\n        $stmt->bind_param(\"i\", $id);\n        \n        if ($stmt->execute()) {\n            echo json_encode(['status' => 'success']);\n        } else {\n            echo json_encode(['status' => 'error', 'message' => $stmt->error]);\n        }\n        break;\n}\n?>\n",[194,2403,2404,2408,2413,2418,2422,2427,2432,2436,2441,2445,2450,2455,2460,2465,2470,2475,2480,2485,2490,2495,2499,2503,2507,2511,2515,2520,2524,2529,2534,2538,2543,2548,2553,2558,2562,2567,2572,2576,2580,2585,2589,2594,2598,2602,2606,2611,2616,2620,2625,2629,2634,2638,2642,2647,2651,2655,2659,2663,2667,2672,2677,2682,2687,2693,2698,2703,2708,2713,2718,2723,2728,2733],{"__ignoreMap":192},[197,2405,2406],{"class":199,"line":200},[197,2407,894],{},[197,2409,2410],{"class":199,"line":207},[197,2411,2412],{},"// api/users.php\n",[197,2414,2415],{"class":199,"line":213},[197,2416,2417],{},"header('Content-Type: application/json');\n",[197,2419,2420],{"class":199,"line":219},[197,2421,296],{"emptyLinePlaceholder":295},[197,2423,2424],{"class":199,"line":299},[197,2425,2426],{},"$method = $_SERVER['REQUEST_METHOD'];\n",[197,2428,2429],{"class":199,"line":305},[197,2430,2431],{},"$id = $_GET['id'] ?? null;\n",[197,2433,2434],{"class":199,"line":332},[197,2435,296],{"emptyLinePlaceholder":295},[197,2437,2438],{"class":199,"line":337},[197,2439,2440],{},"require_once '../database/config.php';\n",[197,2442,2443],{"class":199,"line":343},[197,2444,296],{"emptyLinePlaceholder":295},[197,2446,2447],{"class":199,"line":355},[197,2448,2449],{},"switch ($method) {\n",[197,2451,2452],{"class":199,"line":360},[197,2453,2454],{},"    case 'GET':\n",[197,2456,2457],{"class":199,"line":366},[197,2458,2459],{},"        if ($id) {\n",[197,2461,2462],{"class":199,"line":379},[197,2463,2464],{},"            // GET single user\n",[197,2466,2467],{"class":199,"line":523},[197,2468,2469],{},"            $query = \"SELECT * FROM users WHERE id = ?\";\n",[197,2471,2472],{"class":199,"line":534},[197,2473,2474],{},"            $stmt = $conn->prepare($query);\n",[197,2476,2477],{"class":199,"line":539},[197,2478,2479],{},"            $stmt->bind_param(\"i\", $id);\n",[197,2481,2482],{"class":199,"line":547},[197,2483,2484],{},"        } else {\n",[197,2486,2487],{"class":199,"line":557},[197,2488,2489],{},"            // GET all users\n",[197,2491,2492],{"class":199,"line":564},[197,2493,2494],{},"            $query = \"SELECT * FROM users\";\n",[197,2496,2497],{"class":199,"line":574},[197,2498,2474],{},[197,2500,2501],{"class":199,"line":584},[197,2502,2034],{},[197,2504,2505],{"class":199,"line":591},[197,2506,2019],{},[197,2508,2509],{"class":199,"line":599},[197,2510,2229],{},[197,2512,2513],{"class":199,"line":604},[197,2514,2234],{},[197,2516,2517],{"class":199,"line":612},[197,2518,2519],{},"        $data = $result->fetch_all(MYSQLI_ASSOC);\n",[197,2521,2522],{"class":199,"line":1687},[197,2523,2019],{},[197,2525,2526],{"class":199,"line":1693},[197,2527,2528],{},"        echo json_encode(['status' => 'success', 'data' => $data]);\n",[197,2530,2531],{"class":199,"line":1699},[197,2532,2533],{},"        break;\n",[197,2535,2536],{"class":199,"line":1705},[197,2537,296],{"emptyLinePlaceholder":295},[197,2539,2540],{"class":199,"line":1711},[197,2541,2542],{},"    case 'POST':\n",[197,2544,2545],{"class":199,"line":1716},[197,2546,2547],{},"        // CREATE user\n",[197,2549,2550],{"class":199,"line":1722},[197,2551,2552],{},"        $data = json_decode(file_get_contents('php://input'), true);\n",[197,2554,2555],{"class":199,"line":1727},[197,2556,2557],{},"        $query = \"INSERT INTO users (username, email, password) VALUES (?, ?, ?)\";\n",[197,2559,2560],{"class":199,"line":1732},[197,2561,2219],{},[197,2563,2564],{"class":199,"line":1738},[197,2565,2566],{},"        $stmt->bind_param(\"sss\", $data['username'], $data['email'], \n",[197,2568,2569],{"class":199,"line":1744},[197,2570,2571],{},"                         password_hash($data['password'], PASSWORD_DEFAULT));\n",[197,2573,2574],{"class":199,"line":1749},[197,2575,2019],{},[197,2577,2578],{"class":199,"line":1754},[197,2579,2024],{},[197,2581,2582],{"class":199,"line":1760},[197,2583,2584],{},"            echo json_encode(['status' => 'success', 'id' => $conn->insert_id]);\n",[197,2586,2587],{"class":199,"line":1766},[197,2588,2484],{},[197,2590,2591],{"class":199,"line":1772},[197,2592,2593],{},"            echo json_encode(['status' => 'error', 'message' => $stmt->error]);\n",[197,2595,2596],{"class":199,"line":1778},[197,2597,2034],{},[197,2599,2600],{"class":199,"line":1783},[197,2601,2533],{},[197,2603,2604],{"class":199,"line":1788},[197,2605,296],{"emptyLinePlaceholder":295},[197,2607,2608],{"class":199,"line":1794},[197,2609,2610],{},"    case 'PUT':\n",[197,2612,2613],{"class":199,"line":1799},[197,2614,2615],{},"        // UPDATE user\n",[197,2617,2618],{"class":199,"line":1804},[197,2619,2552],{},[197,2621,2622],{"class":199,"line":1809},[197,2623,2624],{},"        $query = \"UPDATE users SET username = ? WHERE id = ?\";\n",[197,2626,2627],{"class":199,"line":1814},[197,2628,2219],{},[197,2630,2631],{"class":199,"line":1820},[197,2632,2633],{},"        $stmt->bind_param(\"si\", $data['username'], $id);\n",[197,2635,2636],{"class":199,"line":1826},[197,2637,2019],{},[197,2639,2640],{"class":199,"line":1831},[197,2641,2024],{},[197,2643,2644],{"class":199,"line":1837},[197,2645,2646],{},"            echo json_encode(['status' => 'success']);\n",[197,2648,2649],{"class":199,"line":1843},[197,2650,2484],{},[197,2652,2653],{"class":199,"line":1849},[197,2654,2593],{},[197,2656,2657],{"class":199,"line":1854},[197,2658,2034],{},[197,2660,2661],{"class":199,"line":1859},[197,2662,2533],{},[197,2664,2665],{"class":199,"line":1865},[197,2666,296],{"emptyLinePlaceholder":295},[197,2668,2669],{"class":199,"line":1870},[197,2670,2671],{},"    case 'DELETE':\n",[197,2673,2674],{"class":199,"line":1875},[197,2675,2676],{},"        // DELETE user\n",[197,2678,2679],{"class":199,"line":1880},[197,2680,2681],{},"        $query = \"DELETE FROM users WHERE id = ?\";\n",[197,2683,2685],{"class":199,"line":2684},62,[197,2686,2219],{},[197,2688,2690],{"class":199,"line":2689},63,[197,2691,2692],{},"        $stmt->bind_param(\"i\", $id);\n",[197,2694,2696],{"class":199,"line":2695},64,[197,2697,2019],{},[197,2699,2701],{"class":199,"line":2700},65,[197,2702,2024],{},[197,2704,2706],{"class":199,"line":2705},66,[197,2707,2646],{},[197,2709,2711],{"class":199,"line":2710},67,[197,2712,2484],{},[197,2714,2716],{"class":199,"line":2715},68,[197,2717,2593],{},[197,2719,2721],{"class":199,"line":2720},69,[197,2722,2034],{},[197,2724,2726],{"class":199,"line":2725},70,[197,2727,2533],{},[197,2729,2731],{"class":199,"line":2730},71,[197,2732,957],{},[197,2734,2736],{"class":199,"line":2735},72,[197,2737,976],{},[110,2739,2741],{"id":2740},"_10-security-best-practices","10. Security Best Practices",[115,2743,2745],{"id":2744},"prevent-sql-injection","Prevent SQL Injection",[187,2747,2749],{"className":885,"code":2748,"language":887,"meta":192,"style":192},"// ✗ TIDAK AMAN - SQL Injection risk\n$query = \"SELECT * FROM users WHERE username = '\" . $_POST['username'] . \"'\";\n\n// ✓ AMAN - Prepared statements\n$query = \"SELECT * FROM users WHERE username = ?\";\n$stmt = $conn->prepare($query);\n$stmt->bind_param(\"s\", $_POST['username']);\n$stmt->execute();\n",[194,2750,2751,2756,2761,2765,2770,2775,2780,2785],{"__ignoreMap":192},[197,2752,2753],{"class":199,"line":200},[197,2754,2755],{},"// ✗ TIDAK AMAN - SQL Injection risk\n",[197,2757,2758],{"class":199,"line":207},[197,2759,2760],{},"$query = \"SELECT * FROM users WHERE username = '\" . $_POST['username'] . \"'\";\n",[197,2762,2763],{"class":199,"line":213},[197,2764,296],{"emptyLinePlaceholder":295},[197,2766,2767],{"class":199,"line":219},[197,2768,2769],{},"// ✓ AMAN - Prepared statements\n",[197,2771,2772],{"class":199,"line":299},[197,2773,2774],{},"$query = \"SELECT * FROM users WHERE username = ?\";\n",[197,2776,2777],{"class":199,"line":305},[197,2778,2779],{},"$stmt = $conn->prepare($query);\n",[197,2781,2782],{"class":199,"line":332},[197,2783,2784],{},"$stmt->bind_param(\"s\", $_POST['username']);\n",[197,2786,2787],{"class":199,"line":337},[197,2788,2789],{},"$stmt->execute();\n",[115,2791,2793],{"id":2792},"prevent-xss-cross-site-scripting","Prevent XSS (Cross-Site Scripting)",[187,2795,2797],{"className":885,"code":2796,"language":887,"meta":192,"style":192},"// ✗ TIDAK AMAN\necho \"Welcome \" . $_GET['name'];\n\n// ✓ AMAN - Escape output\necho \"Welcome \" . htmlspecialchars($_GET['name']);\n",[194,2798,2799,2804,2809,2813,2818],{"__ignoreMap":192},[197,2800,2801],{"class":199,"line":200},[197,2802,2803],{},"// ✗ TIDAK AMAN\n",[197,2805,2806],{"class":199,"line":207},[197,2807,2808],{},"echo \"Welcome \" . $_GET['name'];\n",[197,2810,2811],{"class":199,"line":213},[197,2812,296],{"emptyLinePlaceholder":295},[197,2814,2815],{"class":199,"line":219},[197,2816,2817],{},"// ✓ AMAN - Escape output\n",[197,2819,2820],{"class":199,"line":299},[197,2821,2822],{},"echo \"Welcome \" . htmlspecialchars($_GET['name']);\n",[115,2824,2826],{"id":2825},"prevent-csrf-cross-site-request-forgery","Prevent CSRF (Cross-Site Request Forgery)",[187,2828,2830],{"className":885,"code":2829,"language":887,"meta":192,"style":192},"// Generate token\nif (empty($_SESSION['csrf_token'])) {\n    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n}\n\n// Add to form\necho '\u003Cinput type=\"hidden\" name=\"csrf_token\" value=\"' . $_SESSION['csrf_token'] . '\">';\n\n// Verify token\nif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {\n    die(\"CSRF token mismatch\");\n}\n",[194,2831,2832,2837,2842,2847,2851,2855,2860,2865,2869,2874,2879,2884],{"__ignoreMap":192},[197,2833,2834],{"class":199,"line":200},[197,2835,2836],{},"// Generate token\n",[197,2838,2839],{"class":199,"line":207},[197,2840,2841],{},"if (empty($_SESSION['csrf_token'])) {\n",[197,2843,2844],{"class":199,"line":213},[197,2845,2846],{},"    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n",[197,2848,2849],{"class":199,"line":219},[197,2850,957],{},[197,2852,2853],{"class":199,"line":299},[197,2854,296],{"emptyLinePlaceholder":295},[197,2856,2857],{"class":199,"line":305},[197,2858,2859],{},"// Add to form\n",[197,2861,2862],{"class":199,"line":332},[197,2863,2864],{},"echo '\u003Cinput type=\"hidden\" name=\"csrf_token\" value=\"' . $_SESSION['csrf_token'] . '\">';\n",[197,2866,2867],{"class":199,"line":337},[197,2868,296],{"emptyLinePlaceholder":295},[197,2870,2871],{"class":199,"line":343},[197,2872,2873],{},"// Verify token\n",[197,2875,2876],{"class":199,"line":355},[197,2877,2878],{},"if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {\n",[197,2880,2881],{"class":199,"line":360},[197,2882,2883],{},"    die(\"CSRF token mismatch\");\n",[197,2885,2886],{"class":199,"line":366},[197,2887,957],{},[115,2889,2891],{"id":2890},"secure-password-storage","Secure Password Storage",[187,2893,2895],{"className":885,"code":2894,"language":887,"meta":192,"style":192},"// Hash password\n$password = password_hash($_POST['password'], PASSWORD_BCRYPT);\n\n// Verify password\nif (password_verify($_POST['password'], $hashed_password)) {\n    // Password correct\n}\n",[194,2896,2897,2902,2907,2911,2916,2921,2926],{"__ignoreMap":192},[197,2898,2899],{"class":199,"line":200},[197,2900,2901],{},"// Hash password\n",[197,2903,2904],{"class":199,"line":207},[197,2905,2906],{},"$password = password_hash($_POST['password'], PASSWORD_BCRYPT);\n",[197,2908,2909],{"class":199,"line":213},[197,2910,296],{"emptyLinePlaceholder":295},[197,2912,2913],{"class":199,"line":219},[197,2914,2915],{},"// Verify password\n",[197,2917,2918],{"class":199,"line":299},[197,2919,2920],{},"if (password_verify($_POST['password'], $hashed_password)) {\n",[197,2922,2923],{"class":199,"line":305},[197,2924,2925],{},"    // Password correct\n",[197,2927,2928],{"class":199,"line":332},[197,2929,957],{},[110,2931,2933],{"id":2932},"_11-deployment-ke-production","11. Deployment ke Production",[115,2935,2937],{"id":2936},"deploy-ke-shared-hosting-cpanel","Deploy ke Shared Hosting (cPanel)",[187,2939,2941],{"className":189,"code":2940,"language":191,"meta":192,"style":192},"# 1. FTP ke server\n# 2. Upload semua files ke public_html\n# 3. Upload database dump via phpMyAdmin\n# 4. Edit config.php dengan database credentials production\n# 5. Set folder permissions: chmod 755 folders, 644 files\n# 6. Website live\n",[194,2942,2943,2948,2953,2958,2963,2968],{"__ignoreMap":192},[197,2944,2945],{"class":199,"line":200},[197,2946,2947],{"class":203},"# 1. FTP ke server\n",[197,2949,2950],{"class":199,"line":207},[197,2951,2952],{"class":203},"# 2. Upload semua files ke public_html\n",[197,2954,2955],{"class":199,"line":213},[197,2956,2957],{"class":203},"# 3. Upload database dump via phpMyAdmin\n",[197,2959,2960],{"class":199,"line":219},[197,2961,2962],{"class":203},"# 4. Edit config.php dengan database credentials production\n",[197,2964,2965],{"class":199,"line":299},[197,2966,2967],{"class":203},"# 5. Set folder permissions: chmod 755 folders, 644 files\n",[197,2969,2970],{"class":199,"line":305},[197,2971,2972],{"class":203},"# 6. Website live\n",[115,2974,2976],{"id":2975},"deploy-ke-vps","Deploy ke VPS",[187,2978,2980],{"className":189,"code":2979,"language":191,"meta":192,"style":192},"# SSH ke server\nssh root@server_ip\n\n# Install dependencies\napt-get update\napt-get install apache2 php-8.1 php-mysql mysql-server\n\n# Clone repository\ncd /var/www\ngit clone your-repo-url project\n\n# Setup database\nmysql -u root -p \u003C project/database/schema.sql\n\n# Set permissions\nchmod -R 755 project/\nchmod -R 777 project/uploads project/cache project/logs\n\n# Enable mod_rewrite untuk .htaccess\na2enmod rewrite\nsystemctl restart apache2\n",[194,2981,2982,2987,2995,2999,3004,3011,3027,3031,3036,3045,3059,3063,3068,3083,3087,3092,3103,3120,3124,3129,3137],{"__ignoreMap":192},[197,2983,2984],{"class":199,"line":200},[197,2985,2986],{"class":203},"# SSH ke server\n",[197,2988,2989,2992],{"class":199,"line":207},[197,2990,2991],{"class":270},"ssh",[197,2993,2994],{"class":274}," root@server_ip\n",[197,2996,2997],{"class":199,"line":213},[197,2998,296],{"emptyLinePlaceholder":295},[197,3000,3001],{"class":199,"line":219},[197,3002,3003],{"class":203},"# Install dependencies\n",[197,3005,3006,3009],{"class":199,"line":299},[197,3007,3008],{"class":270},"apt-get",[197,3010,278],{"class":274},[197,3012,3013,3015,3017,3020,3023,3025],{"class":199,"line":305},[197,3014,3008],{"class":270},[197,3016,287],{"class":274},[197,3018,3019],{"class":274}," apache2",[197,3021,3022],{"class":274}," php-8.1",[197,3024,320],{"class":274},[197,3026,352],{"class":274},[197,3028,3029],{"class":199,"line":332},[197,3030,296],{"emptyLinePlaceholder":295},[197,3032,3033],{"class":199,"line":337},[197,3034,3035],{"class":203},"# Clone repository\n",[197,3037,3038,3042],{"class":199,"line":343},[197,3039,3041],{"class":3040},"s2Zo4","cd",[197,3043,3044],{"class":274}," /var/www\n",[197,3046,3047,3050,3053,3056],{"class":199,"line":355},[197,3048,3049],{"class":270},"git",[197,3051,3052],{"class":274}," clone",[197,3054,3055],{"class":274}," your-repo-url",[197,3057,3058],{"class":274}," project\n",[197,3060,3061],{"class":199,"line":360},[197,3062,296],{"emptyLinePlaceholder":295},[197,3064,3065],{"class":199,"line":366},[197,3066,3067],{"class":203},"# Setup database\n",[197,3069,3070,3072,3074,3076,3078,3080],{"class":199,"line":379},[197,3071,995],{"class":270},[197,3073,998],{"class":274},[197,3075,1001],{"class":274},[197,3077,1251],{"class":274},[197,3079,1256],{"class":413},[197,3081,3082],{"class":274}," project/database/schema.sql\n",[197,3084,3085],{"class":199,"line":523},[197,3086,296],{"emptyLinePlaceholder":295},[197,3088,3089],{"class":199,"line":534},[197,3090,3091],{"class":203},"# Set permissions\n",[197,3093,3094,3096,3098,3100],{"class":199,"line":539},[197,3095,831],{"class":270},[197,3097,834],{"class":274},[197,3099,838],{"class":837},[197,3101,3102],{"class":274}," project/\n",[197,3104,3105,3107,3109,3111,3114,3117],{"class":199,"line":547},[197,3106,831],{"class":270},[197,3108,834],{"class":274},[197,3110,850],{"class":837},[197,3112,3113],{"class":274}," project/uploads",[197,3115,3116],{"class":274}," project/cache",[197,3118,3119],{"class":274}," project/logs\n",[197,3121,3122],{"class":199,"line":557},[197,3123,296],{"emptyLinePlaceholder":295},[197,3125,3126],{"class":199,"line":564},[197,3127,3128],{"class":203},"# Enable mod_rewrite untuk .htaccess\n",[197,3130,3131,3134],{"class":199,"line":574},[197,3132,3133],{"class":270},"a2enmod",[197,3135,3136],{"class":274}," rewrite\n",[197,3138,3139,3142,3145],{"class":199,"line":584},[197,3140,3141],{"class":270},"systemctl",[197,3143,3144],{"class":274}," restart",[197,3146,290],{"class":274},[115,3148,3150],{"id":3149},"htaccess-untuk-clean-urls",".htaccess untuk Clean URLs",[187,3152,3156],{"className":3153,"code":3154,"language":3155,"meta":192,"style":192},"language-apache shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CIfModule mod_rewrite.c>\n    RewriteEngine On\n    RewriteBase /\n\n    # Remove .php extension\n    RewriteCond %{REQUEST_FILENAME} !-f\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?page=$1 [QSA,L]\n\u003C/IfModule>\n","apache",[194,3157,3158,3163,3168,3173,3177,3182,3187,3192,3197],{"__ignoreMap":192},[197,3159,3160],{"class":199,"line":200},[197,3161,3162],{},"\u003CIfModule mod_rewrite.c>\n",[197,3164,3165],{"class":199,"line":207},[197,3166,3167],{},"    RewriteEngine On\n",[197,3169,3170],{"class":199,"line":213},[197,3171,3172],{},"    RewriteBase /\n",[197,3174,3175],{"class":199,"line":219},[197,3176,296],{"emptyLinePlaceholder":295},[197,3178,3179],{"class":199,"line":299},[197,3180,3181],{},"    # Remove .php extension\n",[197,3183,3184],{"class":199,"line":305},[197,3185,3186],{},"    RewriteCond %{REQUEST_FILENAME} !-f\n",[197,3188,3189],{"class":199,"line":332},[197,3190,3191],{},"    RewriteCond %{REQUEST_FILENAME} !-d\n",[197,3193,3194],{"class":199,"line":337},[197,3195,3196],{},"    RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?page=$1 [QSA,L]\n",[197,3198,3199],{"class":199,"line":343},[197,3200,3201],{},"\u003C/IfModule>\n",[110,3203,3205],{"id":3204},"_12-performance-optimization","12. Performance Optimization",[115,3207,3209],{"id":3208},"enable-caching","Enable Caching",[187,3211,3213],{"className":885,"code":3212,"language":887,"meta":192,"style":192},"\u003C?php\n// Simple file-based caching\n$cache_file = 'cache/' . md5($_SERVER['REQUEST_URI']) . '.cache';\n$cache_time = 3600; // 1 hour\n\nif (file_exists($cache_file) && time() - filemtime($cache_file) \u003C $cache_time) {\n    readfile($cache_file);\n    exit;\n}\n\n// Generate content\nob_start();\n// Your content here\n\n// Save to cache\n$content = ob_get_clean();\nfile_put_contents($cache_file, $content);\necho $content;\n?>\n",[194,3214,3215,3219,3224,3229,3234,3238,3243,3248,3252,3256,3260,3265,3270,3275,3279,3284,3289,3294,3299],{"__ignoreMap":192},[197,3216,3217],{"class":199,"line":200},[197,3218,894],{},[197,3220,3221],{"class":199,"line":207},[197,3222,3223],{},"// Simple file-based caching\n",[197,3225,3226],{"class":199,"line":213},[197,3227,3228],{},"$cache_file = 'cache/' . md5($_SERVER['REQUEST_URI']) . '.cache';\n",[197,3230,3231],{"class":199,"line":219},[197,3232,3233],{},"$cache_time = 3600; // 1 hour\n",[197,3235,3236],{"class":199,"line":299},[197,3237,296],{"emptyLinePlaceholder":295},[197,3239,3240],{"class":199,"line":305},[197,3241,3242],{},"if (file_exists($cache_file) && time() - filemtime($cache_file) \u003C $cache_time) {\n",[197,3244,3245],{"class":199,"line":332},[197,3246,3247],{},"    readfile($cache_file);\n",[197,3249,3250],{"class":199,"line":337},[197,3251,2346],{},[197,3253,3254],{"class":199,"line":343},[197,3255,957],{},[197,3257,3258],{"class":199,"line":355},[197,3259,296],{"emptyLinePlaceholder":295},[197,3261,3262],{"class":199,"line":360},[197,3263,3264],{},"// Generate content\n",[197,3266,3267],{"class":199,"line":366},[197,3268,3269],{},"ob_start();\n",[197,3271,3272],{"class":199,"line":379},[197,3273,3274],{},"// Your content here\n",[197,3276,3277],{"class":199,"line":523},[197,3278,296],{"emptyLinePlaceholder":295},[197,3280,3281],{"class":199,"line":534},[197,3282,3283],{},"// Save to cache\n",[197,3285,3286],{"class":199,"line":539},[197,3287,3288],{},"$content = ob_get_clean();\n",[197,3290,3291],{"class":199,"line":547},[197,3292,3293],{},"file_put_contents($cache_file, $content);\n",[197,3295,3296],{"class":199,"line":557},[197,3297,3298],{},"echo $content;\n",[197,3300,3301],{"class":199,"line":564},[197,3302,976],{},[115,3304,3306],{"id":3305},"database-optimization","Database Optimization",[187,3308,3310],{"className":885,"code":3309,"language":887,"meta":192,"style":192},"// Add indexes\nCREATE INDEX idx_username ON users(username);\nCREATE INDEX idx_email ON users(email);\n",[194,3311,3312,3317,3322],{"__ignoreMap":192},[197,3313,3314],{"class":199,"line":200},[197,3315,3316],{},"// Add indexes\n",[197,3318,3319],{"class":199,"line":207},[197,3320,3321],{},"CREATE INDEX idx_username ON users(username);\n",[197,3323,3324],{"class":199,"line":213},[197,3325,3326],{},"CREATE INDEX idx_email ON users(email);\n",[110,3328,3330],{"id":3329},"_13-troubleshooting","13. Troubleshooting",[115,3332,3334],{"id":3333},"fatal-error-call-to-undefined-function","\"Fatal error: Call to undefined function\"",[120,3336,3337,3340],{},[123,3338,3339],{},"Check if file included correctly",[123,3341,3342],{},"Verify function name spelling",[115,3344,3346],{"id":3345},"mysql-connection-failed","\"MySQL connection failed\"",[120,3348,3349,3352,3355],{},[123,3350,3351],{},"Verify database credentials in config.php",[123,3353,3354],{},"Check if MySQL server running",[123,3356,3357],{},"Verify database exists",[115,3359,3361],{"id":3360},"session-not-working","Session not working",[120,3363,3364,3371,3374],{},[123,3365,3366,3367,3370],{},"Check ",[194,3368,3369],{},"session_start()"," called at top",[123,3372,3373],{},"Verify cookies enabled",[123,3375,3376],{},"Check tmp folder permissions",[115,3378,3380],{"id":3379},"_404-errors-on-htaccess","404 errors on .htaccess",[120,3382,3383,3389,3392],{},[123,3384,3385,3386],{},"Check mod_rewrite enabled: ",[194,3387,3388],{},"a2enmod rewrite",[123,3390,3391],{},"Verify .htaccess syntax",[123,3393,3394,3395],{},"Restart Apache: ",[194,3396,3397],{},"systemctl restart apache2",[3399,3400],"hr",{},[106,3402,3403],{},[126,3404,3405],{},"Resources:",[120,3407,3408,3415,3422],{},[123,3409,3410],{},[652,3411,3414],{"href":3412,"rel":3413},"https://www.php.net",[656],"PHP.net Official",[123,3416,3417],{},[652,3418,3421],{"href":3419,"rel":3420},"https://dev.mysql.com/doc",[656],"MySQL Documentation",[123,3423,3424],{},[652,3425,3428],{"href":3426,"rel":3427},"https://owasp.org",[656],"OWASP Security Guidelines",[3430,3431,3432],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":192,"searchDepth":200,"depth":207,"links":3434},[3435,3439,3445,3449,3455,3460,3463,3466,3471,3474,3480,3485,3489],{"id":112,"depth":207,"text":113,"children":3436},[3437,3438],{"id":117,"depth":213,"text":118},{"id":156,"depth":213,"text":157},{"id":180,"depth":207,"text":181,"children":3440},[3441,3442,3443,3444],{"id":184,"depth":213,"text":185},{"id":225,"depth":213,"text":226},{"id":254,"depth":213,"text":255},{"id":391,"depth":213,"text":392},{"id":636,"depth":207,"text":637,"children":3446},[3447,3448],{"id":640,"depth":213,"text":641},{"id":746,"depth":213,"text":747},{"id":770,"depth":207,"text":771,"children":3450},[3451,3452,3453,3454],{"id":774,"depth":213,"text":775},{"id":862,"depth":213,"text":863},{"id":874,"depth":213,"text":875},{"id":979,"depth":213,"text":980},{"id":1262,"depth":207,"text":1263,"children":3456},[3457,3458,3459],{"id":1266,"depth":213,"text":1267},{"id":1391,"depth":213,"text":1392},{"id":1504,"depth":213,"text":1505},{"id":1556,"depth":207,"text":1557,"children":3461},[3462],{"id":1560,"depth":213,"text":1561},{"id":1885,"depth":207,"text":1886,"children":3464},[3465],{"id":1889,"depth":213,"text":1890},{"id":2150,"depth":207,"text":2151,"children":3467},[3468,3469,3470],{"id":2154,"depth":213,"text":2155},{"id":2312,"depth":213,"text":2313},{"id":2357,"depth":213,"text":2358},{"id":2393,"depth":207,"text":2394,"children":3472},[3473],{"id":2397,"depth":213,"text":2398},{"id":2740,"depth":207,"text":2741,"children":3475},[3476,3477,3478,3479],{"id":2744,"depth":213,"text":2745},{"id":2792,"depth":213,"text":2793},{"id":2825,"depth":213,"text":2826},{"id":2890,"depth":213,"text":2891},{"id":2932,"depth":207,"text":2933,"children":3481},[3482,3483,3484],{"id":2936,"depth":213,"text":2937},{"id":2975,"depth":213,"text":2976},{"id":3149,"depth":213,"text":3150},{"id":3204,"depth":207,"text":3205,"children":3486},[3487,3488],{"id":3208,"depth":213,"text":3209},{"id":3305,"depth":213,"text":3306},{"id":3329,"depth":207,"text":3330,"children":3490},[3491,3492,3493,3494],{"id":3333,"depth":213,"text":3334},{"id":3345,"depth":213,"text":3346},{"id":3360,"depth":213,"text":3361},{"id":3379,"depth":213,"text":3380},"Tutorial lengkap setup PHP website dari download template, konfigurasi database, development hingga deployment ke server production","md",null,{},{"icon":60},{"title":84,"description":3495},"Stjg7g7nXvAf2SV5prEMjixAu_sOlqRaZ5nwPySQZ3w",[3503,3505],{"title":79,"path":80,"stem":81,"description":3504,"icon":82,"children":-1},"Panduan komprehensif setup untuk React, Next.js, Laravel, PHP, dan HTML/CSS dari awal hingga production ready",{"title":88,"path":89,"stem":90,"description":3506,"icon":60,"children":-1},"Template master untuk membuat dokumentasi produk lengkap dengan panduan step-by-step",1763121032230]