”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 我如何使用 PHP 和 MySQL 解决具有挑战性的后端问题

我如何使用 PHP 和 MySQL 解决具有挑战性的后端问题

发布于2024-07-31
浏览:687

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]删除
最新教程 更多>
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-03-25
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-03-25
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-03-25
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-25
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-03-25
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-03-25
  • Numpy的矢量函数如何有效地证明数组的合理性?
    Numpy的矢量函数如何有效地证明数组的合理性?
    使用向量函数 Numpy提供使用矢量化函数的数组合理的方法,提供改进的性能和代码简单性,与传统的python循环相比,提供了改进的性能和代码简单性。在保持其形状的同时,左,右,向上或向下的非零元素。以下numpy实现执行有效的理由: = a [mask] 别的: out.t ...
    编程 发布于2025-03-25
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-03-25
  • 如何基于唯一的电子邮件值合并和重塑对象数组?
    如何基于唯一的电子邮件值合并和重塑对象数组?
    在数据操作领域中合并和将对象的数组与唯一的电子邮件值 考虑需要合并两个对象阵列,每个对象都包含电子邮件属性。目标是创建一个包含所有唯一电子邮件值的新数组。 , (对象)[“电子邮件” =>“ [电子邮件  prected]”], (对象)[“电子邮件” =>“ wefe...
    编程 发布于2025-03-25
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-03-25
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-25
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-03-25
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-03-25
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-25
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-03-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3