{"id":31281,"date":"2025-10-08T06:41:38","date_gmt":"2025-10-08T03:41:38","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31281"},"modified":"2025-10-08T06:41:38","modified_gmt":"2025-10-08T03:41:38","slug":"mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/","title":{"rendered":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Web uygulamalar\u0131nda b\u00fcy\u00fck veri setlerini kullan\u0131c\u0131ya sunarken, t\u00fcm veriyi tek seferde y\u00fcklemek hem sunucu performans\u0131 hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan verimsizdir. Bu noktada &#8220;sayfalama&#8221; (pagination) devreye girer. Sayfalama, verileri daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lerek her sayfada belirli say\u0131da kay\u0131t g\u00f6sterme i\u015flemidir. Bu rehberde, Ubuntu 18.04 i\u015fletim sistemi \u00fczerinde PHP ve MySQL kullanarak sayfalama i\u015flemini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 detayl\u0131 kod \u00f6rnekleriyle \u00f6\u011freneceksiniz. Sayfalama, uygulaman\u0131z\u0131n daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n arad\u0131klar\u0131 bilgiye daha kolay ula\u015fmalar\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Ortam Kurulumu ve Veritaban\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Sayfalama uygulamas\u0131n\u0131 geli\u015ftirmeye ba\u015flamadan \u00f6nce, Ubuntu 18.04 sunucunuzda gerekli ortam\u0131n kurulu oldu\u011fundan emin olmal\u0131y\u0131z. Apache web sunucusu, PHP ve MySQL veritaban\u0131 sunucusu temel gereksinimlerdir.<\/p>\n<pre><code class=\"language-bash\">\nsudo apt update\nsudo apt install apache2 php libapache2-mod-php php-mysql mysql-server -y\nsudo mysql_secure_installation # MySQL g\u00fcvenli\u011fini yap\u0131land\u0131rmak i\u00e7in\n<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra, sayfalama \u00f6rne\u011fimiz i\u00e7in bir veritaban\u0131 ve \u00f6rnek bir tablo olu\u015ftural\u0131m. MySQL&#8217;e giri\u015f yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">\nsudo mysql -u root -p\n<\/code><\/pre>\n<p>\u015eimdi veritaban\u0131n\u0131 ve tabloyu olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">\nCREATE DATABASE pagination_db;\nUSE pagination_db;\n\nCREATE TABLE products (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    name VARCHAR(255) NOT NULL,\n    description TEXT,\n    price DECIMAL(10, 2) NOT NULL,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- \u00d6rnek veri ekleyelim (en az 50-100 kay\u0131t eklemeniz \u00f6nerilir)\nINSERT INTO products (name, description, price) VALUES\n('Ak\u0131ll\u0131 Telefon X', 'Y\u00fcksek performansl\u0131 ak\u0131ll\u0131 telefon.', 999.99),\n('Diz\u00fcst\u00fc Bilgisayar Y', '\u0130nce ve hafif diz\u00fcst\u00fc bilgisayar.', 1250.00),\n('Ak\u0131ll\u0131 Saat Z', 'Nab\u0131z \u00f6l\u00e7er ve bildirim \u00f6zellikli.', 199.50),\n('Kablosuz Kulakl\u0131k A', 'G\u00fcr\u00fclt\u00fc \u00f6nleyici \u00f6zellikli kulakl\u0131k.', 120.00),\n('Ta\u015f\u0131nabilir \u015earj Cihaz\u0131 B', '10000 mAh kapasiteli.', 35.75),\n('Oyun Konsolu C', 'En yeni nesil oyun konsolu.', 499.00),\n('4K Televizyon D', 'Geni\u015f ekran, canl\u0131 renkler.', 750.00),\n('Robot S\u00fcp\u00fcrge E', 'Otomatik temizlik robotu.', 300.25),\n('Kahve Makinesi F', 'Espresso ve filtre kahve yapabilen.', 85.00),\n('Ak\u0131ll\u0131 Ampul G', 'Renk de\u011fi\u015ftirebilen LED ampul.', 15.99);\n\n-- Daha fazla veri eklemek i\u00e7in bu sat\u0131r\u0131 bir\u00e7ok kez \u00e7al\u0131\u015ft\u0131rabilirsiniz.\n-- \u00d6rnek:\nINSERT INTO products (name, description, price)\nSELECT CONCAT('\u00dcr\u00fcn ', id + 10), CONCAT('Bu harika bir \u00fcr\u00fcnd\u00fcr: ', id + 10), ROUND(RAND() * 1000 + 10, 2)\nFROM products;\n-- Bu sorguyu birka\u00e7 kez \u00e7al\u0131\u015ft\u0131rarak y\u00fczlerce kay\u0131t olu\u015fturabilirsiniz.\n-- \u00d6rne\u011fin, 3 kez \u00e7al\u0131\u015ft\u0131rmak 10 -> 20 -> 40 -> 80 kay\u0131t yapar.\n-- 6-7 kez \u00e7al\u0131\u015ft\u0131rmak 1000'den fazla kay\u0131t olu\u015fturur.\n<\/code><\/pre>\n<h3>Sayfalama Mant\u0131\u011f\u0131 ve MySQL Sorgular\u0131<\/h3>\n<p>Sayfalama i\u015fleminin temelinde MySQL&#8217;in <code>LIMIT<\/code> ve <code>OFFSET<\/code> anahtar kelimeleri yatar.<\/p>\n<p>*   <strong><code>LIMIT<\/code><\/strong>: Bir sorgudan d\u00f6necek maksimum kay\u0131t say\u0131s\u0131n\u0131 belirler. \u00d6rne\u011fin, <code>LIMIT 10<\/code> sadece ilk 10 kayd\u0131 getirir.<br \/>\n*   <strong><code>OFFSET<\/code><\/strong>: Sorgunun ba\u015flang\u0131\u00e7 noktas\u0131n\u0131 belirler. Belirtilen say\u0131 kadar kayd\u0131 atlar ve sonras\u0131ndaki kay\u0131tlar\u0131 getirir. \u00d6rne\u011fin, <code>OFFSET 20<\/code> ilk 20 kayd\u0131 atlay\u0131p 21. kay\u0131ttan itibaren getirir.<\/p>\n<p>Sayfalama i\u00e7in bu iki anahtar kelimeyi birle\u015ftirerek kullan\u0131r\u0131z: <code>LIMIT [kay\u0131t_say\u0131s\u0131] OFFSET [atlama_say\u0131s\u0131]<\/code>.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Her sayfada 10 kay\u0131t g\u00f6stermek istedi\u011fimizi varsayal\u0131m:<br \/>\n<em>   <strong>Sayfa 1:<\/strong> <code>SELECT <\/em> FROM products LIMIT 10 OFFSET 0;<\/code> (\u0130lk 10 kay\u0131t)<br \/>\n<em>   <strong>Sayfa 2:<\/strong> <code>SELECT <\/em> FROM products LIMIT 10 OFFSET 10;<\/code> (11. kay\u0131ttan itibaren 10 kay\u0131t)<br \/>\n<em>   <strong>Sayfa 3:<\/strong> <code>SELECT <\/em> FROM products LIMIT 10 OFFSET 20;<\/code> (21. kay\u0131ttan itibaren 10 kay\u0131t)<\/p>\n<p>Genel form\u00fcl \u015f\u00f6yledir:<br \/>\n<code>OFFSET = (current_page - 1) * records_per_page<\/code><\/p>\n<p>Ayr\u0131ca, toplam sayfa say\u0131s\u0131n\u0131 belirlemek i\u00e7in veritaban\u0131ndaki toplam kay\u0131t say\u0131s\u0131n\u0131 bilmemiz gerekir. Bunun i\u00e7in <code>COUNT(*)<\/code> fonksiyonunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-sql\">\nSELECT COUNT(*) FROM products;\n<\/code><\/pre>\n<p>Toplam kay\u0131t say\u0131s\u0131n\u0131 (\u00f6rne\u011fin <code>total_records<\/code>) ve her sayfada g\u00f6sterilecek kay\u0131t say\u0131s\u0131n\u0131 (<code>records_per_page<\/code>) bildi\u011fimizde, toplam sayfa say\u0131s\u0131n\u0131 \u015fu form\u00fclle hesaplayabiliriz:<br \/>\n<code>total_pages = ceil(total_records \/ records_per_page)<\/code> (PHP&#8217;deki <code>ceil()<\/code> fonksiyonu yukar\u0131 yuvarlama yapar).<\/p>\n<h3>PHP ile Sayfalama Uygulamas\u0131<\/h3>\n<p>\u015eimdi bu mant\u0131\u011f\u0131 PHP koduna d\u00f6kelim. <code>index.php<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve Apache&#8217;nin belge k\u00f6k dizinine (genellikle <code>\/var\/www\/html\/<\/code>) yerle\u015ftirelim.<\/p>\n<h4>1. Veritaban\u0131 Ba\u011flant\u0131s\u0131 (<code>db_config.php<\/code>)<\/h4>\n<p>G\u00fcvenli ve tekrar kullan\u0131labilir bir veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in PDO (PHP Data Objects) kullanaca\u011f\u0131z. <code>db_config.php<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-php\">\n<?php\n$host = 'localhost';\n$db   = 'pagination_db';\n$user = 'root'; \/\/ MySQL kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n$pass = 'your_mysql_password'; \/\/ MySQL \u015fifrenizi buraya yaz\u0131n\n$charset = 'utf8mb4';\n\n$dsn = \"mysql:host=$host;dbname=$db;charset=$charset\";\n$options = [\n    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,\n    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n    PDO::ATTR_EMULATE_PREPARES   => false,\n];\n\ntry {\n    $pdo = new PDO($dsn, $user, $pass, $options);\n} catch (\\PDOException $e) {\n    throw new \\PDOException($e->getMessage(), (int)$e->getCode());\n}\n?>\n<\/code><\/pre>\n<p><strong>\u00d6nemli:<\/strong> <code>$pass<\/code> k\u0131sm\u0131na kendi MySQL <code>root<\/code> \u015fifrenizi yazmay\u0131 unutmay\u0131n. G\u00fcvenlik a\u00e7\u0131s\u0131ndan <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine ayr\u0131 bir veritaban\u0131 kullan\u0131c\u0131s\u0131 olu\u015fturman\u0131z \u00f6nerilir.<\/p>\n<h4>2. Ana Sayfalama Kodu (<code>index.php<\/code>)<\/h4>\n<p>\u015eimdi <code>index.php<\/code> dosyam\u0131z\u0131 olu\u015ftural\u0131m ve sayfalama mant\u0131\u011f\u0131n\u0131 uygulayal\u0131m:<\/p>\n<pre><code class=\"language-php\">\n<?php\nrequire_once 'db_config.php'; \/\/ Veritaban\u0131 ba\u011flant\u0131 dosyam\u0131z\u0131 dahil ediyoruz\n\n\/\/ --- Sayfalama Ayarlar\u0131 ---\n$records_per_page = 10; \/\/ Her sayfada g\u00f6sterilecek kay\u0131t say\u0131s\u0131\n\n\/\/ --- Mevcut Sayfa Numaras\u0131n\u0131 Belirleme ---\n$current_page = isset($_GET['page']) &#038;&#038; is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;\n\n\/\/ Sayfa numaras\u0131n\u0131n 1'den k\u00fc\u00e7\u00fck olmamas\u0131n\u0131 sa\u011fla\nif ($current_page < 1) {\n    $current_page = 1;\n}\n\n\/\/ --- Toplam Kay\u0131t Say\u0131s\u0131n\u0131 ve Toplam Sayfa Say\u0131s\u0131n\u0131 Hesaplama ---\ntry {\n    $stmt = $pdo->prepare(\"SELECT COUNT(*) FROM products\");\n    $stmt->execute();\n    $total_records = $stmt->fetchColumn();\n    \n    $total_pages = ceil($total_records \/ $records_per_page);\n\n    \/\/ Mevcut sayfa numaras\u0131n\u0131n toplam sayfa say\u0131s\u0131ndan b\u00fcy\u00fck olmamas\u0131n\u0131 sa\u011fla\n    if ($current_page > $total_pages && $total_pages > 0) {\n        $current_page = $total_pages;\n    } elseif ($total_pages == 0) { \/\/ Hi\u00e7 kay\u0131t yoksa, sayfa 1 olarak kals\u0131n\n        $current_page = 1;\n    }\n\n    \/\/ --- OFFSET De\u011ferini Hesaplama ---\n    $offset = ($current_page - 1) * $records_per_page;\n\n    \/\/ --- Verileri \u00c7ekme ---\n    $stmt = $pdo->prepare(\"SELECT * FROM products ORDER BY id DESC LIMIT :limit OFFSET :offset\");\n    $stmt->bindValue(':limit', $records_per_page, PDO::PARAM_INT);\n    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);\n    $stmt->execute();\n    $products = $stmt->fetchAll();\n\n} catch (\\PDOException $e) {\n    echo \"Veritaban\u0131 hatas\u0131: \" . $e->getMessage();\n    exit();\n}\n?>\n\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>PHP MySQL Sayfalama \u00d6rne\u011fi<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 20px; }\n        .product-list { margin-top: 20px; }\n        .product-item { border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }\n        .pagination { margin-top: 20px; }\n        .pagination a, .pagination span {\n            display: inline-block;\n            padding: 8px 12px;\n            margin: 0 4px;\n            border: 1px solid #ddd;\n            text-decoration: none;\n            color: #337ab7;\n            border-radius: 4px;\n        }\n        .pagination a:hover {\n            background-color: #eee;\n        }\n        .pagination .current-page {\n            background-color: #337ab7;\n            color: white;\n            border-color: #337ab7;\n        }\n        .pagination .disabled {\n            color: #ccc;\n            pointer-events: none;\n            cursor: default;\n        }\n    <\/style>\n<\/head>\n<body>\n    <h2>\u00dcr\u00fcn Listesi<\/h2>\n\n    <div class=\"product-list\">\n        <?php if (count($products) > 0): ?>\n            <?php foreach ($products as $product): ?>\n                <div class=\"product-item\">\n                    <h3><?= htmlspecialchars($product['name']) ?><\/h3>\n                    <p><?= htmlspecialchars($product['description']) ?><\/p>\n                    <p><strong>Fiyat:<\/strong> <?= htmlspecialchars($product['price']) ?> TL<\/p>\n                    <small>Olu\u015fturulma Tarihi: <?= htmlspecialchars($product['created_at']) ?><\/small>\n                <\/div>\n            <?php endforeach; ?>\n        <?php else: ?>\n            <p>G\u00f6sterilecek \u00fcr\u00fcn bulunmamaktad\u0131r.<\/p>\n        <?php endif; ?>\n    <\/div>\n\n    <!-- Sayfalama Ba\u011flant\u0131lar\u0131 -->\n    <div class=\"pagination\">\n        <?php if ($total_pages > 1): ?>\n            <!-- \u00d6nceki Sayfa -->\n            <a href=\"?page=<?= $current_page - 1 ?>\" class=\"<?= ($current_page <= 1) ? 'disabled' : '' ?>\">\u00d6nceki<\/a>\n\n            <?php\n            \/\/ Sayfa numaralar\u0131n\u0131 dinamik olarak olu\u015fturma\n            $start_page = max(1, $current_page - 2);\n            $end_page = min($total_pages, $current_page + 2);\n\n            if ($start_page > 1) {\n                echo '<a href=\"?page=1\">1<\/a>';\n                if ($start_page > 2) {\n                    echo '<span>...<\/span>';\n                }\n            }\n\n            for ($i = $start_page; $i <= $end_page; $i++):\n            ?>\n                <a href=\"?page=<?= $i ?>\" class=\"<?= ($i == $current_page) ? 'current-page' : '' ?>\"><?= $i ?><\/a>\n            <?php endfor; ?>\n\n            <?php\n            if ($end_page < $total_pages) {\n                if ($end_page < $total_pages - 1) {\n                    echo '<span>...<\/span>';\n                }\n                echo '<a href=\"?page=' . $total_pages . '\">' . $total_pages . '<\/a>';\n            }\n            ?>\n\n            <!-- Sonraki Sayfa -->\n            <a href=\"?page=<?= $current_page + 1 ?>\" class=\"<?= ($current_page >= $total_pages) ? 'disabled' : '' ?>\">Sonraki<\/a>\n        <?php endif; ?>\n    <\/div>\n\n<\/body>\n<\/html>\n<\/code><\/pre>\n<h4>Kod A\u00e7\u0131klamalar\u0131:<\/h4>\n<p>1.  <strong><code>db_config.php<\/code> Dahil Etme:<\/strong> PDO ile veritaban\u0131 ba\u011flant\u0131s\u0131 kurulur ve <code>$pdo<\/code> nesnesi <code>index.php<\/code>&#8216;ye aktar\u0131l\u0131r.<br \/>\n2.  <strong>Sayfalama Ayarlar\u0131:<\/strong> <code>$records_per_page<\/code> de\u011fi\u015fkeni, her sayfada ka\u00e7 kay\u0131t g\u00f6sterilece\u011fini belirler.<br \/>\n3.  <strong>Mevcut Sayfa:<\/strong> URL&#8217;den <code>$_GET['page']<\/code> parametresi ile mevcut sayfa numaras\u0131 al\u0131n\u0131r. Ge\u00e7ersiz veya eksikse varsay\u0131lan olarak 1 atan\u0131r. G\u00fcvenlik i\u00e7in <code>is_numeric()<\/code> kontrol\u00fc ve <code>(int)<\/code> ile tip d\u00f6n\u00fc\u015f\u00fcm\u00fc yap\u0131l\u0131r.<br \/>\n4.  <strong>Toplam Kay\u0131t ve Sayfa Say\u0131s\u0131:<\/strong><br \/>\n    <em>   <code>SELECT COUNT(<\/em>)<\/code> sorgusu ile veritaban\u0131ndaki toplam kay\u0131t say\u0131s\u0131 \u00f6\u011frenilir.<br \/>\n    *   <code>ceil($total_records \/ $records_per_page)<\/code> ile toplam sayfa say\u0131s\u0131 hesaplan\u0131r. <code>ceil()<\/code> fonksiyonu, k\u00fcsuratl\u0131 sonu\u00e7lar\u0131 yukar\u0131 yuvarlayarak tam sayfa say\u0131s\u0131n\u0131 verir (\u00f6rne\u011fin, 21 kay\u0131t ve 10 kay\u0131t\/sayfa i\u00e7in 3 sayfa).<br \/>\n    *   <code>$current_page<\/code> de\u011feri, <code>$total_pages<\/code> de\u011ferini a\u015farsa, son sayfaya y\u00f6nlendirilir.<br \/>\n5.  <strong><code>OFFSET<\/code> Hesaplama:<\/strong> <code>$offset<\/code> de\u011feri, mevcut sayfa numaras\u0131 ve sayfa ba\u015f\u0131na kay\u0131t say\u0131s\u0131 kullan\u0131larak hesaplan\u0131r.<br \/>\n6.  <strong>Verilerin \u00c7ekilmesi:<\/strong><br \/>\n    <em>   <code>SELECT <\/em> FROM products ORDER BY id DESC LIMIT :limit OFFSET :offset<\/code> sorgusu haz\u0131rlan\u0131r. <code>ORDER BY id DESC<\/code> ile en yeni kay\u0131tlar\u0131n \u00f6nce gelmesi sa\u011flan\u0131r.<br \/>\n    *   PDO&#8217;nun prepared statement \u00f6zelli\u011fi sayesinde <code>:limit<\/code> ve <code>:offset<\/code> yer tutucular\u0131na <code>bindValue()<\/code> ile g\u00fcvenli bir \u015fekilde de\u011ferler atan\u0131r. Bu, SQL Injection sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in kritik bir ad\u0131md\u0131r.<br \/>\n    *   <code>fetchAll()<\/code> ile ilgili sayfan\u0131n t\u00fcm \u00fcr\u00fcnleri \u00e7ekilir.<br \/>\n7.  <strong>HTML ve Veri G\u00f6sterimi:<\/strong> \u00c7ekilen \u00fcr\u00fcnler bir <code>foreach<\/code> d\u00f6ng\u00fcs\u00fc ile HTML i\u00e7inde listelenir. <code>htmlspecialchars()<\/code> fonksiyonu, kullan\u0131c\u0131dan gelen verileri taray\u0131c\u0131da g\u00fcvenli bir \u015fekilde g\u00f6stermek i\u00e7in kullan\u0131l\u0131r (XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma).<br \/>\n8.  <strong>Sayfalama Ba\u011flant\u0131lar\u0131 Olu\u015fturma:<\/strong><br \/>\n    *   &#8220;\u00d6nceki&#8221; ve &#8220;Sonraki&#8221; ba\u011flant\u0131lar\u0131, mevcut sayfa numaras\u0131na g\u00f6re etkinle\u015ftirilir veya devre d\u0131\u015f\u0131 b\u0131rak\u0131l\u0131r.<br \/>\n    *   Sayfa numaralar\u0131n\u0131 g\u00f6steren dinamik ba\u011flant\u0131lar olu\u015fturulur. <code>max()<\/code> ve <code>min()<\/code> fonksiyonlar\u0131 kullan\u0131larak, mevcut sayfan\u0131n etraf\u0131nda belirli say\u0131da sayfa (\u00f6rne\u011fin, 2 sayfa \u00f6nce ve 2 sayfa sonra) g\u00f6sterilir. Bu, \u00e7ok fazla sayfa oldu\u011funda ba\u011flant\u0131 listesinin \u00e7ok uzun olmas\u0131n\u0131 engeller.<br \/>\n    *   <code>current-page<\/code> s\u0131n\u0131f\u0131 ile mevcut sayfa vurgulan\u0131r.<br \/>\n    *   <code>disabled<\/code> s\u0131n\u0131f\u0131 ile ge\u00e7ersiz (\u00f6rne\u011fin ilk sayfada &#8220;\u00d6nceki&#8221;) ba\u011flant\u0131lar etkisiz hale getirilir.<\/p>\n<p>Bu dosyalar\u0131 <code>\/var\/www\/html\/<\/code> dizinine kaydettikten sonra, web taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost\/index.php<\/code> adresine giderek sayfalama uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Bu rehberde, PHP ve MySQL kullanarak temel bir sayfalama sistemini Ubuntu 18.04 \u00fczerinde nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ve uygulayaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frendiniz. Sayfalama, b\u00fcy\u00fck veri setlerini y\u00f6netmek ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in modern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS):<\/h4>\n<p><strong>1. Sayfalama performans\u0131n\u0131 nas\u0131l art\u0131rabilirim?<\/strong><br \/>\n*   <strong>\u0130ndeksler Kullan\u0131n:<\/strong> <code>ORDER BY<\/code> ve <code>WHERE<\/code> ko\u015fullar\u0131nda kulland\u0131\u011f\u0131n\u0131z s\u00fctunlara indeks eklemek (\u00f6rne\u011fin <code>products<\/code> tablosundaki <code>id<\/code> s\u00fctunu zaten PRIMARY KEY olarak indekslidir) sorgu h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<br \/>\n*   <strong>Do\u011fru <code>LIMIT<\/code>\/<code>OFFSET<\/code> Kullan\u0131m\u0131:<\/strong> \u00c7ok b\u00fcy\u00fck <code>OFFSET<\/code> de\u011ferleri, MySQL&#8217;in daha fazla sat\u0131r\u0131 taramas\u0131na neden olabilir. M\u00fcmk\u00fcnse &#8220;keyset pagination&#8221; veya &#8220;cursor-based pagination&#8221; gibi alternatif y\u00f6ntemleri ara\u015ft\u0131rabilirsiniz. Bu y\u00f6ntemler, son g\u00f6r\u00fclen kayd\u0131n ID&#8217;sini kullanarak bir sonraki sayfay\u0131 getirir ve <code>OFFSET<\/code>&#8216;in performans sorununu ortadan kald\u0131r\u0131r.<br \/>\n<em>   <strong><code>COUNT(<\/em>)<\/code> yerine <code>COUNT(id)<\/code>:<\/strong> Performans a\u00e7\u0131s\u0131ndan genellikle fark etmese de, baz\u0131 durumlarda <code>COUNT(primary_key_column)<\/code> daha h\u0131zl\u0131 olabilir.<\/p>\n<p><strong>2. B\u00fcy\u00fck veri setleri i\u00e7in <code>OFFSET<\/code> tabanl\u0131 sayfalama neden sorunlu olabilir?<\/strong><br \/>\n<code>OFFSET<\/code> tabanl\u0131 sayfalama, veritaban\u0131n\u0131n <code>OFFSET<\/code> de\u011ferine kadar olan t\u00fcm kay\u0131tlar\u0131 taray\u0131p sonra <code>LIMIT<\/code> kadar\u0131n\u0131 se\u00e7mesini gerektirdi\u011fi i\u00e7in b\u00fcy\u00fck veri setlerinde yava\u015flayabilir. \u00d6rne\u011fin, 1.000.000 kayd\u0131 olan bir tabloda 100.000. kay\u0131ttan itibaren 10 kay\u0131t almak i\u00e7in veritaban\u0131 ilk 100.000 kayd\u0131 okumak zorunda kal\u0131r.<\/p>\n<p><strong>3. G\u00fcvenlik konusunda nelere dikkat etmeliyim?<\/strong><br \/>\n*   <strong>SQL Injection:<\/strong> Kullan\u0131c\u0131dan gelen verileri (\u00f6rne\u011fin <code>$_GET['page']<\/code>) do\u011frudan SQL sorgular\u0131na eklemeyin. Prepared statement&#8217;lar (PDO&#8217;da <code>prepare()<\/code> ve <code>bindValue()<\/code>) kullanarak SQL Injection sald\u0131r\u0131lar\u0131n\u0131 \u00f6nleyin.<br \/>\n*   <strong>XSS (Cross-Site Scripting):<\/strong> Kullan\u0131c\u0131dan gelen veya veritaban\u0131ndan \u00e7ekilen verileri HTML \u00e7\u0131kt\u0131s\u0131na basarken <code>htmlspecialchars()<\/code> gibi fonksiyonlarla temizleyin.<br \/>\n*   <strong>Yetkilendirme:<\/strong> Veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine, sadece gerekli yetkilere sahip ayr\u0131 bir MySQL kullan\u0131c\u0131s\u0131 olu\u015fturun.<\/p>\n<p><strong>4. Sayfalama ba\u011flant\u0131lar\u0131n\u0131 dinamik olarak nas\u0131l olu\u015ftururum?<\/strong><br \/>\nYukar\u0131daki \u00f6rnekte, <code>for<\/code> d\u00f6ng\u00fcs\u00fc ve <code>max()<\/code>, <code>min()<\/code> fonksiyonlar\u0131 kullan\u0131larak mevcut sayfan\u0131n etraf\u0131nda belirli say\u0131da sayfa ba\u011flant\u0131s\u0131 (\u00f6rne\u011fin <code>1 ... 3 4 [5] 6 7 ... 100<\/code>) dinamik olarak olu\u015fturulmu\u015ftur. Bu, \u00e7ok say\u0131da sayfa oldu\u011funda kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn daha temiz kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>5. Sayfalama ile birlikte arama veya filtreleme nas\u0131l entegre edilir?<\/strong><br \/>\nArama veya filtreleme parametrelerini de URL&#8217;ye <code>$_GET<\/code> de\u011fi\u015fkenleri olarak ekleyebilirsiniz. \u00d6rne\u011fin: <code>?page=2&search=telefon&category=elektronik<\/code>. PHP kodunuzda <code>WHERE<\/code> ko\u015fuluna bu parametreleri ekleyerek sorguyu g\u00fcncellemeli ve sayfalama ba\u011flant\u0131lar\u0131n\u0131 olu\u015ftururken mevcut arama\/filtreleme parametrelerini de korumal\u0131s\u0131n\u0131z:<\/p>\n<pre><code class=\"language-php\">\n\/\/ \u00d6rnek: Arama parametresi\n$search_query = isset($_GET['search']) ? $_GET['search'] : '';\n$base_url = \"?\";\nif (!empty($search_query)) {\n    $base_url .= \"search=\" . urlencode($search_query) . \"&\";\n}\n\/\/ Sayfalama ba\u011flant\u0131lar\u0131 olu\u015fturulurken:\n\/\/ <a href=\"<?= $base_url ?>page=<?= $i ?>\"><?= $i ?><\/a>\n<\/code><\/pre>\n<p>Bu \u015fekilde, kullan\u0131c\u0131 arama veya filtreleme yaparken sayfalama da d\u00fczg\u00fcn bir \u015fekilde \u00e7al\u0131\u015fmaya devam eder.<\/p>\n<p>Umar\u0131m bu rehber, PHP ve MySQL ile sayfalama uygulamas\u0131n\u0131 ba\u015far\u0131yla hayata ge\u00e7irmenize yard\u0131mc\u0131 olur!<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber\nGiri\u015f\nWeb uygulamalar\u0131nda b\u00fcy\u00fck veri setlerini kull","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-31281","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber Giri\u015f Web uygulamalar\u0131nda b\u00fcy\u00fck veri setlerini kull\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T03:41:38+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber\",\"datePublished\":\"2025-10-08T03:41:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\"},\"wordCount\":1296,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\",\"name\":\"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T03:41:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber","og_description":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber Giri\u015f Web uygulamalar\u0131nda b\u00fcy\u00fck veri setlerini kull","og_url":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T03:41:38+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"4 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber","datePublished":"2025-10-08T03:41:38+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/"},"wordCount":1296,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/","name":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T03:41:38+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-ve-php-ile-sayfalama-pagination-uygulamasi-ubuntu-18-04-uzerinde-detayli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MySQL ve PHP ile Sayfalama (Pagination) Uygulamas\u0131: Ubuntu 18.04 \u00dczerinde Detayl\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31281"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31281\/revisions"}],"predecessor-version":[{"id":31282,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31281\/revisions\/31282"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}