1

嗨,我在这个网站上搜索了很多以寻求帮助,但我搜索的越多,我就越困惑。

我有一个表比赛,其中有字段ID(主键)Player * TeamName *(一个团队中的 3 名球员)和Score(球员)

      competition                     TeamCompetition

Player : TeamName : Score       :  TeamName  :  TeamScore
------ : -------- : -----       :  ----------------------
 Tom   :   team1  :   50        :   team1    :  50+66+35=151
Brian  :   team1  :   66        :   team2    :  54+85+...etc
 Tim   :   team1  :   35        :   
Calvin :   team2  :   54        :
Jerry  :   team2  :   85        :

等等

我已经设法在 SQL 中进行 SUM 如下所示:

$result1 = mysql_query("SELECT SUM(Score) AS team1 FROM competition WHERE TeamName='team1' ");

我试图将该变量 $team1 保存到名为 TeamCompetition 的新表中,其中一个团队的总和被保存为一个带有团队名称的数字

$row1= mysql_fetch_array($result1);

$team1= $row1['team1'];

$sql1=("INSERT INTO TeamCompetition (TeamScore)
        VALUES '$_POST[team1]' 
        WHERE TeamName='team1' ");

但这不起作用,任何人都可以建议我如何处理这段代码,或者是否有另一种更优雅的方法来解决它?如果我在没有 $sql1 的情况下回显它,它会显示结果为什么我不能保存它...?

4

2 回答 2

3

SQL 语法问题的基本解决方案是:

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('".$_POST[team1]."','team1'");

由于数据库中当前没有包含团队名称的行,因此您应该创建它。另外,请注意 $_POST 是一个数组,在评估脚本中处理得不好。

但是,我假设您想在获得分数时对其进行更新:

$sql1=("UPDATE TeamCompetition set TeamScore = '".$_POST[team1]."'
    WHERE TeamName = 'team1'");

但是 MySQL 中有一个巧妙的技巧,即INSERT.... ON DUPLICATE KEY UPDATE功能:

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('$_POST[team1]','team1'
    ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );

然而,有一件事我不能接受:这段代码散发着 SQL 注入的味道

  • 要么使用PDO(通常是最佳解决方案)
  • 和/或不要使用任何来自不受信任的数据,或者在没有验证和正确处理的情况下容易操纵来源的任何数据(更糟糕的解决方案,但总比没有好)

可以使用mysql_real_escape_string对这段代码进行最省力的保护(只要这些函数仍然受支持,令人敬畏的 NullPointer 指出),但是,这整件事将被弃用,所以它不应该用于新的开发:

$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES ('".mysql_real_escape_string($_POST[team1])."','team1'
    ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );

因此,如果您必须修补旧代码,并且将保持这种状态,您可以决定使用它,但只有在评估使用 PDO 的可能性之后!如果使用 PDO 的可能性很小,那么这就是要走的路(由 PHP PDO 文档提供):

<?php
try {
    //open connection, this is different than in the old functions
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

    //***running query
    //**step1: create statement
    $stmt = $dbh->prepare("INSERT INTO TeamCompetition (TeamScore, TeamName)
    VALUES (:teamScore,:teamName)
    ON DUPLICATE KEY UPDATE TeamScore = :teamScore "); //notice parameters prefixed with ':'

    //**step2: bind values
    $stmt->bindValue(':teamScore', $_POST[team1]);
    $stmt->bindValue(':teamName', 'team1');

    //**step3: exexcute statement
    $stmt->execute();

    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?> 
于 2013-02-22T11:10:31.257 回答
3

您可以一口气完成所有操作。根本不需要通过 PHP 传递信息。

INSERT INTO TeamCompetition (TeamName, TeamScore) VALUES (SELECT TeamName, SUM(Score) FROM competition GROUP BY TeamName)

您需要验证输入,并且您的代码可用于sql 注入检查如何防止 PHP 中的 SQL 注入?

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。改为了解准备好的语句,并使用PDOMySQLi

于 2013-02-22T11:11:24.767 回答