」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我該如何使用 PHP 和 MySQL 解決具有挑戰性的後端問題

我該如何使用 PHP 和 MySQL 解決具有挑戰性的後端問題

發佈於2024-07-31
瀏覽:332

How I Solved a Challenging Backend Problem with PHP & MySQL

大家好,好久沒寫博文了;好吧,我在這裡寫的是我遇到的最具挑戰性的問題之一,以及我如何解決它的概述。

身為後端開發人員,挑戰尤其是那些會讓您興奮的挑戰是無法逃避的。最近,在使用 PHP 和 MySQL 開發廣告網路時,我遇到了一個與基於特定標準為發布商優化每千次成本 (CPM) 相關的複雜問題。這個問題考驗了我的技術能力,並提供了寶貴的學習經驗。在這篇文章中,我將向您介紹我如何逐步解決這個問題,重點介紹所面臨的挑戰和實施的解決方案。如果我能得到有關如何有效實施或更好的方法的建議,我將很高興。

問題

任務是根據以下標準調整發布商的每千次曝光費用:

  1. 如果過去 10 分鐘內有來自 10 個不同 IP 位址的點擊,則增加 5%。
  2. 如果過去 10 分鐘內同一 IP 位址有 5 次點擊,則減少 8%。
  3. 如果來自同一國家連續 10 次點擊,則增加 2%。

解決方案之旅

第 1 步:了解要求

在開始實施之前,我需要清楚地了解需求。我與利害關係人進行了討論,以確認調整 CPM 的標準和期望的行為。這第一步對於有效規劃解決方案至關重要。

第 2 步:設定資料庫

我已經建立了資料庫和表,而且該專案已經上線,所以我只需要添加標準。我確保資料庫和表已設定為儲存和容納點擊追蹤所需的資訊。表架構包含用於儲存點擊時間戳記、IP 位址和國家/地區代碼的欄位(還有其他欄位/列,我不會包含這些欄位/列,因為它們對於本文的原因並不重要)。

第 3 步:捕獲點擊數據

接下來,我實作了一個函數,用於在使用者點擊廣告時取得並保存 IP 位址和國家/地區代碼。該資料儲存在點擊表中。

第 4 步:實施標準檢查

捕獲資料後,下一步是實施邏輯來檢查標準並相應地調整 CPM。

  1. 檢查唯一的 IP 位址 我使用 COUNT 函數和 DISTINCT] 關鍵字計算過去 10 分鐘內的唯一 IP 位址,該關鍵字計算群組中每一行的表達式並傳回唯一非空值的數量。
/** 
 * Get the count of unique IP addresses in the last 10 minutes
 */
