Upload these PHP files to qrcode.cosmeticexim.com — fully pre-configured for your domain.
<?php
// FILE: compus-api/index.php
// Upload to: qrcode.cosmeticexim.com/compus-api/index.php
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━define('DB_HOST', 'localhost'); // Your cPanel MySQL hostdefine('DB_NAME', 'cosmetic_compusqr'); // Database name (create in cPanel)define('DB_USER', 'cosmetic_qruser'); // DB usernamedefine('DB_PASS', 'YourStrongPassword!'); // DB passworddefine('API_KEY', 'cexim-qr-2026-secret'); // Paste same key in COMPUS QR settingsheader('Content-Type: application/json');
header('Access-Control-Allow-Origin: https://qrcode.cosmeticexim.com');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: X-API-Key, Content-Type');
if($_SERVER['REQUEST_METHOD']==='OPTIONS'){http_response_code(200);exit();}
$key=$_SERVER['HTTP_X_API_KEY']??'';
if($key!==API_KEY){http_response_code(401);echojson_encode(['error'=>'Unauthorized']);exit();}
try{
$pdo=newPDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4",DB_USER,DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(Exception $e){http_response_code(500);echojson_encode(['error'=>'DB connection failed']);exit();}
$method=$_SERVER['REQUEST_METHOD'];
$path=trim($_SERVER['PATH_INFO']??'/','/');
$parts=explode('/',$path);
$resource=$parts[0]??'';
$id=$parts[1]??null;
$body=json_decode(file_get_contents('php://input'),true)??[];
switch($resource){
case'assets':
if($method=='GET'&&!$id){
$s=$pdo->query('SELECT * FROM assets ORDER BY created_at DESC');
echojson_encode(['data'=>$s->fetchAll(PDO::FETCH_ASSOC),'count'=>$s->rowCount()]);
}elseif($method=='GET'&&$id){
$s=$pdo->prepare('SELECT * FROM assets WHERE serial=?');
$s->execute([$id]);echojson_encode($s->fetch(PDO::FETCH_ASSOC));
}elseif($method=='POST'){
$s=$pdo->prepare('INSERT INTO assets (serial,name,category,manufacturer,model,location,url,notes,status) VALUES (?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE name=VALUES(name),updated_at=NOW()');
$s->execute([@$body['serial'],@$body['name'],@$body['category'],@$body['manufacturer'],@$body['model'],@$body['location'],@$body['url'],@$body['notes'],'Active']);
echojson_encode(['success'=>true]);
}break;
case'reports':
if($method=='POST'){
$s=$pdo->prepare('INSERT INTO issue_reports (serial,issue_type,description,reporter,priority) VALUES (?,?,?,?,?)');
$s->execute([$body['serial'],$body['issue_type'],$body['description'],$body['reporter'],$body['priority']]);
echojson_encode(['success'=>true]);
}break;
default: http_response_code(404);echojson_encode(['error'=>'Not found']);
}
?>
<?php
// FILE: scan.php
// Upload to: qrcode.cosmeticexim.com/scan.php
// QR code URL: https://qrcode.cosmeticexim.com/scan.php?id=SERIALdefine('DB_HOST','localhost'); define('DB_NAME','cosmetic_compusqr');
define('DB_USER','cosmetic_qruser'); define('DB_PASS','YourStrongPassword!');
$serial=htmlspecialchars($_GET['id']??'');
if(!$serial){die('<h2>Invalid QR Code</h2>');}
$pdo=newPDO("mysql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
$s=$pdo->prepare('SELECT * FROM assets WHERE serial=?');
$s->execute([$serial]); $asset=$s->fetch(PDO::FETCH_ASSOC);
if(!$asset){die('<h2>Asset not found: '.$serial.'</h2>');}
// Log scan$pdo->prepare('INSERT INTO scan_logs (serial,ip,user_agent) VALUES (?,?,?)')
->execute([$serial,$_SERVER['REMOTE_ADDR'],$_SERVER['HTTP_USER_AGENT']??'']);
$pdo->prepare('UPDATE assets SET scan_count=scan_count+1,last_scanned=NOW() WHERE serial=?')
->execute([$serial]);
if($_SERVER['REQUEST_METHOD']==='POST'&&!empty($_POST['issue_type'])){
$pdo->prepare('INSERT INTO issue_reports(serial,issue_type,description,reporter,priority) VALUES(?,?,?,?,?)')
->execute([$serial,$_POST['issue_type'],$_POST['description'],$_POST['reporter'],$_POST['priority']]);
$pdo->prepare('UPDATE assets SET status="Issue" WHERE serial=?')->execute([$serial]);
$ok=true;
}
// Redirect to COMPUS QR scan form with asset IDheader('Location: https://qrcode.cosmeticexim.com/index.html#scan='.urlencode($serial));
exit();
?>
🗄 MySQL Schema — Run this in cPanel phpMyAdmin
-- DATABASE: cosmetic_compusqr
-- Run in: cPanel → phpMyAdmin → SQL tabCREATE DATABASE IF NOT EXISTS cosmetic_compusqr CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE cosmetic_compusqr;
CREATE TABLE IF NOT EXISTS assets (
id INT AUTO_INCREMENT PRIMARY KEY,
serial VARCHAR(100) UNIQUE NOT NULL,
name VARCHAR(255),
category VARCHAR(100),
manufacturer VARCHAR(255),
model VARCHAR(100),
location VARCHAR(255),
url TEXT,
notes TEXT,
status ENUM('Active','Issue','Inactive') DEFAULT'Active',
scan_count INT DEFAULT0,
last_scanned DATETIME,
created_at DATETIME DEFAULT NOW(),
updated_at DATETIME ON UPDATE NOW()
);
CREATE TABLE IF NOT EXISTS issue_reports (
id INT AUTO_INCREMENT PRIMARY KEY,
serial VARCHAR(100) NOT NULL,
issue_type VARCHAR(100),
description TEXT,
reporter VARCHAR(255),
priority ENUM('Low','Medium','High','Critical') DEFAULT'Medium',
resolved TINYINT(1) DEFAULT0,
created_at DATETIME DEFAULT NOW(),
INDEX(serial)
);
CREATE TABLE IF NOT EXISTS scan_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
serial VARCHAR(100) NOT NULL,
ip VARCHAR(45),
user_agent TEXT,
scanned_at DATETIME DEFAULT NOW(),
INDEX(serial)
);
CREATE INDEX idx_assets_status ON assets(status);
CREATE INDEX idx_assets_serial ON assets(serial);