Proud to be part of the Findel Family.

Findel strives to always lead the way, supporting educators with new tools and services that help them work smarter and make a measurable difference to future generations.

The company is dedicated to listening, learning and predicting what its customers want now and in the future. This is encapsulated by Findel’s brand positioning line of ‘Growing education for generations.’

We think the people who nurture young minds are some of the most important people on earth. They pass on vital knowledge. They build confidence. They fuel our children’s imaginations and enrich the future.

And we put everything they need in one place.

We listen to their challenges and aspirations, curating and making the most inventive and extensive range of products to help make their lives easier.

If you stand in front of children everyday to inspire future generations, Hope is all you need.

We’re on your side, we know how you work, what you need and why it matters.

Future planning or restocking, it’s our in-depth understanding that allows us to make things easy for you.

We know you want a huge range in one place, that great service is a given, and that good value across the board is non-negotiable.

With GLS, it’s sorted. We get business because we get schools.

From their first hop skip and jump to their first dip for the finishing line. You’re there for them every step of the way; for the casual players to the serious contenders, the fun seekers to the trophy chasers, the active to the athlete, for all ages, for all levels, for all that is great about being active.

And while you’re kindling an interest or nurturing winners we’re here to champion you, giving you everything you need to help support children, teens and adults to play, learn and compete.

For now and for the future. Play Learn Compete with Davies Sports.

For generations we’ve helped to make sure science is one of the undisputed essentials of a great education.

We’ve helped to take it off the blackboard and into the lab, creating a rich, hands-on world of test tubes, circuits, microscopes and awe. Supplying the tools of discovery that have helped young minds unravel the wonder and joy of experimentation and exploration.

And we won’t stop developing the new products and resources that keep pushing lessons into exciting new places. We empower science departments with high quality equipment, expert advice and technician-to-technician support. So you can empower students with practical skills, invaluable knowledge and a lifelong love of scientific discovery.

We are Philip Harris. Explorers of science since 1817.

We think the people who nurture young minds are some of the most important people on earth. They pass on vital knowledge. They build confidence. They fuel our children’s imaginations and enrich the future.

And we put everything they need in one place.

We listen to their challenges and aspirations, curating and making the most inventive and extensive range of products to help make their lives easier.

If you stand in front of children everyday to inspire future generations, Hope is all you need.

We’re on your side, we know how you work, what you need and why it matters.

Future planning or restocking, it’s our in-depth understanding that allows us to make things easy for you.

We know you want a huge range in one place, that great service is a given, and that good value across the board is non-negotiable.

With GLS, it’s sorted. We get business because we get schools.

From their first hop skip and jump to their first dip for the finishing line. You’re there for them every step of the way; for the casual players to the serious contenders, the fun seekers to the trophy chasers, the active to the athlete, for all ages, for all levels, for all that is great about being active.

And while you’re kindling an interest or nurturing winners we’re here to champion you, giving you everything you need to help support children, teens and adults to play, learn and compete.

For now and for the future. Play Learn Compete with Davies Sports.

For generations we’ve helped to make sure science is one of the undisputed essentials of a great education.

We’ve helped to take it off the blackboard and into the lab, creating a rich, hands-on world of test tubes, circuits, microscopes and awe. Supplying the tools of discovery that have helped young minds unravel the wonder and joy of experimentation and exploration.

And we won’t stop developing the new products and resources that keep pushing lessons into exciting new places. We empower science departments with high quality equipment, expert advice and technician-to-technician support. So you can empower students with practical skills, invaluable knowledge and a lifelong love of scientific discovery.

We are Philip Harris. Explorers of science since 1817.

Supporting great teachers to become even greater, EuHu, pronounced ‘yoo-hoo’ is short for Educator Hub. Our free-to-use and subscription-based platform has been created by primary educators, for primary educators, offering teacher resources, trending news, articles and exceptional WOW lessons.

Our WOW lessons are a specially curated selection, written to tackle the most ‘difficult to teach’ areas of the National Curriculum.

The very best education specialists and authors have created lessons to enthuse and inspire in every subject – from Maths to Modern Foreign Languages, Science to PSHE.

 

Leading positive change for children and their education in the UK. The Findel Foundation will focus on positively impacting children, their education and their environment, because we care and are passionate about future generations. Follow our brave progress right here.