$stmt = $pdo->prepare("
    SELECT COUNT(DISTINCT ip_address) AS unique_ips
    FROM clicks
    WHERE date_time >= NOW() - INTERVAL 10 MINUTE
");
$stmt->execute();
$unique_ips = $stmt->fetchColumn();

if ($unique_ips >= 10) {
    $cpm *= 1.05;
} else {
    /**
     * Here, I check for clicks from the same IP address
     * This is in the second condition
     * ...
     **/
}
  1. 檢查重複的 IP 位址 然後,我使用 SQL COUNT 函數檢查過去 10 分鐘內是否有重複或不唯一的 IP 位址。
/** 
 * Checking non-unique (repeated) IP addresses in the last 10 minutes
 * If the condition is true, decrease the CPM by 8%
 */
$stmt = $pdo->prepare("
    SELECT ip_address, COUNT(*) AS click_count
    FROM clicks
    WHERE timestamp >= NOW() - INTERVAL 10 MINUTE
    GROUP BY ip_address
    HAVING click_count >= 5
");
$stmt->execute();
$repeated_ips = $stmt->fetchAll();

if (count($repeated_ips) > 0) {
    $cpm *= 0.92;
} else {
    /**
     * Here, I check for consecutive clicks from the same country
     * This is in the third condition
     * ...
     **/
}
  1. 檢查來自同一國家/地區的連續點擊 在這裡,我應用第三個標準,即檢查來自同一國家/地區的連續點擊。
/** 
 * Checking clicks from the same country consecutively
 * If the condition is true, increase the CPM by 2%
 */
$stmt = $pdo->prepare("
    SELECT country_code
    FROM clicks
    ORDER BY timestamp DESC
    LIMIT 10
");
$stmt->execute();
$last_ten_clicks = $stmt->fetchAll(PDO::FETCH_COLUMN);

if (count(array_unique($last_ten_clicks)) === 1) {
    $cpm *= 1.02;
}

第 5 步:更新每千次曝光費用

對於這一部分,我更新發布商的 CPM 並用它來計算他針對該特定點擊的收入。

結果

透過實施此解決方案,廣告網路現在可以根據使用者的點擊資料動態調整 CPM。這確保了發布商的公平和優化的收入模式,提高了廣告網路的整體效率。

關於我以及為什麼選擇 HNG 實習?

我是 Kingsley Gbutemu Kefas,一位熱衷於建立可擴展且高效系統的後端開發人員。我是一個問題解決者,我喜歡學習新事物和做事的方法。身為開發人員,我的動力來自於解決挑戰,尤其是那些讓我批判性思考的複雜挑戰。我知道 HNG 實習對我來說是一個透過從事實際專案並向行業專家學習來成長為開發人員的機會。我很高興能夠開始 HNG 實習之旅並為技術社群做出貢獻。我相信這趟旅程將提高我的技能並為有影響力的專案做出貢獻,我相信我將從 HNG Premium 的好處中受益更多。

版本聲明 本文轉載於:https://dev.to/cyberking99/solving-a-challenging-backend-problem-with-php-h0l?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    URL 的PHP 驗證/正規表示式如果您需要一個簡單的方法來驗證PHP 中的URL,您可以使用filter_var() 函數。這個多功能函數可以確定給定的字串是否符合有效的URL: ]預設情況下,filter_var() 採用基本的URL 過濾機制,可能不適合更複雜的驗證要求。如果您發現自己處於這種...
    程式設計 發佈於2024-12-21
  • C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    實例化物件:有或沒有New在C中建立物件時,程式設計師可以使用「new」運算子或直接實例化它們沒有它。雖然這兩種方法都創建對象,但它們在幾個關鍵方面有所不同。 不帶 New實例化一個不帶「new」的物件會直接在目前作用域中為其保留記憶體。這通常在堆疊上完成,並產生具有自動生命週期的物件。物件在其定義...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    「每個引號前都有斜線」Enigma您在PHP 腳本中遇到了一個特殊問題:每當表單提交給自身時對於包含雙引號的值,它會在每個值之前加上一個反斜線。此行為歸因於 PHP 臭名昭著的「魔術引號」功能。 魔術引號會自動轉義某些字元(包括雙引號),以防止惡意注入。雖然這看起來像是一種安全措施,但它也可能導致與...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中以字元數組形式存取原始向量資料?
    如何在 C++ 中以字元數組形式存取原始向量資料?
    以 Char 陣列形式存取原始向量資料考慮需要在函數中使用 std::vector 作為 char 陣列需要一個空指標。最初,使用常規字元數組很簡單。然而,切換到 std::vector 的靈活性在存取其原始資料方面提出了挑戰。 將向量指標傳遞給函數立即嘗試將向量&something 或其迭代器&s...
    程式設計 發佈於2024-12-21
  • MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    了解MySQL 設定檔部分MySQL 設定檔(my.ini) 提供多個部分,每個部分針對MySQL 操作的特定方面進行客製化。讓我們深入研究這些部分並闡明「init_connect」和「init-connect」之間的差異:my.ini 文件的可選部分: [mysql]:設定mysql命令列客戶端,...
    程式設計 發佈於2024-12-21
  • 為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    在C 向量中使用迭代器:已解決的常見陷阱迭代器對於遍歷和操作C 向量中的元素至關重要。然而,如果使用不當,它們可能會導致意想不到的結果。在本文中,我們將探討向量運算中迭代器的常見問題,並提供解決方案來解決這個問題。 在提供的程式碼片段中,嘗試計算儲存在向量中的點之間的距離。由於迭代器的使用不正確,預...
    程式設計 發佈於2024-12-21
  • IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    何時為空參數拋出IllegalArgumentException 或NullPointerException定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentException 的困境或定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentEx...
    程式設計 發佈於2024-12-21
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21
  • 如何從 Python 3 的 `map()` 迭代器取得列表?
    如何從 Python 3 的 `map()` 迭代器取得列表?
    在Python 3.x 中檢索映射列表:map() 作為迭代器在Python 3.x 中,map()函數傳回一個迭代器而不是列表。實施此更改是為了提高記憶體效率並優化效能。但是,如果您需要將映射值作為清單檢索以進行進一步處理,則會帶來挑戰。 解決方案:將迭代器轉換為列表要檢索映射值作為列表,使用li...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21
  • 為什麼我的子選擇器無法設定表格儲存格的樣式?
    為什麼我的子選擇器無法設定表格儲存格的樣式?
    表結構中的子選擇器與後代選擇器在HTML 文件中選擇元素時,開發者經常使用子選擇器(>) 來定位指示子層級和後代選擇器以任何巢狀元素為目標。但是,在某些情況下,子選擇器似乎會意外失敗。 考慮以下範例:table tr td { background-color: red; } table >...
    程式設計 發佈於2024-12-21
  • 想學習 Node.js?對於初學者來說最好的資源是什麼?
    想學習 Node.js?對於初學者來說最好的資源是什麼?
    踏上Node.js 之旅:初學者綜合指南 踏上Node.js 之旅:初學者綜合指南Node.js 已成為世界上一股強大的力量Web 開發,但開始使用這個尖端平台可能會令人畏懼。本文旨在透過提供全面的指南來幫助您踏上 Node.js 之旅來應對這項挑戰。 官方資源與替代選項雖然官方資源Node.js...
    程式設計 發佈於2024-12-21
  • 為什麼 GCC 無法在非命名空間範圍內編譯顯式專業化?
    為什麼 GCC 無法在非命名空間範圍內編譯顯式專業化?
    非命名空間範圍中的顯式專業化儘管在Clang 中編譯成功,但給定的程式碼無法在GCC 中編譯。根據 C 標準 ([temp.expl.spec]),可以在可以定義對應主模板的任何作用域中聲音明​​顯式特化。 此行為似乎是 GCC 中的一個錯誤。根據 CWG 727,[temp.expl.spec] ...
    程式設計 發佈於2024-12-21
  • !和 ?在打字稿中。
    !和 ?在打字稿中。
    有沒有想過那些神秘的符號是什麼!和 ?在 TypeScript 中做些什麼? ?它們可能很小,但威力很大! 以下是使用它們的方式和原因。 ? - 可選修飾符 使用?將屬性或參數標記為可選。它告訴 TypeScript,「嘿,這個欄位可能未定義。」 interface User { ...
    程式設計 發佈於2024-12-21
  • 什麼是多態性?探索 Java 中的型別-物件關係
    什麼是多態性?探索 Java 中的型別-物件關係
    在學習Java的時候,遇到了多態的概念。我傾向於在深入實際使用之前掌握基本原理,因此我在這裡記錄了我的解釋。 我見過的多態性的常見解釋 多態的本義是「多元」。然而,在本文的上下文中,它指的是變數能夠保存不同類型的對象,只要透過類別繼承或介面實現存在關係,而不會導致錯誤。 ...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3