$ch = curl_init('https://api.ip2location.io/?ip=8.8.8.8'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($ch); curl_close($ch); $api_result = json_decode($json, true); echo '<pre>'; var_dump($api_result); echo '</pre>';
APIキーなしでも動作するが、1日あたり1,000件のクエリに制限される。
無料プランに登録するとAPIキーを取得でき、1か月あたり5万件のクエリを利用できる。
// tracking.php // 訪問データの取得 $ip = $_SERVER['REMOTE_ADDR']; $page = $_SERVER['REQUEST_URI']; $time = date('Y-m-d H:i:s'); $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $user_agent = $_SERVER['HTTP_USER_AGENT']; // ここでデータベースへの接続および記録処理を行います try { $pdo = new PDO('mysql:host=ホスト名;dbname=データベース名', 'ユーザー名', 'パスワード', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]); $stmt = $pdo->prepare("INSERT INTO access_logs (ip, page, access_time, referrer, user_agent) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$ip, $page, $time, $referrer, $user_agent]); } catch (PDOException $e) { error_log("DBエラー: " . $e->getMessage()); }
echo substr('abcdef', 0, 8); // abcdef
// 絵文字制限(例: VARCHAR(30)) $maxLength = 30; $maxBytes = $maxLength * 4; // 文字数,バイト数を確認 if (mb_strlen($_POST['text'], 'UTF-8') > $maxLength || strlen($_POST['text']) > $maxBytes) { $error = "文字数またはバイト数がオーバーしています。"; }
<?php $array = ['apple', 'banana', 'cherry']; // 'banana'を削除したい $key = array_search('banana', $array); // インデックスを取得 if ($key !== false) { unset($array[$key]); // 配列から削除 $array = array_values($array); // インデックスを再構築 } print_r($array); ?>
function setToken($formName) { // トークンを生成 $csrf_token = bin2hex(random_bytes(32)); // $_SESSION['csrf_token']が配列であることを確認 if (!isset($_SESSION['csrf_token']) || !is_array($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = array(); } $_SESSION['csrf_token'][$formName] = $csrf_token; return $csrf_token; }
<input type="hidden" name="form_name" value="entry-form"> <input type="hidden" name="csrf_token" value="<?php echo h(setToken('entry-form')); ?>">
session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $formName = $_POST['form_name']; if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token'][$formName]) { exit('不正なリクエスト'); } unset($_SESSION['csrf_token'][$formName]); unset($_POST['form_name']); }
POST:維持
GET:上書き
残したいなら、input[type="hidden"] を使ってフォームデータにパラメータを加える。
<?php // 元のデータ $keys = ["apple", "banana", "cherry"]; $values = [100, 200, 300]; // 空の連想配列を初期化 $associativeArray = []; // foreach文で配列を作成 foreach ($keys as $index => $key) { $associativeArray[$key] = $values[$index]; } // 結果を表示 print_r($associativeArray); ?>
三項演算子は、条件式 ? 式1 : 式2 という記述を行うことで使用できます。
Null合体演算子(??)は、!is_null($hoge) ? $hoge : $fuga と等価で
エルビス演算子(?:)は、$hoge ? $hoge : $fuga と等価です。
function deleteDirectory($dir){ $iterator = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) { if ($file->isDir()) { rmdir($file->getPathname()); } else { unlink($file->getPathname()); } } rmdir($dir); }
// ファイル名をサニタイズしてセキュリティを確保 $file = basename($file); $filePath = './uploads/' . $file; if (file_exists($filePath)) { // ダウンロードを開始するためのヘッダーを設定 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Content-Length: ' . filesize($filePath)); // 出力バッファをクリア ob_clean(); flush(); // ファイルを読み込んで出力 readfile($filePath); // ダウンロード後にファイルを削除 unlink($filePath); exit; } else { echo 'ファイルが存在しません。'; }