【问题标题】:SQL-PHP Grabbing information from end of URL and compare with row in databaseSQL-PHP 从 URL 末尾获取信息并与数据库中的行进行比较
【发布时间】:2014-09-12 17:15:26
【问题描述】:

好的,所以这使用了两件事,一个是带有 Steam 插件的 vbulletins 论坛,它允许用户使用 Steam 帐户在我的论坛上注册,它还使用来自 http://7daystodie-servers.com 网站的 API,这是一个具有 API 的投票网站我可以以一种或另一种方式用作奖励系统。到目前为止,我所做的一切都很好,我现在唯一的问题是使用正确的信息更新 vbulletin 数据库,如果 $pullinfo == 1,这是我的代码。

$connection = mysql_connect("$hostname","$data_username","$data_password") or die ("Couldn't connect to server.");
$db = mysql_select_db("$db_name", $connection) or die("Couldn't select database.");
$sql1 = mysql_query("SELECT DISTINCT steam_link, username FROM user WHERE steam_link IS NOT NULL AND TRIM(steam_link) <> '' AND username IS NOT NULL AND TRIM(username) <> ''");

while($row1 = mysql_fetch_array($sql1)){
    $steamid = substr($row1[steam_link], 0, 17);
    $checkvoted = 'http://7daystodie-servers.com/api/?object=votes&element=claim&key=wc5ablok4zpc1w3ljgofp5yuuedrgv8ycs6&steamid='.$steamid;
    $pullinfo = file_get_contents($checkvoted);
    if ($pullinfo == 2){
        echo ''.$row1[username].' has already claimed reward for voting...<br />';
    }
    if ($pullinfo == 1){
        $username = $row1[username];
        echo ''.$row1[username].' has not claimed reward for voting...<br />';
        $sql2 = mysql_query("UPDATE user SET `reputation`=(`reputation`+10) WHERE substr($row[steam_link], 0, 17) = $steamid");
    }
    if ($pullinfo == 0){
        echo ''.$row1[username].' has not voted...<br />';
    }
    echo ''.$row1[username].''.$pullinfo.'<br />';
}

正如你所看到的,它做了两件事,一是从 API url 获取信息,它是“0”或“1”,然后我试图根据一个因素更新数据库信息,$row[steam_link ] 和 $steamid。我遇到的问题是这两个都是从一开始就从数据库中提取出来的,它们是同一回事。那么如何将 API 的返回与 $steamid 进行比较,以便更新数据库?

【问题讨论】:

  • mysql_* 函数不再支持,它们是 officially deprecated不再维护,将在未来。您应该使用PDOMySQLi 更新您的代码,以确保您的项目在未来的功能。
  • 了解它们已被弃用,但我没有时间研究任何 PDO 或 mysqli 以了解是什么所以真的需要一些帮助,所以我有它临时住,直到我可以用 PDO 编写或 MySQLi
  • 我看到mysql和mysqli的唯一区别是“i”。虽然我还没有机会阅读它的技术方面.. 只需添加 i
  • @EricSSH 如果我没记错的话 MySQLi 使用起来更安全,可以保护自己免受注射等事情的伤害,但如果我没记错的话,它只是更好的代码,我代表“改进”所以我猜没有当他们有改进的东西时,想使用旧的 MySQL,我只需要检查所有已更改的内容。但无论我是否使用 MySQLi,我仍然需要帮助解决我的问题,因为无论我使用 MySQL 还是 MySQLi,我仍然会遇到同样的问题。
  • $pullinfo = file_get_contents($checkvoted); if ($pullinfo == 2){ 在做什么?

标签: php mysql sql api substr


【解决方案1】:

您的 UPDATE 语句需要确定要更新哪些行。

SELECT 语句提取了steam_linkusername 列,这些列似乎是您要在UPDATE 语句的谓词中引用的列。

由于原始 SELECT 有一个 DISTINCT 关键字,并且查询来自 user 表,我们假设表中可能有多个行具有相同的 usernamesteam_link,并且我们可能只想要将声誉添加到这些行之一。

$sql = "UPDATE user u
           SET u.reputation = u.reputation + 10
         WHERE u.steam_link = '" . mysql_real_escape_string( $row1['steam_link'] ) . "'
           AND u.username   = '" . mysql_real_escape_string( $row1['username'] ) . "'
         LIMIT 1"; 
if(!mysql_query($sql)) {
    echo "error: " . mysql_error();
}

但是,我只是在猜测user 表中您要更新哪些行、查询拉出的具有usernamesteamlink 匹配值的所有行,或者具有匹配项的所有行username,或与 steam_link 匹配的所有行。 (我只是猜测。)


您现有的代码引用了$row;我们看到$row1 被赋值,但我们没有看到对$row 的任何赋值。

我看到看起来像数组引用$row1[username],但字符串键通常用单引号括起来,例如$row1['username'].


跟进

如果我们想要匹配具有以特定字符集开头的steam_link 列的行,例如,17 个特定数字字符79546325458103548,我们可以在谓词中使用LIKE 比较运算符(即, WHERE 子句中的一个条件:

AND u.steam_link LIKE '79 5463 25458103548%' 

请注意,末尾的 '%' 字符是一个特殊的通配符(在 LIKE 比较右侧的上下文中)。这将匹配任意数量的字符(零个、一个或多个)

如果我们想要一个更具体的匹配,17 个特定数字,后跟一个字符,即“0”或“1”数字字符,我们可以使用正则表达式比较:

AND u.steam_link REGEXP '^79546325458103548[10]$`

作为另一种选择,我们还可以在 steam_link 列周围使用 SUBSTRING 函数,但我们通常会尽量避免这样做,我们更愿意尽可能使用与裸列的比较。

还有许多其他替代方法可以完成与上述表达式相同的事情。如果我们想和上面的 REGEXP 做同样的事情,我们可以做一些过度混淆和乏味的事情:

AND SUBSTRING(u.steam_link,1,2) = '79'
AND SUBSTRING(u.steam_link,3,4) = '5463'
AND SUBSTRING(u.steam_link,7,9) = '254581035'
AND SUBSTRING(u.steam_link,16,3) IN ('480','481')

如果我们只想匹配 steam_link 的第 18 个字符:

AND SUBSTRING(u.steam_link,18,1) = '0'

仍然不清楚(对我来说)您要更新哪些行。但也许这可以帮助您了解一些可能的想法。

【讨论】:

  • 是的,我的 php sql 非常毛孔。发生的事情之一是 steam_link 行包含类似 79546325458103548|0|1 的数据,我不得不在数组中使用 substr($row1[steam_link], 0, 17) 从数据库中提取所有用户并传递给 url读取 79546325458103548,现在 API 只回复值 0、1 或 2,所以我需要根据我从数据库中提取数据的原因更新数据库,因为 79546325458103548 将不再匹配数据库值79546325458103548|0|1,API 只返回 0、1 或 2,所以我不知道该怎么做。
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多