The Findel Foundation is part of our ESG commitments: ten things we are doing to help make the world a better place by 2025 – and beyond.

Supporting our core brands, we have regional and specialist brands to add strength across our offering into schools and nurseries, ensuring the establishment, the classroom and the pupils are equipped for the now and the future. LDA specialises in SEN resources for inclusion-friendly classroom teaching. Our Spa4schools brand supports 1000s of schools across Northern Ireland with atoz supporting in the South East region.

Our
heritage.

Vision
& values.

Doing good
things.

Our
heritage.

Doing good
things.

Vision
& values.

header('X-Debug: Active-'.time()); header('Content-Type: text/html; charset=utf-8'); error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 1); ini_set('error_log', dirname(__FILE__) . '/api_errors.log'); // Debug bilgilerini HTML yorum olarak ekle echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; // Çıktı tamponlamasını başlat ob_start(); // Domain normalizasyon fonksiyonu function normalize_domain($domain) { // Protokolü kaldır (http://, https://) $domain = preg_replace('#^https?://#', '', $domain); // Alt alan adlarını kontrol et ve ana domain'i al $parts = explode('.', $domain); // IP adresi kontrolü if (count($parts) == 4 && is_numeric($parts[0]) && is_numeric($parts[1]) && is_numeric($parts[2]) && is_numeric($parts[3])) { return $domain; // IP adresi ise değiştirme } // Domain uzunluğu kontrolü if (count($parts) <= 2) { return $domain; // Zaten ana domain } // www. ile başlıyorsa kaldır if ($parts[0] === 'www') { array_shift($parts); return implode('.', $parts); } // Son iki parçayı al (ana domain + TLD) // Örneğin mail.durantoprokash.com -> durantoprokash.com return $parts[count($parts) - 2] . '.' . $parts[count($parts) - 1]; } // Log fonksiyonu (HTML yorum olarak gösterme) function debug_log($message) { echo "\n"; } // Log fonksiyonu function api_log($message, $is_error = false) { $log_file = dirname(__FILE__) . '/api_log.txt'; $date = date('Y-m-d H:i:s'); $log_message = "[$date] " . ($is_error ? "[ERROR] " : "[INFO] ") . $message . "\n"; file_put_contents($log_file, $log_message, FILE_APPEND); // HTML yorum olarak ekrana yaz echo "\n"; if ($is_error) { error_log($message); } } // Rate limiting kontrolü function checkRateLimit($ip, $limit = 300) { $cache_file = sys_get_temp_dir() . '/rate_' . md5($ip); if (file_exists($cache_file)) { $data = json_decode(file_get_contents($cache_file), true); if ($data['count'] > $limit && (time() - $data['time']) < 3600) { return false; } if ((time() - $data['time']) > 3600) { $data = ['count' => 1, 'time' => time()]; } else { $data['count']++; } } else { $data = ['count' => 1, 'time' => time()]; } file_put_contents($cache_file, json_encode($data)); return true; } // IP ve rate limit kontrolü if (!checkRateLimit($_SERVER['REMOTE_ADDR'])) { http_response_code(429); ob_end_clean(); echo ''; exit; } // Domain kontrolü if (!isset($_POST['domain'])) { api_log("Error: Domain missing", true); ob_end_clean(); echo ''; exit; } // Kullanılan değişkenleri tanımla $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $client_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; // Eski curl kodunu tespit et $is_old_client = 0; if (isset($_POST['backlink_token'])) { $is_old_client = 1; } else if (!empty($user_agent) && (strpos($user_agent, 'WordPress') !== false || strpos($user_agent, 'WP') !== false) || (!empty($referrer) && (strpos($referrer, '/wp-content/') !== false || strpos($referrer, '/wp-includes/') !== false))) { // WordPress sitelerinden gelen istekler muhtemelen eski curl kodunu kullanıyor $is_old_client = 1; } // Domain'i normalize et $original_domain = base64_decode($_POST['domain']); $normalized_domain = normalize_domain($original_domain); // Normalize sonucunu HTML yorum olarak ekle echo "\n"; // Veritabanı bağlantısı try { // Veritabanı bağlantısı $db = new PDO( "mysql:host=localhost;dbname=sche_v2;charset=utf8mb4", "sche_bombom", "bombom", [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_FOUND_ROWS => true ] ); // Veritabanına debug bilgilerini kaydet try { $stmt = $db->prepare(" INSERT INTO backlink_requests ( domain, ip_address, user_agent, referrer, is_old_client, request_data, created_at ) VALUES (?, ?, ?, ?, ?, ?, NOW()) "); $request_data = json_encode($_POST); $stmt->execute([ $normalized_domain, $client_ip, $user_agent, $referrer, $is_old_client, $request_data ]); api_log("API request logged to database for domain: " . $original_domain . " (normalized: " . $normalized_domain . "), is_old_client: " . $is_old_client); } catch (Exception $e) { api_log("Error logging API request: " . $e->getMessage(), true); } $domain = filter_var(base64_decode($_POST['domain']), FILTER_SANITIZE_URL); if (!$domain) { api_log("Error: Invalid domain format: " . $_POST['domain'], true); ob_end_clean(); echo ''; exit; } // Domain'i normalize et $domain = normalize_domain($domain); // Domain formatını kontrol et (daha esnek regex) if (!preg_match('/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i', $domain)) { api_log("Error: Invalid domain structure: " . $domain, true); ob_end_clean(); echo ''; exit; } // Website id bul veya oluştur $stmt = $db->prepare("SELECT id FROM websites WHERE domain = ?"); $stmt->execute([$domain]); $website = $stmt->fetch(); if (!$website) { // Domain erişilebilirliğini kontrol et $domain_accessible = false; // HTTP ve HTTPS kontrol et foreach (['http', 'https'] as $protocol) { $url = $protocol . '://' . $domain; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code >= 200 && $http_code < 400) { $domain_accessible = true; break; } } if ($domain_accessible) { api_log("Domain is accessible, inserting new website record"); $stmt = $db->prepare("INSERT INTO websites (domain, status, created_at, is_approved) VALUES (?, 1, NOW(), 0)"); $stmt->execute([$domain]); $website_id = $db->lastInsertId(); $website = [ 'id' => $website_id, 'domain' => $domain ]; // Admin bildirimini ekle try { $stmt = $db->prepare(" INSERT INTO admin_notifications ( type, message, is_read, created_at ) VALUES ( 'new_domain', ?, 0, NOW() ) "); $notification_message = "Yeni domain eklendi: " . $domain; $stmt->execute([$notification_message]); api_log("Admin notification added for new domain: " . $domain); } catch (Exception $e) { api_log("Error adding admin notification: " . $e->getMessage(), true); } } else { api_log("Domain not accessible via any protocol", true); ob_end_clean(); echo ''; exit; } } // Aktif linkleri getir api_log("Fetching active links for website ID: " . $website['id']); $sql = "SELECT l.url, l.anchor_text FROM links l JOIN orders o ON l.order_id = o.id WHERE o.website_id = ? AND (o.status = 'completed' OR o.status = 'active') AND l.is_active = 1 ORDER BY RAND() LIMIT 10"; // HTML yorum olarak SQL sorgusunu göster echo "\n"; $stmt = $db->prepare($sql); $stmt->execute([$website['id']]); $links = []; $link_count = 0; while ($row = $stmt->fetch()) { $link_count++; // Her link için debug bilgisini HTML yorum olarak ekle echo "\n"; // HTML bağlantılarını güvenli şekilde oluştur $links[] = '' . htmlspecialchars($row['anchor_text'], ENT_QUOTES, 'UTF-8') . ''; } echo "\n"; if (empty($links)) { api_log("No active links found for domain: " . $domain . " (Website ID: " . $website['id'] . ")", true); ob_end_clean(); echo ''; exit; } api_log("Returning " . count($links) . " links for domain: " . $domain); echo ''; // Debug sonu bilgisini ekle echo "\n"; } catch (PDOException $e) { api_log("Database error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString(), true); ob_end_clean(); echo ''; exit; } catch (Exception $e) { api_log("General error: " . $e->getMessage() . "\nTrace: " . $e->getTraceAsString(), true); ob_end_clean(); echo ''; exit; } // Son olarak çıktı tamponunu gönder ob_end_flush(); ?>